Bootstrap

头歌作业1


改错题

1.

在程序编辑区编写程序,程序功能如下:有一个3行4列的矩阵,现要求编程求出其中最大的那个元素的值,以及它所在的行号与列号。
程序中有两处错误,错误都在提示行:
/found/的下面一行,请考生注意。
请改正程序中的错误,使它能得出正确的结果。
注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!
例如:
输入:
1 2 3 4
5 6 7 8
9 4 2 3
输出:
max=9,row =2,colum=0

#include <stdio.h>
	int main(void) 
	{
	   int max,m,i,j,r,c;
	   int a[3][4];
       for(i=0;i<=2;i++)
        for(j=0;j<=3;j++)
            scanf("%d",&a[i][j]);
/***********found***********/       
	   max=a[0][0];
	   for(i=0;i<=2;i++)
		for(j=0;j<=3;j++)
/***********found***********/
	   		if(a[i][j]>max)
	   		{
	      		max= a[i][j];
	      		r=i;
	      		c=j;
	   		}
	   printf("max=%d,row =%d,colum=%d \n",max,r,c);
 	   return 0;
	}

2.

在程序编辑区编写程序,程序功能如下:任意输入两个字符串(如“Country”和“side”),并存放在s1、s2两个数组中,然后将s1、s2两个字符串连接起来,形成一个新字符串(如:“Countryside”),放在s1数组中,并输出。
例如:
输入
Country
side
输出
Countryside

程序中有两处错误,错误都在提示行:
/found/的下面一行,请考生注意。
请改正程序中的错误,使它能得出正确的结果。
注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
#include <string.h>
int main(void) 
{	  
	char s1[80], s2[40];
	int i = 0, j = 0;
	scanf("%s", s1);
	scanf("%s", s2);
	while(s1[i] != '\0') i++;
	while(s2[j] != '\0') 
	{
		s1[i++] = s2[j];
		j++;
	}
	s1[i] = '\0';
	printf("%s", s1);
	return 0;
}

3.

在程序编辑区编写程序,程序功能如下: 求一维数组a中的最小元素及其下标。
例如:
输入
1 4 2 7 3 12 5 34 5 9
输出
The min is: 1,pos is: 0 。

程序中有两处错误,错误都在提示行: /found/的下面一行,请考生注意。
请改正程序中的错误,使它能得出正确的结果。
注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
int main()
{ int a[10],i,min,pos;
    for(i=0;i<10;i++)  scanf("%d",&a[i]);
     /************found************/
    min = a[0];
    pos = 0;
    for ( i=1; i<10; i++)
      if (min > a[i])
      {
	      min = a[i];
  /************found************/
	      pos = i;
      }
     printf("The min is:%d ,pos is:%d\n", min , pos);
}

4.

在程序编辑区编写程序,程序功能如下: 求一维数组a中值为偶数的元素之和。
例如:
输入
10 4 2 7 3 12 5 34 5 9
输出
The result is:62

请修改并运行该程序 。 程序中有两处错误,错误都在提示行: /found/的下面一行,请考生注意。 请改正程序中的错误,使它能得出正确的结果。
注意:程序中的其它地方请考生不要随意改动,不得增行 或删行,也不得更改程序的结构!

#include <stdio.h>
  int main()
  { int a[10],i,s;
    for(i=0;i<10;i++)   scanf("%d",&a[i]);
    s = 0;
    for ( i=0; i<10; i++)
 /************found************/
      if (a[i] % 2==0 )
  /************found************/
         s = s + a[i];
    printf("The result is:%d\n", s);
  }

5

 求一维数组a中所有元素的平均值,结果保留两位小数。
例如
输入
10 4 2 7 3 12 5 34 5 9
输出
The aver is:9.10
程序中有两处错误,错误都在提示行:
/found/的下面一行,请考生注意。
请改正程序中的错误,使它能得出正确的结果。
注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

int main() {
    int a[10], i;
    float aver = 0.0, s = 0.0;  // /found/
    for (i = 0; i < 10; i++) scanf("%d", &a[i]);  // 输入数组元素

    for (i = 0; i < 10; i++) {  // /found/ 修改为从 0 开始
        s += a[i];
    }
    aver = s / i;  // 修改为使用数组长度 10 作为分母
    printf("The aver is:%.2f\n", aver);

    return 0;
}

 

6.

在程序编辑区编写程序,程序功能如下: 输入一个百分制成绩,打印出五级记分成绩。
考试成绩在90分或90分以 上为优秀,80~89分为良好,70~79为中等,60~69为及格,低于60分 为不及格。
程序中有两处错误,错误都在提示行:
/found/的下面一行,请考生注意。
请改正程序中的错误,使它能得出正确的结果。
注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
int main()
{
    int score;
    // 使用do-while循环确保输入的成绩在合理范围(0 - 100)内
    do
    {
        scanf("%d", &score);
    } while (score < 0 || score > 100);

    // 根据成绩计算对应的等级分类,这里通过除以10获取对应区间的关键数字
    // 例如90 - 100分除以10得到9或10,对应“优秀”等级,注意此处不需要加1,原代码加1是错误的逻辑
    int t = score / 10;

    switch (t)
    {
    case 10:
    case 9:
        printf("优秀!\n");
        break;
    case 8:
        printf("良好!\n");
        break;
    case 7:
        printf("中等!\n");
        break;
    case 6:
        printf("及格!\n");
        break;
    default:
        // 对于小于60分的情况(即t为0 - 5的情况),统一输出“不及格”,使用default处理更简洁
        printf("不及格!\n");
        break;
    }

    return 0;
}

7.

输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,
如果找到,输出相应的下标,否则,输出“Not Found”。
例如:
输入
2 9 8 9 6
9
输出
Index is 1

输入
2 9 8 9 6
5
输出
Not Found
程序中有两处错误,错误都在提示行:
/found/的下面一行,请考生注意。
请改正程序中的错误,使它能得出正确的结果。
注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
int main(void)
{
    int i, flag, x;
    int a[5];
    
    for (i = 0; i < 5; i++)
        scanf("%d", &a[i]);
    
    scanf("%d", &x);
    flag = 0;
   
    for (i = 0; i < 5; i++)
    {
        if (a[i] == x)
        {
           
            printf("Index is %d\n", i);
            flag = 1;
            break;
        }
    }
    
    if (flag == 0)
        printf("Not Found\n");

    return 0;
}

8.

在程序编辑区编写程序,程序功能如下:函数fun的功能是根据形参m,计算公式

T=1/1!+1/2!+ 1/3!+…+1/m!的值。

请修改并运行该程序 。 程序中有两处错误,错误都在提示行:

/found/的下面一行,请考生注意。

请改正程序中的错误,使它能得出正确的结果。

注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

double fun(int m)
{
    double t = 0.0;  
    double fac; 
    int i, j;
    for (i = 1; i <= m; i++)
    {
        fac = 1.0;
        for (j = 1; j <= i; j++)
            fac *= j;
        t += 1.0 / fac;
    }
    return t;
}

int main(void)
{
    int m;
    scanf("%d", &m);
    printf("%12.10lf \n", fun(m));
    return 0;
}

9.

在程序编辑区编写程序,程序功能如下:将10个整数存入数组,删除数组中的某个元素。

例如,数组中有1,2,3,4,5,6,7,8,9,10共10个元素,删除第5个元素后,数组中剩下9个元素1,2,3,4,6,7,8,9,10。

程序中有两处错误,错误都在提示行:

/found/的下面一行,请考生注意。

请改正程序中的错误,使它能得出正确的结果。

注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
	int main(void)
	{
	int a[10],i,num;
	for(i=0;i<10;i++)
	scanf("%d",&a[i]);
	scanf("%d",&num); /*输入要删除的元素序号*/
	for(i=num;i<10;i++)
	/***********found***********/
        a[i-1]= a[i]; 
       /***********found***********/
	for(i=0;i<9;i++) 
	printf("%d  ", a[i]); 
	return 0;
	}

10

在程序编辑区编写程序,程序功能如下: 求一维数组a中的最小元素及其下标。

例如,当一维数组a中的元素为:1,4,2,7,3,12,5,34,5,9,

程序的输出应为:The min is:1,pos is:0 。

程序中有两处错误,错误都在提示行: /found/的下面一行,请考生注意。

请改正程序中的错误,使它能得出正确的结果。

注意:程序中的其它地方请考生不要随意改动,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
  int main()
  { int a[10]={},i,min,pos;
    for(i=0;i<10;i++)  scanf("%d",&a[i]);
     /************found************/
    min = a[0];
    pos = 0;
    for ( i=1; i<10; i++)
      if (min > a[i])
      {
	min = a[i];
  /************found************/
	pos = i;
      }
     printf("The min is:%d ,pos is:%d\n", min , pos);
  }

填空题

1

在程序编辑区编写程序,给定程序功能是:实现从键盘上输入若干学生的成绩,统计并输出最高成绩,当输入负数时结束输入。例如:
输入:60,70,80,90,100,-1
输出:100
程序有两个空(1)、(2)需要补充完整。并将程序调试出所需的结果。
注意:不要随意改动程序不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

int main(void) 
{
    int score, max;
    scanf("%d", &score); // 读取第一个成绩
    max = score; // 假设第一个成绩是最高成绩

    while (score >= 0) // (1) 条件改为 score >= 0,以便输入负数时结束输入
    {
        if (max < score) // (2) 如果当前成绩大于最高成绩,则更新最高成绩
            max = score;
        scanf("%d", &score); // 继续读取下一个成绩
    }

    printf("%d", max); // 输出最高成绩
    return 0;
}

2

在程序编辑区编写程序,给定程序功能是:
用递归将整数按逆序输出。
例如:
输入
12345
输出
54321

程序有两个空(1)、(2)需要补充完整。
并将程序调试出所需的结果。
注意:不要随意改动程序,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

void r(int m); // 函数声明应该放在 main 函数之前或者包含在头文件中

int main(void) 
{ 
    int n;
    scanf("%d", &n); // 读取一个整数
    r(n); // 调用函数 r
    return 0;
}

void r(int m) // 定义函数 r
{ 
    if (m < 0) m = -m; 

    printf("%d", m % 10); 
    if (m / 10 > 0) // 如果 m 还有十位或更高位数
    {
        r(m / 10); // 递归调用 r,打印 m 的其余位数
    }
}

2

在程序编辑区编写程序,给定程序功能是:
从键盘上输入若干个学生的成绩,统计出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。
例如
输入:
70 80 90 -1
输出:
ave = 80.00
-----------OUTPUT---------------
70.0
程序有两个空(1)、(2)需要补充完整。并将程序调试出所需的结果。
注意:不要随意改动程序,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
int main(void) 
	{ 
	    float x[100],sum=0,ave,a;
	    int n=0,i;
	    scanf("%f", &a);
	    while(a>=0.0 && n<100)
	    { 
	      sum+=a;
	      x[n]=a;
	      n++;     
	      scanf("%f", &a);
	    }
	    ave=sum/n;  
	    printf("ave = %.2f\n",ave);
        printf("-----------OUTPUT---------------\n");
	    for(i=0; i<n; i++)
	        if(x[i]<ave)  
	          printf("%.1f\n",x[i]);
	    return 0;
}

4

在程序编辑区编写程序,给定程序功能是:
从键盘上输入一字符串s,字符串s中包含若干个数字字符,将字符串s中的数字字符放入另一个数组d,最后将数组d中的字符串输出。
例如:
输入
abc13def24
输出
1324
程序有两个空(1)、(2)需要补充完整。并将程序调试出 所需的结果。
注意:不要随意改动程序,不得增行或删行,也不得更 改程序的结构!
例如:
输入:
abc123de678
输出:
123678

#include "stdio.h"  
#include "string.h"

int main(void) 
{ 
    char s[80], d[80]; 
    int i, j; 
    scanf("%s", s);         
    for (i = j = 0; s[i] != '\0'; i++) 
        if (s[i] >= '0' && s[i] <= '9') // ① 检查字符是否为数字
        {
            d[j] = s[i]; 
            j++;    
        } 
    d[j] = '\0'; // ② 在d数组的末尾添加空字符
    puts(d); 
    return 0;
}

5

查找n在数组a中最后一次出现的位置(数组首元素的位置为零)。
输入5个整数,将它们存入数组a中,再输入1个数n,然后在数组中查找n,
如果找到,输出n最后一次出现的相应下标,否则,输出“Not Found”。
例如:
输入
2 9 8 9 6 
9
输出
9  is  No. 3

输入
2 9 8 9 6 
5
输出
5 not found !
程序有两个空(1)、(2)需要补充完整。并将程序调试出所需的结果。
​注意:不要随意改动程序,不得增行或删行,也不得更改程序的结构!

#include  <stdio.h>

int main(void)
{ 
    int a[5];
    int i, k = -1, n, f = 0; // 初始化 k 为 -1,表示未找到
    for(i = 0; i < 5; i++) scanf("%d", &a[i]); // 读取5个整数存入数组a
    scanf("%d", &n); // 读取要查找的数n

    for(i = 4; i >= 0; i--) // 从数组末尾向前查找
    /************found************/
        if(a[i] == n) // (1) 检查数组元素是否等于n
        { 
            f = 1; // 找到n,设置f为1
            k = i; // (2) 记录n最后一次出现的位置
            break; // 找到后即退出循环
        }
    if(f)  
      printf("%d is No. %d\n", n, k); // 输出n和其最后一次出现的位置
    else  
      printf("%d not found !\n", n); // 未找到n,输出"Not Found"
     return 0; 
}

6

把数组a(大小为M)中前M-1个元素中的最小值放入a的最后一个元素中。
程序有两个空(1)、(2)需要补充完整。并将程序调试出所需的结果。
​注意:不要随意改动程序,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
#define M 11

int main()
{ 
    int a[M], i;
    for (i = 0; i < M - 1; i++)
        scanf("%d", &a[i]);
    a[M - 1] = a[0]; // 假设第一个元素是最小的

    for (i = 1; i < M - 1; i++) // (1) 遍历数组的其余元素,直到M-1
    /************found************/
        if (a[i] < a[M - 1]) // (2) 检查当前元素是否小于已知的最小值
            a[M - 1] = a[i]; // 更新最小值

    printf("Min is %d\n", a[M - 1]);
    return 0;  
}

7.

在程序编辑区编写程序,给定程序功能是:实现从键盘上输入若干学生的成绩,统计并输出最高成绩,当输入负数时结束输入。例如:

输入:60 70 80 90 100 -1

输出:100

程序有两个空(1)、(2)需要补充完整。并将程序调试出所需的结果。

注意:不要随意改动程序不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
int main(void) 
{
   int score, max;
   // (1) 初始化score并读取第一个成绩
   scanf("%d", &score);
   max = score; // 假设第一个成绩是最高成绩
   // (2) 循环条件,当输入的成绩大于0时继续循环
   while (score > 0)
   {
       if (max < score) 
           max = score; // 如果当前成绩高于最高成绩,则更新最高成绩
       scanf("%d", &score); // 读取下一个成绩
   }
   printf("%d", max); // 输出最高成绩
   return 0;
}

8

在程序编辑区编写程序,给定程序功能是:

求区间[200,2000]中所有回文数的和,回文数是正读与反读都一样的数,如525和1551。

程序有两个空(1)、(2)需要补充完整。并将程序调试出所需的结果。

注意:不要随意改动程序,不得增行或删行,也不得更 改程序的结构

#include <stdio.h>

int hws(long n)
{  
    long x = n, t = 0, k;
    while (x > 0)
    {  
        k = x % 10;
        t = t * 10 + k;
        x = x / 10;
    }
    // (1) 检查原始数和反转后的数是否相等
    if (n == t) return 1;
    else return 0;
}

int main(void) 
{ 
    long k, s = 0;
    // (2) 调用函数hws检查每个数是否是回文数,并累加
    for (k = 200; k <= 2000; k++)
        if (hws(k)) 
              s = s + k;
    printf("%ld ", s);
    return 0;
}

;