C语言考试习题小合集

时间:2022-12-19 01:45:08

整理几道C语言的练习题,题目+注释+代码。


第一题:

题目
1.已知银行整存整取存款不同期限的月息利率(采用复利方式,即利滚利)分别为
            0.63%    期限一年
            0.66%    期限二年
月息利率=    0.69%    期限三年
            0.75%    期限五年
            0.85%    期限八年
要求输入存钱的本金和期限(以整数年为单位),求到期时能从银行得到的利息与本金的合计。
提示:可以用嵌套的if-else结构或switch结构实现,核心函数pow(1+月利率,月份)。
请思考年份是四、六、七或八年以上的情况。

#include <stdio.h>
#include <stdlib.h>

/*TODO 核心函数
* @函数名:pow
* @功能说明:根据利率(+100%)、存期,计算利息与本金的合计。
* @参数说明:r 利率,t 存期
* @备注:复利的本息计算公式是 F=P(1+i)^n
*/
double pow(double r,int t){
double temp = r+1;
int i;
for(i=0;i<t;i++){
temp *= r+1;
}

return temp;

}

/*TODO 计算年利率
* @函数名:rate
* @功能说明:根据存期返回响应的年利率
* @参数说明:y 年份
* @备注:原题中申明“以整数年为单位”,因此函数返回年利率
*/
double rate(int y){
double r_m;//月利率
if(y==1)//多分支判断利率
r_m = 0.0063;
else if(y==2)
r_m = 0.0066;
else if(y==3||y==4)
r_m = 0.0069;
else if(y>=5&&y<=7)
r_m = 0.0075;
else if(y>=8)
r_m = 0.0085;

return r_m;
}

/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main()
{
double P;//本金
double R;//总回报率
double total;//本息合计
int year;//存期(年)

printf("请输入存入本金:");
scanf("%lf",&P);
printf("请输存期(单位:年):");
scanf("%d",&year);

R = pow(rate(year),year);
total = P * R;
printf("本息合计为:%.3lf\n",total);
system("pause");
}


第二题:

题目

简单计算器。用switch语句编写一个程序计算表达式:data1 op data2的值。其中op为运算符+、-、*、/。

#include <stdio.h>
#include <stdlib.h>

/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main()
{
double data1,data2;//参数
double result;//结果
char op;//运算符

printf("请输入计算表达式(例:100 * 50):\n\n");
scanf("%lf %c %lf",&data1,&op,&data2);

switch(op){
case '+':
result = data1+data2;
break;
case '-':
result = data1-data2;
break;
case '*':
result = data1*data2;
break;
case '/':
result = data1/data2;
break;
}
printf("\n\n运算结果为:%.2lf\n\n",result);

system("pause");
}


第三题:

题目

编写程序,给定一个整数i,请求出另一个整数j,使i和j在用8位二进制表示时互为逆序。例如:给定i=3时,应得到j=192(3的二进制为:00000011,192的二进制为11000000)。
提示:
①    十进制整数转换为二进制整数用“除2求余”法。
②    二进制整数转换为十进制整数用“按权相加”法。

#include <stdio.h>
#include <stdlib.h>
#define ArrMaxLength 8

/*TODO 十进制转二进制
* @函数名:DtoB
* @功能说明:十进制转二进制
* @参数说明:x 十进制整数, *a 长度为8的整型数组首地址
* @备注:函数为返回值,直接修改数组内容
*/
void DtoB(int x,int *a)
{
int i=0,rem;
do{
rem=x%2;
x=x/2;
a[i]=rem;
i++;
}while(x!=0);

return a;
}

/*TODO 二进制倒序后转十进制
* @函数名:BtoD_desc
* @功能说明:将二进制序列倒序,并转为十进制
* @参数说明:*a 长度为8的整型数组首地址
* @备注:返回十进制整数
*/
int BtoD_desc(int *a)
{
int i;
int sum = 0;
for(i=0;i<ArrMaxLength;i++){
if(a[i]==1)
sum += power(2,ArrMaxLength-i-1);
}

return sum;
}

/*TODO 求平方
* @函数名:power
* @功能说明:二进制转十进制
* @参数说明:a 底数, x 指数
* @备注:返回a的x次方
*/
int power(int a,int x)
{
int s;
for(s=1;x>0;x--){
s *= a;
}
return s;
}

/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main()
{
int a[ArrMaxLength]={0};//存放二进制的数组
int D;//十进制变量

printf("请输入整数:");
scanf("%d",&D);

DtoB(D,a);//十进制转二进制
D = BtoD_desc(a);//二进制倒序后转十进制

printf("\n输出结果为:%d\n",D);

system("pause");
}

第四题:

题目

编写程序,抓交通肇事犯。
一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车D号,只记下车号的一些特征。
甲说:牌照的前两位数字是相同的;
乙说:牌照的后两位数字是相同的,但与前两位不同;
丙是位数学家,他说:四位的车号刚好是一个整数的平方。根据以上线索求出车号。
提示:
①    按照题目的要求,造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。
②    用穷举法解此题。穷举法是最简单、最常见的一种程序设计方法,它充分利用了计算机处理的高速特征。穷举法的关键是要确定穷举的范围,既不能过分扩大穷举的范围,也不能过分缩小穷举的范围,否则程序的运行效率会很低,或有可能遗漏正确的结果而产生错误。

#include <stdio.h>
#include <stdlib.h>

/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main()

{
int i, j, k, c;

for (i = 1; i <= 9; i++)//i:车号前二位的取值
for (j = 0; j <= 9; j++) //j:车号后二位的取值
if (i != j)//判断二位数字是否相异
{
k = i * 1000 + i * 100 + j * 10 + j; //计算出可能的整数
for (c = 31; c < 100; c++) //循环判断该数是否为另一整数的平方,c的取值范围 31-99 之间
if (c*c == k) //是否等于c的平方
printf("%d\n", k);
}


system("pause");
}

第五题:

题目

用递推法求ex=1+x+x2/2!+x3/3!+…+xn/n!的值。

#include <stdio.h>
#include <stdlib.h>

/*TODO 求乘阶
* @函数名:f
* @功能说明:求1 - n 之间的乘积
* @参数说明:n为最大项数
* @备注:无
*/
double factorial(int n) {
int i;//循环变量
int fact = 1;//阶乘结果

for (i = 1; i <= n; i++)//计算阶乘
fact *= i;

return (double)fact;
}

/*TODO 求平方
* @函数名:power
* @功能说明:二进制转十进制
* @参数说明:a 底数, x 指数
* @备注:返回a的x次方
*/
double power(int a, int x)
{
double s;
for (s = 1; x > 0; x--){
s *= a;
}
return s;
}


/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main() {
int x;//底数
int n;//项数
double sum = 1.0;//总和
int i;//循环变量
printf("请输入底数x:");
scanf("%d", &x);
printf("请输入项数n:");
scanf("%d", &n);

for (i = 1; i <= n; i++){
sum += (power(x, i) / factorial(i));

//这行代码用于测试,可以保留也可删除
//printf("当i=%d时:power=%lf,factorial=%lf,sum=%lf\n",i,power(x,i),factorial(i),sum);
}

printf("\n最后结果为(保留2位小数):%.2lf\n\n", sum);

system("pause");
}

第六题:

题目

打印出以下的杨辉三角形(要求打印出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
…… …… ……
提示:用二维数组实现。关键语句:a[i][j]=a[i-1][j-1]+a[i-1][j]

#include <stdio.h>
#include <stdlib.h>
#define N 11

/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main()
{
int i, j, a[N][N] = { 0 };

for (i = 1; i < N; i++){
a[i][1] = 1;
a[i][i] = 1;
}
for (i = 3; i < N; i++)
for (j = 2; j < i; j++)
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
for (i = 1; i < N; i++){
for (j = 1; j <= i; j++)
printf("%6d", a[i][j]);
printf("\n");
}

system("pause");
}

第七题:

题目

某班期终考试科目为高数MT、英语EN和物理PH,有30个人参加考试。
为评定奖学金,要求统计并输出一个表格,
表格内容包括学好、各科分属、总分和平均分,并标出3门课均在90分以上者(该栏标志输出为Y,否则为N),
表格形式如下:
NO  MT    EN    PH    SUM   V    >90
1     97      87     92     276    92    N
2     92      91     90     273    91    Y
3     90      81     82     253    84    N
......        ......        ......        ......

#include <stdio.h>
#include <stdlib.h>

/*TODO 是否三门成绩90分以上
* @函数名:Grade
* @功能说明:三门成绩是否都大于等于90
* @参数说明:三门成绩
* @备注:是 返回 Y, 否 返回 N
*/
char Grade(int a, int b, int c){
if (a >= 90 && b >= 90 && c >= 90)
return 'Y';
else
return 'N';
}

/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main()
{
int a[30][5] = { 0 };//成绩单数组
int p = 0;//人数
int i;//循环变量

printf("请输入人数(最大30人):");
scanf("%d", &p);

for (i = 0; i < p; i++){//录入成绩

system("cls");//清屏
printf("请输入第%d名同学的成绩:\n", i + 1);

printf("高数:");
scanf("%d", &a[i][0]);
printf("英语:");
scanf("%d", &a[i][1]);
printf("物理:");
scanf("%d", &a[i][2]);
a[i][3] = a[i][0] + a[i][1] + a[i][2];
a[i][4] = a[i][3] / 3;
}

system("cls");
printf("NO\tMT\tEN\tPH\tSUM\tV\t>90\n");
for (i = 0; i < p; i++){
printf("%d\t%d\t%d\t%d\t%d\t%d\t%c\n", i + 1, a[i][0], a[i][1], a[i][2], a[i][3], a[i][4], Grade(a[i][0], a[i][1], a[i][2]));
}

printf("\n\n");
system("pause");
}


第八题:

题目

实现螺旋矩阵(这道题常在学生竞赛或者企业笔试时出现)

输出形式如下:

    1    2    3    4   5
  16  17  18  19   6
  15  24  25  20   7
  14  23  22  21   8
  13  12  11  10   9

#include <stdio.h>
#include <stdlib.h>

#define Lenght 9//螺旋矩阵的阶数

/*TODO 主函数
* @函数名:main
* @功能说明:程序入口
* @参数说明:无
* @备注:无
*/
void main(){

int arr[Lenght][Lenght] = { 0 };
int l = 0, r = 0;
int i = 1;
int mode = 1;

while (mode){

mode = 0;

if (arr[l][r + 1] == 0 && r<Lenght - 1)
mode = 1;
else if (arr[l + 1][r] == 0 && l<Lenght - 1)
mode = 2;
else if (arr[l][r - 1] == 0 && r>0)
mode = 3;
else if (arr[l - 1][r] == 0 && l>0)
mode = 4;


if (mode)
switch (mode){
case 1://向右
while (arr[l][r + 1] == 0 && r + 1 < Lenght){
arr[l][r] = i++;
r++;
}
break;
case 2://向下
while (arr[l + 1][r] == 0 && l + 1 < Lenght){
arr[l][r] = i++;
l++;
}
break;
case 3://向左
while (arr[l][r - 1] == 0 && r >= 0){
arr[l][r] = i++;
r--;
}
break;
case 4://向上
while (arr[l - 1][r] == 0 && l >= 0){
arr[l][r] = i++;
l--;
}
break;
}
}

if (arr[l][r] == 0)
arr[l][r] = i++;

for (l = 0; l < Lenght; l++){
for (r = 0; r < Lenght; r++)
printf("%4d", arr[l][r]);
printf("\n");
}

system("pause");
}