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