磻磻嗨嗨嗨!各位小伙伴们,我依旧是你们熟悉的那个……额,理想很远大,自己却很平凡,但一直努力的小白啦嵐。
那么最近呢,一直在不断更新C语言的知识点,那么大概在七月二十日左右,应该就会陆续更新 java部分的知识点啦,毕竟C知识入门语言,把根基打牢,才能盖出属于自己的大楼蘭!!
正文开始:好了,回归正题,今天要更新的就是一些我在C语言的学习过程的部分经典习题分享,还希望看完的小伙伴们一键三连,谢谢啦 丹!
目录
一、经典垃圾代码
二 、虾仁猪心
三、X形图案
四、获得月份天数
五、逆序输出一个字符串的内容
六、计算求和
七、打印菱形
一、经典垃圾代码
首先先看一个经典的例子:
#includeint main() { int i = 1; int ret = (++i)+(++i)+(++i); printf("ret = %dn", ret); return 0; }
代码解读:
表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径
所以这个表达式可能因为计算顺序的差异导致结果是不一致的,所以表达式是错误的表达式。
可以在VS和Linux gcc测试,结果是有差异的!!
二 、虾仁猪心
这道题也是非常坑的一道题,如果对C语言知识点掌握的不牢靠的话,很容易踩坑:
#include
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">n");
}
else
{
printf("
代码解读:
C语言中,0为假,非0即为真。
全局变量,没有给初始值时,编译其会默认将其初始化为0。
i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A
这道题其实很隐蔽,真是虾仁猪心!!!
三、X形图案
问题描述:
从键盘输入一个整数比如5,6等等。
输出样式:
* *
* *
*
* *
* *
问题分析:我们可以看到输出结果是由一个X形的*组成的图案,我们可以将其想象成一个5*5的矩阵 ,通过两层for循环的方式来控制矩阵的行和列,我们发现当行和列相等的时候都要打印*,那么右斜线就打印好了,左斜线的行+列的和始终等于我们的n-1,OK按照这个思路我们来设计求解方法:
#include
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
for(int i=0; i
四、获得月份天数
问题描述:输入年份和月份,计算这一年这个月有多少天。
问题思路:这一题关键就是这个月份天数我们怎么去实现,尤其是二月份闰年有29天,非闰年有28天,怎么让程序知道这一年是闰年呢(使用if语句来判断),我们可以将每个月的天数放在一个数组里面,然后根据输入是否为闰年,来输出我们的结果:
#include
int fun(int y)
{
return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);
}
int main()
{
int y = 0;
int m = 0;
int d = 0;
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
while (scanf("%d%d", &y, &m) == 2)
{
int d = days[m];
if (fun(y) == 1 && m == 2)
{
d++;
}
printf("%dn", d);
}
return 0;
}
五、逆序输出一个字符串的内容
问题描述:
输入: I am a student
输出:tneduts a ma I
#include
#include
int main()
{
char str1[100];
char str2[100];
int a, i;
gets(str1);
a = strlen(str1);
for (i = 0; i < a; i++)
{
str2[i] = str1[a - 1 - i];
}
str2[i] = 0;
printf("%s", str2);
}
六、计算求和
问题描述:
假设求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222
问题分析:通过给出的问题描述可以发现,需要求和的第i项有i个a,所以可以假设第i项为temp,则第i+1项为temp*10+a;
代码实现:
#include
int main()
{
int a = 0;
int n = 0;
int i = 0;
int sum = 0;
int tmp = 0;
scanf("%d%d", &a, &n);
for(i=0; i
七、打印菱形
问题描述:打印如下图形,这里只是给大家参考一下这个菱形图片并不是要打印这样的菱形,具体输出结果往下翻翻:
#include
int main()
{
char str[] = " "; //定义为空
int i = 0, j = 0;
for (i = (strlen(str) / 2), j = (strlen(str) / 2); i >= 0 && j <= strlen(str); i--, j++)
{
str[i] = '*';
str[j] = '*';
printf("%sn", str);
}
for (i = 0, j = (strlen(str) - 1); i < (strlen(str) / 2) && j >= (strlen(str) / 2); i++, j--)
{
str[i] = ' ';
str[j] = ' ';
printf("%sn", str);
}
}
代码解读:这个方法非常容易理解,我们要打印的是上下对称的菱形,我们可以选择从中间开始打印,第一个for循环我们打印*,第二个for循环我们打印空格:
⛵⛵输出结果:
好啦,今天的习题分享就到这里啦,又看不懂的部分可以及时联系博主或者在下评论,我看到都会第一时间解答哒!谢谢阅读!期待一键三连!!!爐爐
这道题也是非常坑的一道题,如果对C语言知识点掌握的不牢靠的话,很容易踩坑:
代码解读:
C语言中,0为假,非0即为真。
全局变量,没有给初始值时,编译其会默认将其初始化为0。
i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A
这道题其实很隐蔽,真是虾仁猪心!!!
三、X形图案
问题描述:
从键盘输入一个整数比如5,6等等。
输出样式:
* * * * * * * * *
问题分析:我们可以看到输出结果是由一个X形的*组成的图案,我们可以将其想象成一个5*5的矩阵 ,通过两层for循环的方式来控制矩阵的行和列,我们发现当行和列相等的时候都要打印*,那么右斜线就打印好了,左斜线的行+列的和始终等于我们的n-1,OK按照这个思路我们来设计求解方法:
#includeint main() { int n = 0; while(scanf("%d", &n) != EOF) { for(int i=0; i 四、获得月份天数
问题描述:输入年份和月份,计算这一年这个月有多少天。
问题思路:这一题关键就是这个月份天数我们怎么去实现,尤其是二月份闰年有29天,非闰年有28天,怎么让程序知道这一年是闰年呢(使用if语句来判断),我们可以将每个月的天数放在一个数组里面,然后根据输入是否为闰年,来输出我们的结果:
#includeint fun(int y) { return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0); } int main() { int y = 0; int m = 0; int d = 0; int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; while (scanf("%d%d", &y, &m) == 2) { int d = days[m]; if (fun(y) == 1 && m == 2) { d++; } printf("%dn", d); } return 0; } 五、逆序输出一个字符串的内容
问题描述:
输入: I am a student
输出:tneduts a ma I
#include#include int main() { char str1[100]; char str2[100]; int a, i; gets(str1); a = strlen(str1); for (i = 0; i < a; i++) { str2[i] = str1[a - 1 - i]; } str2[i] = 0; printf("%s", str2); } 六、计算求和
问题描述:
假设求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222
问题分析:通过给出的问题描述可以发现,需要求和的第i项有i个a,所以可以假设第i项为temp,则第i+1项为temp*10+a;
代码实现:
#includeint main() { int a = 0; int n = 0; int i = 0; int sum = 0; int tmp = 0; scanf("%d%d", &a, &n); for(i=0; i 七、打印菱形
问题描述:打印如下图形,这里只是给大家参考一下这个菱形图片并不是要打印这样的菱形,具体输出结果往下翻翻:
#includeint main() { char str[] = " "; //定义为空 int i = 0, j = 0; for (i = (strlen(str) / 2), j = (strlen(str) / 2); i >= 0 && j <= strlen(str); i--, j++) { str[i] = '*'; str[j] = '*'; printf("%sn", str); } for (i = 0, j = (strlen(str) - 1); i < (strlen(str) / 2) && j >= (strlen(str) / 2); i++, j--) { str[i] = ' '; str[j] = ' '; printf("%sn", str); } } 代码解读:这个方法非常容易理解,我们要打印的是上下对称的菱形,我们可以选择从中间开始打印,第一个for循环我们打印*,第二个for循环我们打印空格:
⛵⛵输出结果:
好啦,今天的习题分享就到这里啦,又看不懂的部分可以及时联系博主或者在下评论,我看到都会第一时间解答哒!谢谢阅读!期待一键三连!!!爐爐



