C语言经典习题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言经典习题相关的知识,希望对你有一定的参考价值。
试验报告(一)
1、本实验要求事先编好解决下面问题的程序,然后上机输入程序并调试运行程序。有如下函数: ①写程序,输入x的值,输出y相应的值。用scanf函数输入x的值,求y值。 ②运行程序,输入x的值(分别为x<1,1≤x<10,x≥10这3种情况),检查输出的y值是否正确。
程序代码:
#include<stdio.h>
int main()
int x = 0; int y = 0;
scanf("%d", &x);
if (x < 1)
y = x;
else if (x >= 1 && x < 10)
y = 2 * x - 1;
else
y = 3 * x - 11;
printf("y=%d", y);
return 0;
2、从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否小于1000的正数。若不是,则显示“数据不符合要求”。
#include<stdio.h>
#include<math.h>
int main()
float input = 0;
scanf("%f", &input);
if (input > 1000 || input < 0)
printf("数据不符合要求!\\n");
else
printf("%d", (int)sqrt(input));
return 0;
3.给出一个百分制成绩,要求输出成绩等级A,B,C,D,E 90分以上为A, 80到89分的为B,70到79分的为C,60到69分的为D,60分以下为E。 ①事先编好程序,要求分别用if语句和switch语句来实现。运行程序,并检查结果是否正确。 ②再运行一次程序,输入分数为负值(如-70),这显然是输入时出错,不应给出等级,修改程序,使之能正确处理任何数据,当输入数据大于100和小于0时,通知用户“输入数据错”,程序结束。
#include<stdio.h>
int main()
int score = 0;
scanf("%d", &score);
if (score > 100 || score < 0)
printf("输入数据错");
else
switch (score/10)
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:printf("E"); break;
case 6:printf("D"); break;
case 7:printf("C"); break;
case 8:printf("B"); break;
case 9:printf("A"); break;
case 10:printf("A"); break;
default:printf("输入数据错");break;
return 0;
试验报告(二)
分析功能
1.分析下列程序,说出程序的功能
#include <stdio.h>
int main()
int m = 10, n, i;
while (m--)
scanf("%d", &n);
for (i = 2; i < n; i++)
if (n % i == 0)
break;
if (i == n)
printf("%d Yes ----Yes\\n", n);
else
printf("%d No==No\\n", n);
return 0;
2.分析下列程序,说出程序的功能
#include <stdio.h>
int main()
int m, n, i, j, t;
scanf("%d %d", &m, &n);
if (m > n) t = m; m = n; n = t;
for (i = m; i >= 1; i--)
if (m % i == 0 && n % i == 0)
printf("D-MAX GYS=%d\\n", i);
break;
// 以上程序段的功能?
for (j = n; 1; j++)
if (j % m == 0 && j % n == 0)
printf("x-MIN GBS=%d\\n", j);
break;
// 第2段程序的功能?
return 0;
3.分析下列程序,说出程序的功能
#include<stdio.h>
#include<math.h>
int main()
double m, n, i;
double eps = 1e-6; //10-6表示很小的数
double a, b, c, d;
double f1, f2, fx;
printf("请输入a*x^3+b*x^2+c*x+d的系数a b c d:\\n");
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
printf("请输入取值区间:\\n");
scanf("%lf%lf", &m, &n);
f1 = a * pow(m, 3) + b * pow(m, 2) + c * m + d; //pow(x,y)=xy 幂函数
f2 = a * pow(n, 3) + b * pow(n, 2) + c * n + d;
if (f1 * f2 < 0)
while (fabs(m - n) > eps)
i = (m + n) / 2;
fx = a * pow(i, 3) + b * pow(i, 2) + c * i + d;
if (fabs(fx) < eps)
printf("方程的一个近似解为x*=%lf\\n", i);
break;
else if (f1 * fx < 0) n = i;
else if (f2 * fx < 0) m = i;
else if (f1 * f2 == 0)
if (f1 == 0) printf("方程的一个解为x*=%lf\\n", m);
if (f2 == 0) printf("方程的一个解为x*=%lf\\n", n);
else
printf("方程在该区间内无解!\\n");
return 0;
编写程序
1.打印7层杨辉三角形
#include <stdio.h>
int main()
int i = 0;
int j = 0;
int arr[10][10]=0;
//赋值
for (i = 1; i <= 7; i++)
arr[i][1] = arr[i][i] = 1;
for (i = 3; i <= 7; i++)
for (j = 2; j <= i - 1; j++)
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
//打印
for (i = 1; i <= 7; i++)
for (j = 1; j <= i; j++)
if(i>=j)
printf("%5d", arr[i][j]);
printf("\\n");
return 0;
详细讲解:杨辉三角详细解析
2.打印5阶魔方阵
#include <stdio.h>
#define N 20
void main()
int a[N][N], n, i, j, k;
while (1)
printf("请输入魔方阵的阶数(n<=20,且是奇数):");
scanf("%d", &n);
if (n != 0 && n <= 20 && n % 2 != 0)
printf("%d阶魔方矩阵.\\n", n);
break;
//根据输入的n,初始化二维数组,使方阵的每个元素初值均为0
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
a[i][j] = 0;
//构造魔方阵
i = 0; //i 指向第1行
j = n / 2; //计算出j:第一行中间列数
a[i][j] = 1; //放在第一行的中间一列,先定1的位置a[0][j]
k = 2; //后面的数从2开始,按照魔方阵的规律摆放
while (k <= n * n) //数的范围从2 至 n*n
i = i - 1; //行号减 1
j = j + 1; //列号加 1
if (i<0 && j>n - 1) //如果上一个数位于第1行第n列,则当前的数应在上一个数的下面
i = i + 2; //因为在前面i已经减去1了,所以下一行的行i值应该+2
j = j - 1; //因为在前面j已经减去1了,所以下一行的列j值应该+1(同上一列)
else
//如果上一个数位于第1行,则当前的数应位与最后一行
if (i < 0)
i = n - 1;
//如果上一个数位于第n列,则当前的数应位与第1列
if (j > n - 1)
j = 0; //j=0指向第1列
if (a[i][j] == 0) //当前的数保存到数组中
a[i][j] = k;
else //如果已经有数存在你,则放在上一个数的下面
i = i + 2;
j = j - 1;
a[i][j] = k;
k++; //k增加1,再接着寻找下一个应该存放k的位置之i、j
//输出魔方阵
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
printf("%4d", a[i][j]);
printf("\\n");
3.有下面一列数据0,-7,-9,9,2,51,7,14,35,37,49,43,41,1,3 编写程序,用冒泡法将其按由小到大的顺序排列进数组ax[15]中
#include<stdio.h>
void bubble_sort(int arr[], int sz)
for (int i = 0; i < sz - 1; i++)
for (int j = 0; j < sz - 1 - i; j++)
if (arr[j] > arr[j + 1])
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
int main()
int arr[15] = 0,-7,-9,9,2,51,7,14,35,37,49,43,41,1,3 ;
int ax[15] = 0 ;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (int i = 0; i < 15; i++)
ax[i] = arr[i];
for (int j = 0; j < 15; j++)
printf("%d ", ax[j]);
试验报告(三)
分析功能
1.分析下列程序,说出程序的功能
#include <stdio.h>
int main()
int i;
int f[20]=1,1;
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
if(i%5==0) printf("\\n");
printf("%12d",f[i]);
printf("\\n");
return 0;
2.分析下列程序,说出程序的功能
#include <stdio.h>
int main()
int a[2][3]=1,2,3,4,5,6;
int b[3][2],i,j;
printf("array a:\\n");
for (i=0;i<=1;i++)
for (j=0;j<=2;j++)
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
printf("\\n");
printf("array b:\\n");
for (i=0;i<=2;i++)
for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\\n");
return 0;
3.请对程序填空输入一行字符,让其统计其中有多少个单词,单词之间用空格分隔开。
#include <stdio.h>
int main()
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for (你需要在此填入一行代码)
if(c== ) word=0;
else if(word==0)
word=1;
num++;
printf("There are %d words in this line.\\n",num);
return 0;
编写程序
- 现有10个数:6, 9 ,12 , -7, 0, 3, 15, 3,19,-5,用冒泡法编写程序,将它们按由大到小的顺序排列出来
#include<stdio.h>
//设计冒泡排序函数
void bubble_sort(int arr[], int sz)
for (int i = 0; i < sz - 1; i++)
for (int j = 0; j < sz - 1 - i; j++)
if (arr[j] < arr[j + 1])
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
//主函数调用并打印排序后的数组
int main()
int arr[] = 6, 9 ,12 , -7, 0, 3, 15, 3,19,-5 ;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (int i = 0; i < sz; i++)
printf("%d ", arr[i]);
return 0;
- 针对上述10个数,用选择法编写程序,将它们按由小到大的顺序排列出来
#include<stdio.h>
//设计选择排序函数
void selection_sort(int arr[], int sz)
int i, j;
for (i = 0; i < sz - 1; i++)
int min = i;
for (j = i + 1; j < sz; j++)
if (arr[j] < arr[min])
min = j;
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
//主函数调用实现
int main()
int arr[] = 6, 9 ,12 , -7, 0, 3, 15, 3,19,-5 ;
int sz = sizeof(arr) / sizeof(arr[0]);
selection_sort(arr, sz);
for (int i = 0; i < sz; i++)
printf("%d ", arr[i]);
return 0;
- 从键盘上输入一个4*3的整型数组,找出数组中的最小值及其在数组中的下标。
#include <stdio.h>
int main()
int a[4][3] = 0 ;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
int row = 0, col = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
if (a[i][j] < a[row][col])
row = i;
col = j;
printf("该数组的最小的数是%d\\n", a[row][col]);
printf("所处的位置为数组的第%d行第%d列\\n", row + 1, col + 1);
return 0;
试验报告(四)
1.下面程序实现由键盘输入4个数,运行程序找出最大数,完善程序:
#include <stdio.h>
int main()
int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("Please enter 4 interger numbers:");
scanf("%d %d %d %d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d \\n",max);
return 0;
int max4(int a,int b,int c,int d)
int max2(int a,int b);
int m;
m=max2(max2(max2(a,b),c),d); /* 仔细分析此行 */
return(m);
_________________ //声明函数
( );
int max2(int a, int b)
return a > b ? a : b;
2.下面是一个函数递归调用的程序,请你画出每次函数调用过程示意图,说明最终结果是怎么产生的:
#include <stdio.h>
int main()
int age(int n);
printf("NO.5,age:%d\\n",age(5)); //输出第4人的年龄
return 0;
int age(int n) //定义递归函数
int c;
if(n==1) // 如果n等于1
c=10; // 年龄为10
else // 如果n不等于1
k=age(n-1); // 年龄是前一人的年龄加2
C=k+2; //例如:第4人年龄是第3人年龄加2
return(c); // 返回年龄
3.下面是一个能计算输入数n的阶层程序,其中包含函数的递归调用,请在//后面添加其实现功能的注释内容。
#include <stdio.h>
int main()
int fac(int n);
int n;
int y;
while(1) //n<2时重新输入
printf("input an integer number:");
scanf("%d",&n);
if(n<1)continue; //(1)
else break; //(2)
y=fac(n); //(3)
printf("%lld!=%d\\n",n,y);
return 0;
int fac(int n)
int f;
if(n==0||n==1) f=1; //(4)
else f=fac(n-1)*n; //(5)
return(f);
试验报告(五)
1.有10个整数,使前面各数顺序向后移 5 个位置,最后 5 个数变成最前面 5 个数。写一函数实现以上功能
#include<stdio.h>
//写一个移动函数
void move(int str[], int n, int m)
int* p, str_end;
if (m > 0)
str_end = *(str + n - 1);
for (p = str + n - 1; p > str; p--)
*p = *(p - 1);
*p = str_end;
m--;
if (m > 0)
move(str, n, m); //递归
else
return ;
int main()
int a[10] = 1,2,3,4,5,6,7,8,9,10 ;
printf("转换前:");
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
move(a, 10, 5);
printf("\\n转换后:");
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
2.写一函数,求一个字符串的长度。在 main 函数中输入字符串,并输出其长度。
#include<stdio.h>
int my_strlen(char* s)
char* p = s;
while (*p != \\0)
p++;
return p - s;
int main()
char ch[30];
scanf("%s", &ch);
int a = my_strlen(ch);
printf("%d\\n", a);
return 0;
3.写一函数,将一个 3×3 的整型矩阵转置
#include<stdio.h>
void move(int(*pa)[3])
int i, j, temp;
for (i = 0; i < 3; i++)
for (j = 0; j < i; j++)
temp = *(*(pa + i) + j);
*(*(pa + i) + j) = *(*(pa + j) + i);
*(*(pa + j) + i) = temp;
int main()
int a[3][3];
int temp;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
printf("转置前的数组为:\\n");
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
printf("%5d ", a[i][j]);
printf("\\n");
move(a);
printf("转置后的数组为:\\n");
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
printf("%5d ", a[i][j]);
printf("\\n");
return 0;
4.将 n 个数按输入时顺序的逆序排列,用函数实现。
#include<stdio.h>
void reverse(int* p, int n)
int temp;
int i;
for (i = 0; i <= n / 2; i++)
temp = *(p + i);
*(p + i) = *(p + n - 1 - i);
*(p + n - 1 - i) = temp;
int main()
int array[100];
int n = 0;
printf("输入元素个数:");
scanf("%d", &n);
printf("依次输入元素:\\n");
for (int i = 0; i < n; i++)
scanf("%d", &array[i]);
reverse(array, n);
for (int i = 0; i < n; i++)
printf("%d ", array[i]);
return 0;
以上是关于C语言经典习题的主要内容,如果未能解决你的问题,请参考以下文章