下面是一些与初阶C语言难度相符的训练题,每一个题都有多种代码实现方式,我们尽量选择最简便的方法来实现
一、
💓打印9*9乘法口诀表
思路: 9*9乘法口诀表一共有9行9列,也就是第一行打印1的乘法,第二行打印2的乘法,第三行打印3的乘法以此类推,就可以得到9*9的乘法口诀表 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 ..... 所以呢,我们要设置两个循环变量,先控制打印多少行,再控制打印多少列
代码解析:
intmain() { inti=0; intj=0; for (i=1; i<=9; i++) //设置打印多少行 { for (j=1; j<=i; j++) //根据行来控制打印多少列 { printf("%d*%d=%-2d ", i, j, i*j); //采用左对齐使其看起来更加美观 } printf("\n"); //每打印完一行都要换行 } return0; }
%2d--右对齐 %-2d--左对齐
%d与%-2d区别:
使用%-2d之后会使乘法口诀表变得更加美观
二、
💓求10个整数中最大的整数
思路: 求最大值的题在之前的训练题里面也有,但是是求两个数的最大值,如果求两个数的最大值使用if else语句、条件操作符都可以解决,但是如果求多个数就得换一种思路: 假设有一个整型数组,里面有10个元素,我们可以采用下标的方式访问这些元素,然后设置一个变量max来存放最大值,假设下标为0的元素就是最大值,并将其存放进max中,然后用数组中其他元素与这个max中的元素进行比较,如果比max中这个元素大,就将其替换,如果没有它大,就让下一个元素比较,直到将数组中的全部元素比较完
代码解析:
intmain() { intarr[10] = { 0,1,2,3,4,5,6,7,8,9 }; inti=0; //假设下标为0的元素就是最大值intmax=arr[0]; for (i=1; i<10; i++) { if (arr[i] >max) //如果比max大则会替换 { max=arr[i]; } } printf("max=%d", max); return0; }
三、
💓计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
我们可以先来观察一下题目,我们可以先实现1+2+3+4+5+6+7+8+9+....+100,然后对其进行调整修改
//1~100之和intmain() { inti=0; intsum=0; for (i=1; i<=100; i++) { sum+=i; } printf("sum=%d\n", sum); return0; }
写出1~100之和之后再将其转化为1/1+1/2+1/3+...+1/100:
intmain() { inti=0; doublesum=0; intm=1; for (i=1; i<=100; i++) { sum+=1.0/i; //在求和时转化,由于求出来的是小数所以要使用double类型的sum } printf("sum=%lf\n", sum); return0; }
经过一步一步的转化,可以发现,这个表达式第一项是正数,第二项是负数,第三项又是正数,第四项又是负数......所以我们可以创建一个变量,用来改变正负
intmain() { inti=0; doublesum=0; intm=1; //创建一个改变正负的变量mfor (i=1; i<=100; i++) { sum+=1.0/i*m; m=-m; //每一次乘完之后将m改变为-m } printf("sum=%lf\n", sum); return0; }
四、
💓编写程序数一下 1到 100 的所有整数中出现多少个数字9
个位出现9:9 19 29 39 49 59 69 79 89 99 十位出现9:90 91 92 93 94 96 97 98 99 要计算1~100的整数中出现了几次9,那就要考虑个位和十位,如果出现了九就计算一次,如果没有出现9就让下一个数再检验,当两位数除以10的商就是十位的数字,取模得到的余数就是个位的数字
代码演示:
intmain() { intcount=0; inti=0; intnum=1; for (i=0; i<100; i++) { if (num/10==9) //表示十位是否为9 { count++; } if (num%10==9) //表示个位是否为9 { count++; } num++; } printf("%d", count); return0; }
注:这里不能使用if(num/10==9){}else if(num%10==9){} 求个位和十位上的9分别是独立的
五、
💓实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
💓如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表
要求通过输入n打印n的乘法口诀表,既然我们已经可以打印9*9的乘法口诀表那就可以在9*9的乘法口诀表代码上入手,将设置的9行9列来通过我们自行输入来控制打印几行几列
代码演示:
//要求设计函数来实现voidPrint(intn) { inti=0; intj=0; for (i=1; i<=n; i++) //控制打印几行几列通过我们输入的n来控制 { for (j=1; j<=i; j++) { printf("%d*%d=%-2d ", i, j, i*j); } printf("\n"); } } intmain() { intn=0; scanf("%d", &n); Print(n); return0; }
六、
💓实现一个函数来交换两个整数的内容
交换两个整数的内容,有许多老铁很快会反应出来将a的值赋给b,将b的值赋给a,这样想也对,取决与怎样使用代码来实现,在代码中如果我们非常简单的写出这样的代码: int main() { int a = 20; int b = 10; a = b; b = a; return 0; } 那这可就错了,这样是不会交换的,为什么呢?举一个生活中的例子: 有一瓶酱油和一瓶醋,我们需要将酱油装进装醋的瓶子、将醋装进装酱油的瓶子来进行交换,如果按照上面代码这样来交换,意思就是直接将酱油倒进醋瓶子,又将醋瓶子里的倒进酱油瓶子,这样子倒会将两个液体混合无法达到交换瓶子的目的,我们应该先找一个空瓶子,然后将其中醋先倒进空瓶子里,再将酱油倒进醋瓶子,再将醋倒进酱油瓶子就可以达到交换的目的,所以呢,我们需要先创建一个变量用来协助交换, 假设先不使用函数 来进行交换:
代码演示:
//普通实现intmain() { inta=20; intb=10; printf("交换前:a=%d b=%d\n", a, b); inttmp=0; tmp=a; //将a装进空瓶子,这时的a里面就没有东西a=b; //然后将b装进a,这时a里面就存放的b的值b=tmp; //这时b又空了,将tmp里面的a又装进b里面printf("交换后:a=%d b=%d\n", a, b); return0; }
需要借助另外的一个变量来进行交换两个数,如果使用函数来交换两个数会是怎样的效果 我们将交换的过程放进函数中
代码演示:
//函数实现voidPrint(inta, intb) { inttmp=0; tmp=a; a=b; b=tmp; } intmain() { inta=20; intb=10; printf("交换前:a=%d b=%d\n", a, b); Print(a, b); printf("交换后:a=%d b=%d\n", a, b); return0; }
可以看到,在使用函数来进行交换过程之后居然不能实现交换,这里就要涉及到函数在传值时的细节 函数在传参时要使用传址调用,传址调用时形参是实参地址的一份拷贝,形参指向的实体是实参,对形参解引用后,拿到的内容就是实参,因此对形参解引用之后的内容进行修改,改变的就是实参,所以我们需要传地址
代码演示:
voidPrint(int*a, int*b) //接收地址使用指针{ inttmp=0; tmp=*a; *a=*b; *b=tmp; } intmain() { inta=20; intb=10; printf("交换前:a=%d b=%d\n", a, b); Print(&a, &b); //将地址传给函数printf("交换后:a=%d b=%d\n", a, b); return0; }
七、
💓函数实现判断一个年份是否为闰年
闰年判断的条件是: 1.十年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年 2.每四百年再一闰:如果year能够被400整除,则year是闰年 要求使用函数来实现,就需要使用if语句来判断是否为闰年
代码演示:
//设置一个函数//若year为闰年则返回1//不为闰年则返回0intLeapYear(intyear) { if (((0==year%4) && (0!=year%100)) || (0==year%400)) //判断条件 { return1; //是闰年返回1 } else { return0; //不是则返回0 } } intmain() { intyear=0; scanf("%d", &year); intflag=LeapYear(year); if (flag==1) //如果返回值是1则为闰年 { printf("%d是闰年\n", year); } else//返回值不是1,则不为闰年 { printf("%d不是闰年\n", year); } return0; }
八、
💓计算n的阶乘
1! 1 2! 1*2 3! 1*2*3 4! 1*2*3*4 可以设置一个循环,每一次循环加1,然后每一次的循环变量都相乘,循环n次就可以达到阶乘的目的
代码演示:
//计算n的阶乘intmain() { intn=0; scanf("%d", &n); //这里不能初始化为0//ret = ret*iintret=1; inti=0; for (i=1; i<=n; i++) { ret*=i; } printf("%d的阶乘是:%d\n", n, ret); return0; }
九、
💓函数实现 1!+2!+3!+……+n!
上面一个题求出了单个数的阶乘,多个数的阶乘累加求和就需要在此基础上加上求和代码,另外需要使用函数来完成
intfactorial_sum(intn) { intret=1; inti=0; intsum=0; for (i=1; i<=n; i++) { //求阶乘ret*=i; //求和sum+=ret; } returnsum; } intmain() { intn=0; scanf("%d", &n); intsum=factorial_sum(n); printf("%d", sum); return0; }
十、
💓模拟用户登录输入密码情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序
要实现上述情景,首先得有输入三次密码的机会,因此可以设置一个循环3次的循环,然后每一次循环内部要判断密码是否相等,要判断字符串相不相等就得使用strcmp函数,如果三次均输入错误就终止循环
//假设正确密码是123456intmain() { charpassword[20] = { 0 }; //存放密码intflag=0; inti=0; intcount=3; for (i=0; i<3; i++) { printf("请输入密码:"); scanf("%s", password); if (strcmp(password, "123456") ==0) //判断输入的密码与正确密码是否相等 { flag=1; //如果正确则跳出循环printf("密码正确!\n"); break; } else { printf("密码错误!请重新输入:\n"); count--; printf("警告:您还剩%d次机会,请注意!\n", count); } } if (flag==0) //如果循环结束flag还没有被改为1,那就证明三次机会均用完 { printf("三次密码均错误,退出程序!\n"); } return0; }
本期分享就到此结束,后续还会给大家分享一些习题,感谢大家学习!