文章目录
20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises29
程序改错与填空要求
给出的程序可能存在语法或算法上的问题或需要补充完整,但需要修改的地方肯定在/*******Found*******/下的第一行上,不能修改其它地方,不能修改或删除/*******Found*******/本身,遵循最少修改、符合编程规范、较通用(非别出心裁)、保持一行一条语句及{与}单独一行的原则。由于是计算机自动阅卷,修改时不能增加行或删除行,哪怕是一个空行都不行,否则可能得0分。
注意:(1)若/*******Found*******/下有___________,则应当将___________去掉并填上相应的程序代码。
(2)程序应当在Turbo C V2/V3、MS VC V6或GCC V3中完成编译链接并能正常运行。
具体要求
程序改错与填空:给出的程序可能存在语法或算法上的问题或需要补充完整,答题时请务必遵循以下原则:
(1)需要修改的地方肯定在/*******Found*******/下的第一行上,不能修改其它地方,不能修改或删除/*******Found*******/本身;
(2)若/*******Found*******/下有___________,则应当将___________去掉并填上相应的程序代码;
(3)修改时不能增加行或删除行,哪怕是一个空行都不行,否则可能得0分;
(4)遵循算法处理较通用(不能别出心裁)、最少修改的原则,例如对程序正确性无影响的修改就不能实施,明显不该加的括号就不能加,尽可能去掉不必要的括号;
(5)修改要符合编程规范、保持一行一条语句及{与}单独一行的原则;
(6)程序应当在Turbo C V2/V3、MS VC V6或GCC V3中完成编译链接并能正常运行。
本题共有 25 个小题,每小题 4 分。
具体题面
程序D1.c的功能是从键盘读入一个数并在屏幕上显示。
D1
原题
#include<stdio.h>
int main(void)
{
int xy2;
/*********Found************/
scanf("%s", &xy2);
/*********Found************/
printf("xy2=%5d\n", &xy2);
return 0;
}
改后:
#include<stdio.h>
int main(void)
{
int xy2;
/*********Found************/
scanf("%d", &xy2); // 知识点:整数格式化输出
/*********Found************/
printf("xy2=%5d\n", xy2); //知识点:地址输出与地址里的值输出是不一样的
return 0;
}
程序D2.c的功能是调用函数,显示两个实数间最大的一个。
D2
原题
#include<stdio.h>
float fmax(float x, float y);
int main(void)
{
/*********Found************/
float l, 1;
l = 3.0;
i = 5.6f;
/*********Found************/
printf("fmax(%5.2f, %5.2f)=%5.2f\n", i, l, fMax(i, l));
return 0;
}
/*********Found************/
int fmax(float x, float y)
{
if (x < y) return y;
else return x;
}
改后
#include<stdio.h>
float fmax(float x, float y);
int main(void)
{
/*********Found************/
float l, i; // 知识点:变量要先定义,再使用,常量不需要定义,直接使用
l = 3.0f;
i = 5.6f;
/*********Found************/
printf("fmax(%5.2f, %5.2f)=%5.2f\n", i, l, fmax(i, l)); // C语言对大小写敏感
return 0;
}
/*********Found************/
float fmax(float x, float y) // 函数头,返回值要与需求一致
{
if (x < y) return y;
else return x;
}
程序D3.c的功能是将字符串yy在屏幕上输出。
D3
原题
#include<stdio.h>
int main(void)
{
/*********Found************/
char yy[200] = "ok??\n";
/*********Found************/
fol (; *yy; yy++)
{
putchar(*yy);
}
return 0;
}
改后
#include<stdio.h>
int main(void)
{
/*********Found************/
char *yy = "ok??\n"; // 后面的使用,是可以移动的指针,这里使用指针,不用数组名
/*********Found************/
for (; *yy; yy++) // 关键字不能写错,for
{
putchar(*yy);
}
return 0;
}
程序D4.c的功能是计算半径为2+3的圆的面积。
D4
原题
#include<stdio.h>
#define PI 3.14
/*********Found************/
#define S(bj) PI*bj*bj
int main(void)
{
/*********Found************/
int mianJi;
mianJi = S(2+3);
printf("mian ji=%5.2f\n", mianJi);
return 0;
}
改后
#include<stdio.h>
#define PI 3.14
/*********Found************/
#define S(bj) PI*(bj)*(bj) // 宏定义要给参数加上括号
int main(void)
{
/*********Found************/
float mianJi; // 业务要求使用浮点型数据
mianJi = S(2+3);
printf("mian ji=%5.2f\n", mianJi);
return 0;
}
程序D5.c的功能是将字符串yy显示在屏幕上。
D5
原题
#include<stdio.h>
int main(void)
{
/*********Found************/
char yy[100] = "ok??\n",
/*********Found************/
prntf("%s", yy);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
/*********Found************/
char yy[100] = "ok??\n"; // 语句的标志是分号
/*********Found************/
printf("%s", yy); // 基本的函数名不能搞错
return 0;
}
程序D6.c的功能是从键盘读入一行字符(包括空格、TAB等字符)并在屏幕上显示。
D6
原题
#include<stdio.h>
int main(void)
{
/*********Found************/
char yy<128>;
/*********Found************/
getchar(yy);
/*********Found************/
printf("%y", yy);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
/*********Found************/
char yy[128]; // 数组的标志是方括号
/*********Found************/
gets(yy); // 输入一个字符串,不是一个字符
/*********Found************/
printf("%s", yy); // 输出字符串的格式是%s
return 0;
}
程序D7.c的功能是判断x和y是否相等,相等则显示x=y,不等则显示x<>y。
D7
原题
#include<stdio.h>
int main(void)
{
/*********Found************/
char x, y;
x = 39270;
y = 41001;
/*********Found************/
if (x != y)
{
printf("x=y");
}
/*********Found************/
else;;
{
printf("x<>y\n");
}
return 0;
}
改后
#include<stdio.h>
int main(void)
{
/*********Found************/
int x, y; // 业务要求使用整数
x = 39270;
y = 41001;
/*********Found************/
if (x == y) // 业务逻辑判断不能搞反了
{
printf("x=y");
}
/*********Found************/
else // 分支后直接跟分号,就成了什么也不做的空语句了
{
printf("x<>y\n");
}
return 0;
}
程序D8.c的功能是打开文件d:\te.c用于读并判断打开是否成功。
D8
原题
#include<stdio.h>
int main(void)
{
FILE *fp;
/*********Found************/
char fileName[] = "d:\te.c";
/*********Found************/
fp = fopen(fileName, "w");
/*********Found************/
if (fp is NULL)
{
puts("File Open Error!");
return 1;
}
putchar(fgetc(fp));
fclose(fp);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
FILE *fp;
/*********Found************/
char fileName[] = "d:\\te.c"; // 这里的反斜杠,在字符串也就是双引号里,被解释为转义的开头,所以要用“双反斜杠”来表示“反斜杠”
/*********Found************/
fp = fopen(fileName, "r"); // 业务是读文件,不是写文件,使用“r”模式即可
/*********Found************/
if (fp == NULL) // 判断为NULL使用等号,C语言没有is谓词
{
puts("File Open Error!");
return 1;
}
putchar(fgetc(fp));
fclose(fp);
return 0;
}
程序D10.c的功能是将字符串str2显示在屏幕上。
D10
原题
#include<stdio.h>
/*********Found************/
#define START
/*********Found************/
#define NEXT
int main(void)
{
char *str2 = "13125176247";
const int i = 0;
for (printf("\n"); str2[i]; )
START
putchar(str2[i]);
/*********Found************/
i++;
NEXT
return 0;
}
改后
#include<stdio.h>
/*********Found************/
#define START { // 使用宏定义实现替换
/*********Found************/
#define NEXT } // 使用宏定义实现替换
int main(void)
{
char *str2 = "13125176247";
const int i = 0;
for (printf("\n"); str2[i]; )
START
putchar(str2[i]);
/*********Found************/
str2++; // i已经锁死为0,不能偏移,只能移动指针本身
NEXT
return 0;
}
程序D11.c的功能是计算1/1 + 1/2 + … + 1/N之和并显示。
D11
原题
#include<stdio.h>
#define N 10
int main(void)
{
/*********Found************/
long jieguo = 0;
int fm;
for (fm = 1; fm <= N; fm++)
{
/*********Found************/
jieguo += 1 / fm;
}
printf("%8.6f\n", jieguo);
return 0;
}
改后
#include<stdio.h>
#define N 10
int main(void)
{
/*********Found************/
float jieguo = 0; // 精度要求,只能是float型
int fm;
for (fm = 1; fm <= N; fm++)
{
/*********Found************/
jieguo += 1 /(float)fm; // 为了保证精度,一定要先转换,再计算
}
printf("%8.6f\n", jieguo);
return 0;
}
程序D12.c的功能是从键盘读入a和b的值(输入格式限定为仅a,b),在屏幕上显示b行a。
D12
原题
#include<stdio.h>
int main(void)
{
int a, b;
/*********Found************/
scanf("%d%d", &a, &b);
while (b > 0)
/*********Found************/
___________
printf("%d\n", a);
b--;
/*********Found************/
___________
printf("bye bye!\n");
return 0;
}
改后
#include<stdio.h>
int main(void)
{
int a, b;
/*********Found************/
scanf("%d,%d", &a, &b); // 题干的输入格式要求有逗号
while (b > 0)
/*********Found************/
{
// 循环体开头
printf("%d\n", a);
b--;
/*********Found************/
} // 循环体结束
printf("bye bye!\n");
return 0;
}
程序D13.c的功能是从键盘输入最多10个字符(遇换行则停止输入)到数组Buf中,然后在屏幕上显示。
D13
原题
#include<stdio.h>
int main(void)
{
char c, Buf[11];
int pos;
/*********Found************/
for (pos = 1; pos <= 10; pos++)
{
/*********Found************/
if ((c = getchar() == '\n')
{
break;
}
Buf[pos] = c;
}
/*********Found************/
___________
printf("%s\n", Buf);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
char c, Buf[11];
int pos;
/*********Found************/
for (pos = 0; pos < 10; pos++) // 循环操作数组元素时,起点和终点要准,否则越界
{
/*********Found************/
if ((c = getchar()) == '\n') // 遇到回车就结束,“运算符赋值”要先完成运算
{
break;
}
Buf[pos] = c;
}
/*********Found************/
Buf[pos] = '\0';
printf("%s\n", Buf);
return 0;
}
程序D14.c的功能是调用函数swap,将a和b的值交换,最后在屏幕上显示交换后的a,b之值。
D14
原题
#include<stdio.h>
/*********Found************/
void swap(int x, int y);
int main(void)
{
int a = 3, b = 4;
/*********Found************/
swap(a, b);
printf("a=%d b=%d\n", a, b);
return 0;
}
/*********Found************/
void swap(int x, int y)
{
int tmpX;
/*********Found************/
___________
*x = *y;
/*********Found************/
*y = x;
}
改后
#include<stdio.h>
/*********Found************/
void swap(int *x, int *y); // 要真正实现实参值交换,要将实参地址传入
int main(void)
{
int a = 3, b = 4;
/*********Found************/
swap(&a, &b); // 传入地址,完成对实参的值的交换
printf("a=%d b=%d\n", a, b);
return 0;
}
/*********Found************/
void swap(int *x, int *y) // 函数头与声明一致
{
int tmpX;
/*********Found************/
tmpX = *x; // 交换的是值,使用取值运算符
*x = *y;
/*********Found************/
*y = tmpX; // 交换的是值,使用取值运算符
}
程序D15.c的功能是调用函数swap,将a和b的值交换,最后在屏幕上显示交换后的a,b之值。
D15
原题
#include<stdio.h>
void swap(int *x, int *y);
int main(void)
{
int a = 3, b = 4;
/*********Found************/
swap(*a, *b);
/*********Found************/
printf("a=%d b=%d\n", &a, &b);
return 0;
}
void swap(int *x, int *y)
{
int *tmp, tsX;
/*********Found************/
*tmp = x;
*x = *y;
/*********Found************/
*y = *tmp;
}
改后
#include<stdio.h>
void swap(int *x, int *y);
int main(void)
{
int a = 3, b = 4;
/*********Found************/
swap(&a, &b); // 实参传地址,要取地址来传入
/*********Found************/
printf("a=%d b=%d\n", a, b); // 输出是值,不是地址编号
return 0;
}
void swap(int *x, int *y)
{
int *tmp, tsX;
/*********Found************/
tsX = *x; //交换的是值,这个题有坑,tmp是多余的指针变量,混淆视听
*x = *y;
/*********Found************/
*y = tsX;
}
程序D16.c的功能是worker2的信息使用结构体存储,从键盘读入其各项信息并显示。
D16
原题
#include<stdio.h>
int main(void)
{
struct WKER
{
long ID;
long int num;
char name[20];
char sex;
/*********Found************/
} ;
worker2.ID = 1L;
/*********Found************/
scanf("%s %s %s", &worker2.num, worker2.name, &worker2.sex);
/*********Found************/
printf("worker's info: num=%s name=%s sex=%s\n",
worker2.num, worker2.name, worker2.sex);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
struct WKER
{
long ID;
long int num;
char name[20];
char sex;
/*********Found************/
} worker2; // 在完成结构体类型声时后,再直接完成结构体变量的定义
worker2.ID = 1L;
/*********Found************/
scanf("%ld %s %c", &worker2.num, worker2.name, &worker2.sex);// 格式要一致
/*********Found************/
printf("worker's info: num=%ld name=%s sex=%c\n", // 格式要一致
worker2.num, worker2.name, worker2.sex);
return 0;
}
程序D18.c的功能是从键盘上读入10个大于0的数,调用函数dispMaxNum显示其中最大的一个。
D18
原题
#include <stdio.h>
int maxiNum = 0;
void dispMaxNum();
int main(void)
{
int i, oneNumber, maxNumber = 0;
printf("Please input 10 int number:");
{
int maxNumber = 0;
/*********Found************/
___________
for (i = 0; i < 10; i++)
{
scanf("%d", &oneNumber);
if (oneNumber > maxNumber)
{
maxNumber = oneNumber;
}
}
}
/*********Found************/
___________
/*********Found************/
___________
dispMaxNum();
return 0;
}
void dispMaxNum()
{
/*********Found************/
printf("maxNumber=%d\n", maxNumber);
}
改后
#include <stdio.h>
int maxiNum = 0;
void dispMaxNum();
int main(void)
{
int i, oneNumber, maxNumber = 0;
printf("Please input 10 int number:");
{
int maxNumber = 0;
/*********Found************/
{
// 形成作用域
for (i = 0; i < 10; i++)
{
scanf("%d", &oneNumber);
if (oneNumber > maxNumber)
{
maxNumber = oneNumber;
}
}
}
/*********Found************/
maxiNum = maxNumber; // 使用全局变量
/*********Found************/
} // 关闭作用域
dispMaxNum();
return 0;
}
void dispMaxNum()
{
/*********Found************/
printf("maxNumber=%d\n", maxiNum); // 使用全局变量
}
程序D1000.c的功能是从键盘输入3个浮点数a,b,c(输入时abc之间以空格相隔),首先按照输入顺序显示在屏幕上,然后按从小到大顺序把它们输出到屏幕上。
D1000
原题
#include<stdio.h>
int main(void)
{
float a, b, c, t;
printf("please input three numbers:\n");
/*********Found************/
scanf("%f%f", &a, &b, &c);
printf("before sort:a=%g,b=%g,c=%g\n", a, b, c);
if (a > b)
{
t = a;
a = b;
/*********Found************/
b = a;
}
if (a > c)
{
t = a;
a = c;
c = t;
}
if (b > c)
{
t = b;
b = c;
c = t;
}
printf("after sort:a=%g,b=%g,c=%g\n", a, b, c);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
float a, b, c, t;
printf("please input three numbers:\n");
/*********Found************/
scanf("%f%f%f", &a, &b, &c); // 格式数量要与参数数量一致对应
printf("before sort:a=%g,b=%g,c=%g\n", a, b, c);
if (a > b)
{
t = a;
a = b;
/*********Found************/
b = t; // 算法要求如此
}
if (a > c)
{
t = a;
a = c;
c = t;
}
if (b > c)
{
t = b;
b = c;
c = t;
}
printf("after sort:a=%g,b=%g,c=%g\n", a, b, c);
return 0;
}
程序D1001.c的功能是求分数序列:2/1,3/2,5/3,8/5,13/8,21/13,....前20项之和,要求显示的结果中小数部分有4位。
D1001
原题
#include<stdio.h>
#define T 20
int main(void)
{
int n;
/*********Found************/
long i, j, temp, sum;
i = 2;
j = 1;
sum = 0;
for (n=1; n<=T; n++)
{
sum = sum + i / j;
temp = i;
i = i + j;
j = temp;
}
/*********Found************/
printf("2/1+3/2+5/3+8/5+13/8+...=%5.2f\n", sum);
return 0;
}
改后
#include<stdio.h>
#define T 20
int main(void)
{
int n;
/*********Found************/
float i, j, temp, sum; // 精度要求
i = 2;
j = 1;
sum = 0;
for (n=1; n<=T; n++)
{
sum = sum + i / j;
temp = i;
i = i + j;
j = temp;
}
/*********Found************/
printf("2/1+3/2+5/3+8/5+13/8+...=%5.4f\n", sum); // 四位小数
return 0;
}
程序D1002.c的功能是实现两数交换。
D1002
原题
#include<stdio.h>
int main(void)
{
int x = 5, y = 9;
x = x + y;
y = x - y;
/*****Found*****/
x = y - x;
printf("x=%d, y=%d\n", x, y);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
int x = 5, y = 9;
x = x + y;
y = x - y;
/*****Found*****/
x = x - y; // 算法如此
printf("x=%d, y=%d\n", x, y);
return 0;
}
程序D1003.c的功能是将16进制数100转换为10进制数输出。
D1003
原题
#include<stdio.h>
int main(void)
{
/*****Found*****/
int i = 100;
/*****Found*****/
printf("%d\n", &i);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
/*****Found*****/
int i = 0x100; // 十六进制以0x开头来表示
/*****Found*****/
printf("%d\n", i); // 输出值,不是地址编号
return 0;
}
程序D1004.c的功能是输入姓名,屏幕输出问候。
D1004
原题
#include<stdio.h>
int main(void)
{
char s[10];
printf("please input your name:");
/*********Found************/
scanf("%c", s);
printf("hello ");
/*********Found************/
puts(s[10]);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
char s[10];
printf("please input your name:");
/*********Found************/
scanf("%s", s); // %s是字符串,%c是字符
printf("hello ");
/*********Found************/
puts(s); // 输出串,给出数组名即可
return 0;
}
程序D1005.c的功能是从键盘读入两个整数并在屏幕上显示。要求:输入时限定两数之间仅以逗号隔开。
D1005
原题
#include<stdio.h>
int main(void)
{
int a, b;
/*********Found*********/
scanf("%d%d", &a, &b);
/*********Found*********/
printf("a=%d,b=%d\n", &a, &b);
return 0;
}
改后
#include<stdio.h>
int main(void)
{
int a, b;
/*********Found*********/
scanf("%d,%d", &a, &b); // 输入格式要求有逗号
/*********Found*********/
printf("a=%d,b=%d\n", a, b); // 输出值
return 0;
}
程序D1006.c的功能是判断输入的数据是否与已经给出的数据j相等。
D1006
原题
#include<stdio.h>
int main(void)
{
long int i = 79870, j = 23;
/*****Found*****/
scanf("%f", &i);
/*****Found*****/
if (j == i);
{
printf("Equal!");
}
else
{
printf("Not equal!");
}
return 0;
}
改后
#include<stdio.h>
int main(void)
{
long int i = 79870, j = 23;
/*****Found*****/
scanf("%ld", &i); // long类型是%ld格式
/*****Found*****/
if (j == i) // 空语句不可取
{
printf("Equal!");
}
else
{
printf("Not equal!");
}
return 0;
}
程序D1007.c的功能是使用getchar方式从键盘读入一个字符,判断该字符是否大写字符。
D1007
原题
#include<stdio.h>
int main(void)
{
char ch;
/****Found****/
getchar(ch);
/*****Found*****/
if ('A' <= ch, ch <= 'Z')
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
改后
#include<stdio.h>
int main(void)
{
char ch;
/****Found****/
ch = getchar(); // 要使用输入的方式完成对ch的初始化
/*****Found*****/
if ('A' <= ch && ch <= 'Z')
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
程序D1008.c的功能是判断用户是不是输入的整数0。
D1008
原题
#include<stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
/****Found****/
switch (n);
{
/****Found****/
case0:
printf("Zero\n");
break;
default:
printf("Non-Zero");
break;
}
return 0;
}
改后
#include<stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
/****Found****/
switch (n) // 语法要求这里不能有";"
{
/****Found****/
case 0: // 语法要求
printf("Zero\n");
break;
default:
printf("Non-Zero");
break;
}
return 0;
}