1.整数の階乗を計算する。
#include<stdio.h>
int main()
{
int i =1;
int n=0;
int ret=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
ret=ret*i;
}
printf("%d",ret);
return 0;
}
2.1!+2!+3!+4!+5!+6!+...+10!の和を求める。
#include<stdio.h>
int main()
{
int i =1;
int n=0;
int j=1;
for(j=1;j<=10;j++)
{
int ret=1;
for(i=1;i<=j;i++)
{
ret=ret*i;
}
n=n+ret;
}
printf("%d",n);
return 0;
}
以下のようにより効率的な実装も可能である。
#include<stdio.h>
int main()
{
int n=0;
int j=1;
int ret=1;
for(j=1;j<=10;j++)
{
ret=ret*j;
n=n+ret;
}
printf("%d",n);
return 0;
}
3.整列済み配列から特定の数値を検索する。
まず線形探索による実装を示す。
#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int j=5;
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<=sz;i++)
{
if(arr[i]==j)
{
printf("インデックス:%d",i);
break;
}
if(i==sz)
{
printf("対象が見つかりません");
}
}
return 0;
}
次に二分探索を用いる実装を示す。計算量はO(log n)である。
#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int j=7;
int sz=sizeof(arr)/sizeof(arr[0]);
int left=0;
int right=sz-1;
while(left<=right)
{
int mid=(left+right)/2;
if (arr[mid]<j)
{
left=mid+1;
}
else if(arr[mid]>j)
{
right=mid-1;
}
else
{
printf("インデックス:%d",mid);
break;
}
}
if(right<left)
{
printf("見つかりません");
}
return 0;
}
4.文字列の両端から中央に向かって文字が徐々に移動し、最終的に出会うアニメーションを表示するプログラムを作成する。
#include<stdio.h>
#include<windows.h>
int main()
{
char arr1[]="hello world!!!";
char arr2[]="##############";
int sz=strlen(arr1);
int left=0;
int right=sz-1;
while(left<=right)
{
arr2[left]=arr1[left];
arr2[right]=arr1[right];
printf("%s\n",arr2);
Sleep(1000);
left++;
right--;
}
return 0;
}
実行結果:
h############!
he##########!!
hel########!!!
hell######d!!!
hello####ld!!!
hello ##rld!!!
hello world!!!
5.ログインシステムを模擬的に実装する。パスワード入力は3回まで許可され、正解するとログイン成功、三回失敗するとプログラムを終了する。
#include<stdio.h>
#include<string.h>
int main()
{
char password[20]={0};
int i=0;
for(i=0;i<3;i++)
{
printf("パスワードを入力してください:");
scanf("%s",password);
if(strcmp(password,"abcdef")==0)
{
printf("ログイン成功\n");
break;
}
else
{
printf("パスワードが正しくありません\n");
}
}
if(i==3)
{
printf("3回パスワードを間違えたため、プログラムを終了します\n");
}
return 0;
}
実行例:
abcdef
パスワードを入力してください:ログイン成功