C语言的一些简单练习题

简单练习题

1.获得4个最大数,请帮他编程找到最大的数。

输入描述:
一行,4个整数,用空格分开。
输出描述:
一行,一个整数,为输入的4个整数中最大的整数。

#include int main()
{int arr[4] = {0};int i = 0;for(i=0; i<4; i++){scanf("%d", &arr[i]);}//假设int max = arr[0];for(i=1; i<4; i++){if(arr[i]> max){max = arr[i];}}printf("%d\n", max);return 0;
}

首先,思路就是定义一个长度为4的数组用于存放输入的值,用一个for循环来实现输入按顺序存放到数组中,后我们假设最大值是max,把数组中第一个值给max,之后用for循环比较后三个和第一个值也就是max的大小,如果比max大,就把后面的值赋予给max,最后打印max即可。

我们在第二个for循环中其实也可以用三目运算符,来把大的值赋予给max。
先简单介绍一下三目运算符:
三目运算符(也称为条件运算符)是一个用来简化条件语句的运算符。它的语法形式如下:

条件表达式 ? 表达式1 : 表达式2;

这个运算符由三个部分组成,其中条件表达式可以是任何返回一个布尔值(非零即真)的表达式。如果条件为真,则执行表达式1并返回其值作为整个表达式的结果;如果条件为假,则执行表达式2并返回其值作为整个表达式的结果。

接下来我们用三目运算符来把大的值赋予给max

#include int main()
{int arr[4] = { 0 };for (int i = 0; i < 4; i++){scanf("%d", &arr[i]);}//假设int max = arr[0];for (int i = 1; i < 4; i++){max = (max > arr[i]) ? max : arr[i];}printf("%d\n", max);return 0;
}

这样只需要每次用三目运算符和后三个值比较即可;简化了代码,看起来更简洁。
两次运行结果是一致的:
在这里插入图片描述

2.分数求和

计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果。

法一:

#include
int main()
{int i = 1;int j = 2;double sum1 = 0.0;double sum2 = 0.0;while (i <= 100){sum1 = 1.0 / i + sum1;i = i + 2;}while (j <= 100){sum2 = 1.0 / j + sum2;j = j + 2;}printf("%lf", sum1 - sum2);return 0;
}

在这里我们可以看出来分母为奇数项时,都是加在一起,偶数项时,都是减在一起。
那首先第一种最简单的思路就是把奇数项和偶数项分开后加在一起,最后用奇数项的和减去偶数项的和,思路是最容易想到的。

法二:

#include
int main()
{int i = 0;double sum = 0.0;int flag = 1;for (i = 1; i <= 100; i++){sum = flag * 1.0 / i + sum;flag = -flag;}printf("%lf", sum);return 0;
}

第二种思路就是我们可以设置一个flag来调整奇数项和偶数项的正负号;那么我们只需要第一次设置的flag是1,再每次循环中求完和后让flag乘上一个-1即可控制奇数项和偶数项。
两种方式的运行结果都是一致的
在这里插入图片描述

3.打印乘法口诀表

首先我们先来打印最简单的九九乘法表

#include
int main()
{int i = 0;int j = 0;for (i = 1; i <= 9; i++){for (j = 1; j <= i; j++){printf("%d*%d=%2d\t", i, j, i * j);}printf("\n");}

就是一个很简单的for循环嵌套就完毕了。
在这里插入图片描述
那么我们来尝试一下输入一个数字任意打印这个乘法口诀表,并且让他稍作停留后进行清屏

#include
#include //Sleep函数引入的头文件
#include 
//system函数是标准库stdlib.h中的一个函数,用于执行操作系统命令。因此,要使用system函数,只需在代码中包含stdlib.h头文件即可。但是,system("cls")命令是Windows系统特定的清屏命令,所以在非Windows系统上,该命令可能不起作用。请注意,在使用system函数时要小心,因为它会调用操作系统的命令,可能会有一些安全风险。
void print(int n)
{int i = 0;int j = 0;// 使用两层循环打印乘法口诀表for (i = 1; i <= n; i++){for (j = 1; j <= i; j++){// 打印乘法表达式(i*j),并保持对齐printf("%d*%d=%2d\t", i, j, i * j);}printf("\n");// 换行}}
int main()
{int n = 0;do{// 提示用户输入一个数字printf("输入一个数字打印乘法口诀表(输入0程序结束):");scanf("%d", &n);// 调用print()函数打印乘法表print(n);if (n != 0){Sleep(3000);// 程序暂停3秒system("cls");// 清屏命令,用于清除上一次打印的乘法表}else{printf("程序结束");}} while (n);// 当n不等于0时,循环继续,n=0时,条件为假,退出循环,程序结束return 0;
}

那么我们在改进的代码中实现了输入一个数字自定义打印乘法口诀表,并且该乘法口诀表停留了3s就进行清屏,继续进行操作。
在这里不想自动清屏的小伙伴可以尝试在do while循环中在嵌套一个循环、分支来就行选择性清屏,感兴趣的小伙伴可以尝试尝试噢。

4.查找

问题描述:在一段序列中查找到输入的数字,打印其下标

#include
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;printf("输入你想查找的数值");scanf("%d", &k);//7//遍历int i = 0;int flag = 0;for (i = 0; i < 10; i++){if (arr[i] == k){printf("找到了,下标是:%d\n", i);flag = 1;break;}}if (flag == 0)printf("找不到\n");return 0;
}

我们使用一个for循环去直接把序列中遍历一遍,找到了就把它打印出来,就很简单的解决了这个问题

但是如果是很长的一段有序序列中呢,这样的写法就有些没那么好用,在这里我们使用二分查找

#include // 查找给定的数值 x 在数组 arr 中的下标
void find(int x, int arr[], int length)
{int left = 0;        // 左边界索引int right = length - 1;  // 右边界索引int flag = 0;        // 标记是否找到while (left <= right){int mid = (right - left) / 2 + left;  // 中间索引if (x > arr[mid])  // 如果 x 大于中间值,向右边查找{left = mid + 1;}else if (x < arr[mid])  // 如果 x 小于中间值,向左边查找{right = mid - 1;}else  // 找到了 x{printf("找到了,%d的下标是%d\n", x, mid);flag = 1;break;}}// 如果没有找到 xif (x != 0 && flag == 0){printf("找不到该下标\n");}// 如果输入的是 0,表示退出程序if (x == 0 && flag == 0){printf("退出程序");}
}int main()
{int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  // 给定的数组int k = 0;  // 输入的数值int length = sizeof(arr) / sizeof(arr[0]);  // 数组的长度do{scanf("%d", &k);  // 读取输入的数值find(k, arr, length);  // 调用 find 函数进行查找} while (k);  // 如果输入为 0,退出程序return 0;
}

这样的道理就类似于路人甲买了一双鞋是500块以内,让路人乙来猜,路人甲给提示高了还是低了,路人乙猜250块,甲回答低了,那么范围就从0到500变成了250到500,以此类推,这样效率会比从1猜到500高得多。
这样的代码我们可以实现多组输入来查找数值,将寻找的过程封装到find函数中不断去调用就可以了。

5.猜数字游戏

通过上面的二分查找,我们可以来实现一个简单的猜数字游戏
接下来,我们来实现代码

#include 
#include  // 包含rand()和srand()函数所需的头文件
#include  // 包含time()函数所需的头文件void game()
{srand((unsigned int)time(NULL)); // 设置随机数种子,确保每次运行生成不同的随机数序列int ret = rand() % 500 + 1; // 生成0到500之间的随机数int guess = 0;printf("输入你猜想的数字: ");while (1){scanf("%d", &guess);if (guess > ret){printf("猜大了\n");}else if (guess < ret){printf("猜小了\n");}else{printf("猜对了,该数字是%d\n", guess);break;}}printf("继续玩扣1,不想玩了扣0\n");
}void menu()
{printf("\t********猜数字********\t\t\n");printf("\t**********************\t\t\n");printf("\t********1.Play********\t\t\n");printf("\t********0.Exit********\t\t\n");printf("\t**********************\t\t\n");
}int main()
{int input = 0;menu();srand((unsigned int)time(NULL)); // 设置随机数种子do{scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("The game is out\n");break;default:printf("Resume load\n");}} while (input);return 0;
}

这样我们就实现了一个猜0到500数字的非常简单的小游戏。感兴趣的小伙伴们可以根据自己的需求进行改进尝试噢。

6.模拟用户登录

编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
//设置密码为"123456"
接下来,我们来实现代码

#include
#includeint main()
{int i = 0;  // 用于记录密码尝试的次数的计数器char password[20] = { 0 };  // 存储输入的密码的字符数组while (i < 3)  // 最多尝试三次密码{printf("输入密码->:\n");  // 提示用户输入密码scanf("%s", password);  // 从用户输入中读取密码并存储在 password 数组中if (strcmp(password, "123456") == 0)  // 将用户输入的密码与预设密码进行比较{printf("登陆成功\n");  // 如果密码正确,输出登录成功的消息break;  // 跳出循环,结束登录验证}else{printf("密码错误\n");  // 如果密码错误,输出密码错误的消息}i++;  // 增加密码尝试的次数计数器}if (i == 3)  // 如果已经尝试了三次密码{printf("三次密码均输入错误,退出登录\n");  // 输出密码尝试次数超过限制的消息}return 0;
}

首先我们需要来设置一个字符串型的数组用来接收密码,然后输入密码,进行判断是否正确,循环3次,均失败后退出登录。

在这里我们用到了strcmp()函数,给大家 稍微介绍一下这个函数
strcmp() 函数用于比较两个字符串。它是 C 标准库中的一个字符串函数,位于 头文件中。

函数原型如下所示:

int strcmp(const char *str1, const char *str2);

该函数接受两个字符串作为参数 str1 和 str2,并返回一个整数值。

strcmp() 函数的返回值有以下三种可能的情况:

如果 str1 和 str2 字符串相等,则返回值为 0。
如果 str1 字符串小于 str2 字符串,则返回值为负数。
如果 str1 字符串大于 str2 字符串,则返回值为正数。

7.编写代码,演示多个字符从两端移动,向中间汇聚

我们就以:”Long live the People’s Republic of China!“字符来实现这个程序

#include
#include
#include
int main()
{char arr1[] = "Long live the People’s Republic of China!";char arr2[] = "                                          ";int left = 0;int right = strlen(arr1) - 1;  // 修正:使用 arr1 的长度来初始化 rightwhile (left <= right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n", arr2);Sleep(500);system("cls");left++;right--;}printf("%s", arr2);return 0;
}

首先,我们需要设置两个字符型数字,一个用来存放Long live the People’s Republic of China!,另一个存放空格用来显示推进过程,小伙伴们也可以用其他符号来代替,然后我们设置一个循环,把第一个数组的最左侧字符赋予给第二个数组的最右侧,最右侧数组同样赋予给第二个数组的最右侧,之后打印出来第二个数组,后停留半秒,进行承平操作,同时把最左测设置为自增,最右侧设置为自减,就实现了这样的循环,最后把整个字符串打印出来就完成了代码要求。

以上就是个人拙见,有不同看法欢迎小伙伴们留言


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部