主要有以下几道练习题,使用C语言实现它们。
1. 计算 n的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
6.设计一个猜数字游戏。
要求:
随机产生一个1-100的数字,然后你来猜。
a.猜对了:恭喜你!
b.猜错了,告诉你猜大了还是猜小了,继续猜。
c.玩完一把可以选择继续游戏,直到退出游戏。
提示:以下是本篇文章正文内容,下面案例可供参考
//1.输入一个数,计算其阶乘
int main()
{
int n = 0;
int i = 0;
int val = 1;
scanf("%d",&n);
for (i = n; i > 0; i--)
{
val *= i;
}
printf("%d\n",val);
}
代码如下(示例):
//2.计算1!+2!+...+10!
//方法一:两层循环
int main()
{
int i = 0;
int j = 0;
int val = 1;
int sum = 0;
for (j = 1; j < 11; j++)
{
for (i = j; i > 0; i--)
{
val *= i;
}
sum += val;
val = 1;//注意这里需要对val初始化,否则将在小循环中继续使用上一次的阶乘值,导致结果不对
}
printf("%d\n", sum);
}
//2.计算1!+2!+...+10!
//方法二:一层循环
int main()
{
int j = 0;
int val = 1;
int sum = 0;
for (j = 1; j < 11; j++)
{
val *= j;
sum += val;
}
printf("%d\n", sum);
}
3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)
二分法查找(折半算法)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 0;
int len = sizeof(arr)/sizeof(arr[0]);//数组长度/数组内一个元素长度=数组元素个数
int left = 0;
int right = len - 1;
printf("请输入您要查找的数字:");
scanf("%d", &key);
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
printf("找到了,这个数字的下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("没有这个数字!查找失败!");
}
return 0;
}
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1) - 1;
printf("%s\n", arr2);
//while循环实现
while (left <= right)
{
Sleep(200);//延迟函数,在windows.h中。单位毫秒。
arr2[left] = arr1[left];
arr2[right] = arr1[right];
system("cls");
left++;
right--;
printf("%s\n", arr2);
}
//for循环实现
for (left = 0, right = strlen(arr1) - 1;
left <= right;
left++, right--)
{
Sleep(200);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
}
return 0;
}
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。
(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
int main()
{
int i = 0;
char password[20] = " ";
for (i = 0; i < 3; i++)
{
printf("请输入密码:>>");
scanf("%s", password);//数组名本身就是地址,因此此处输入时不需要取地址符号
if ((strcmp(password, "123456")) == 0)
//strcmp()函数,比较两个字符串是否相等,如果相等则返回0
{
printf("密码正确!登录成功!\n");
break;
}
else
{
printf("密码错误,请重新输入!\n");
}
}
if (3 == i)
{
printf("三次密码输入错误,退出程序!");
}
return 0;
}
注意:对比两个字符串是否相同,千万不可直接比较,比如此代码中:if(password == “123456”)这种表示方法是错误的!!!
必须使用strcmp()函数来比较。
//6.猜数字游戏:
// 随机产生一个1-100的数字,然后你来猜
// a.猜对了:恭喜你!
// b.猜错了,告诉你猜大了还是猜小了,继续猜。
// c.玩完一把可以选择继续游戏,直到退出游戏。
void menu()
{
printf("**********WELCOME!!!***********\n");
printf("*******************************\n");
printf("***********1.play**************\n");
printf("***********0.exit**************\n");
printf("*******************************\n");
}
void game()
{
int randNum = rand() % 100 + 1;
//rand()函数返回一个0-32767之间的随机数字。
//取模100就生成了0-99之间的数字,再+1就是0-100的随机数。
printf("随机数字已生成,请输入你的猜想:");
int myNum = 0;
while (myNum != randNum)
{
scanf("%d", &myNum);
if (myNum > randNum)
{
printf("猜大了!!!重新猜吧\n");
}
else if(myNum < randNum)
{
printf("猜小了!!!重新猜吧\n");
}
}
printf("恭喜你!猜对了!\n");
printf("正确答案就是:%d\n",randNum);
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
//因为rand()函数需要srand()给它一个随机数种子,才能每次运行程序生成不一样的随机数。
//此处如果设置为一个固定的数比如srand(100),则生成的随机数永远相同。
//为了给出一个随机数种子,我们使用时间戳,即time()函数(在time.h文件中),该函数返回当前时间戳转换成的一个数字,随着时间不同,该数值一直变化。
do
{
menu();
printf("是否开始游戏>>>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏退出");
break;
}
} while (input);
}
注意:
1.rand()函数返回一个0-32767之间的随机数字。取模100就生成了0-99之间的数字,再+1就是0-100的随机数。
2.因为rand()函数需要srand()给它一个随机数种子,才能每次运行程序生成不一样的随机数。
此处如果设置为一个固定的数比如srand(100),则生成的随机数永远相同。
为了给出一个随机数种子,我们使用时间戳,即time()函数(在time.h文件中),该函数返回当前时间戳转换成的一个数字,随着时间不同,该数值一直变化。