C语言经典习题(一)

时间:2023-02-18 20:58:22

试验报告(一)

1、本实验要求事先编好解决下面问题的程序,然后上机输入程序并调试运行程序。有如下函数: C语言经典习题(一) ①写程序,输入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;
}

1、逻辑与操作符(&&):两个操作数同时为真才为真。

2、if if 和 if else if的区别:前者的两个if判断都会进行,而后者第一个判断为假才会进行第二个判断。

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;
}

1、逻辑或操作符(||):一真为真,全假为假。

sqrt函数的返回值默认为浮点型,要在进行强制转换

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、逻辑或操作符(||):一真为真,全假为假。

2、逻辑与操作符(&&):两个操作数同时为真才为真。

3、遇见break才会跳出当前选择语句

试验报告(二)

分析功能

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;
}	

计算并打印斐波那契数列的前20项。

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;
}    

将二维数组a的行和列互换后放到二维数组b中并打印。

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;
}

应该在for循环中填入:i = 0; (c = string[i]) != '\0'; i++

编写程序

  1. 现有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;
}
  1. 针对上述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;
}
  1. 从键盘上输入一个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);                        // 返回年龄
}

C语言经典习题(一)

main函数将n=5传给age函数,由于求解第五个人的年纪,需要第四个人的年纪,所以age函数有把n-1后传给age函数,一次类推,最后求出第一个人的年纪,然后将第一个人年纪依次往上传过去。

递归=递推+回归

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)如果输入的n小于1,就跳过后面的内容继续进行循环

(2)如果输入的n不小于1,直接跳出while循环

(3)调用自定义的fac函数

(4)如果n=0或者n=1,那么直接返回1

(5)如果n不为0和1,继续递归调用fac函数,返回值f为fac(n-1)的值乘n

试验报告(五)

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;
}