二级C语言-396
(总分100, 做题时间90分钟)
一、程序填空题
1. 
函数fun的功能是:在有n个元素的结构体数组std中,查有不及格科目的学生,到后输出学生的学号:函数的返回值是有不及格科目的学生人数。例如,主函数中给出了4名学生的数据,则程序运行的结果为:
学号:N1002 学号:N1006
共有2位学生有不及格科目
请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。
注意:源程序存放在 下的BLANK1. C中。不得增行或删行,也不得更改程序的结构!
#include <stdio. h>
typedef struct
{char num[8];
double score[2];
/**********found**********/
}______;
int fun(STU std[], int n)
{int i, k=0;
for(i=0; i<n; i++)
/**********found**********/
if(std[i]. score[0]<60
______ std[i]. score[1]<60)
{k++; printf("学号: %s
", std[i]. num);}
/**********found**********/
return ______;
}
main( )
{STU std[4]={"N1001", 76.5, 82. 0, "N1002", 53.5, 73.0,
"N1005", 80.5, 66. 0, "N1006", 81.0, 56.0};
printf("\n共有%d位学生有不及格科目\n", fun(std, 4));
}
    分值: 30
STU || k
答案考生文件夹 [解析] 本题中函数fun的功能是在有n个元素的结构体数组std中,查有不及格科目的学生,到后输出学生的学号;函数的返回值是有不及格科目的学生人数。这里用到了结构体,结构体在对于个人信息处理是有很方便的作用。只需要用到学生的分数和学号,所以这里的结构体的成员表列比较少。然后根据题目要求是要统计出不及格学生的人数并且查和统计他们的学号,这里用到if条件语句即可进行统计,要注意的是这里学科数,要求只要有一门学科不及格即进入统计,所以要正确地给出条件语句。最后输出学号和人数。

第一空:“{······}______;”这一空出现在定义结构体时,这里使用了typedef就是很明显地要声明结构体类型,而这里则是要填写结构体类型名。这里就要知道typedef。的作用了,typedef是用来命名已有类型的,相当于给已经知道的类型(如int float)一个新的类型名,而这里命名的是一个结构体,这不同于结构体的类型定义,大括号后面填写的不是变量名表列,而是结构体类型名,相当于给一个名称或者一种新的类型。而根据后面程序已给出的部分,我们能清楚的看到定义的结构体类型名是STU,所以这一空应该填的是“STU”。
第二空:
“if(std[i]. score[0]<60 ______ std[i]. score[1]<60);”这一空出现在fun函数中的if条件语句中,根据if后面的执行语句我们可以看到执行的人数的统计,所以这里应该就是在判断学生学科分数是否及格的条件语句。对于一开始的结构体定义我们能够发现成员score是长度为2的数组,所以每个学生应该是有两门学科的分数需要来判定和统计的,而这两门学科中任意一门分数不够的话都定义为不及格,然后统计进入人数中,这里所填空的两边是两门学科的分数低于60分,既然前面说了是任意一门低于60即进入统计,那这里就应该是“或”符号才符合要求,所以这一空应该填“||”。
第三空:“return(3);”这一空出现在fun函数中,这里要填写的是fun函数执行后的返回值。根据题目的要求函数是要查不及格的科目的学生,到学生学号,然后返回学生的人数,这一空前面已经执行了查,统计人数和学号的输出,所以这里应该返回的就是不及格学生的人数。而根据前面的定义,人数统计的变量名应该是k,所以这一空应该要填写的是“k”。
[考点] 结构体,typedef命名结构体类型,一维数组,for循环,if条件语句。
二、程序修改题
1. 
给定程序MODI1. C中,函数fun的功能是判断整数n是否是“完数”。当一个数的因子之和恰好等于这个数本身时,就称这个数为“完数”。例如:6的因子包括1、2、3,而6=1+2+3,所以6是完数。如果是完数,函数返回值为1,否则函数返回值为0。数组a中存放的是到的因子,变量k中存放的是因子的个数。
请改正函数fun中指定部位的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio. h>
int fun(int n, int a[], int *k)
{int m=0, i, t;
t=n;
/**********found**********/
for(i=0; i<n; i++)
if(n%i==0)
{a[m]=i; m++; t=t-i;)
/**********found**********/
k=m;
/**********found**********/
if(t=0) return 1;
else return 0;
}
main( )
{int n, a[10], flag, i, k;
printf("请输入一个整数: ");
scanf("%d", &n);
flag=fun(n, a, &k);
if(flag)
{printf("%d是完数,其因子是:", n);
for(i=0; i<k; i++)
printf("%d", a[i]);
printf("\n");
}
else printf("%d不是完数.\n", n);
}
    分值: 30
for(i=0; i(n; i++)改为for(i=1; i<n, i++)
k=m;改为*k=m;
if(t=0)改为if(t==0) [解析] 本题的fun函数主要功能是:是判断整数n是否是“完数”。当一个数的因子之和恰好等于这个数本身时,就称这个数为“完数”。(例如:6的因子包括1、2、3,而6=1+2+3,所以6是完数)如果是完数,函数返回值为1,否则函数返回值为0。数组a中存放的是到的因子,变量k中存放的是因子的个数。这里是一个条件判断问题,原理上利用条件if条件语句和for循环得到结果,结果则是用数组输出完数的因子,用k变量输出因子的个数。
这里fun( )函数为了判定这个数字是否为完数,一定要使用正确的循环,这个判断条件还是需要一定的步骤的。最重要的就是注意细节
(1)第一个错误在fun( )函数的for循环中,这里的循环的就是输入数字n的因式,很明显的一个问题就是循环的起始值有问题,这从i=0开始就违反了最基本的四则运算,0不可能是其他整数的因式,也没有意义。所以这里应该将“i=0”改为“i=1”。
(2)第二个错误在fun( )函数中数字经过for循环过后,这里“k=m”,是为了得到“k”的值,也就是因子的个数。但是要注意的细节是在fun( )函数中的参数是“*k”,也就是说k只是一个指针变量,而不是我们所需要的因子个数的变量,所以这里我们应该使用的是“*k”,即将“k=m”改为
“*k=m”。
(3)第三个错误在fun函数第二个if条件语句中,这里“f(t=0)return 1;”的t是数字减掉因子和的值,也就是说只要是t等于0就代表输入的数字是一个完数,这里原本的意图就是在得到因子的和之后判断数字是否为完数。但是又有一个细节没有注意到的就是在if条件语句中,等于号应该是“==”,而不是普通的“=”,所以这里应该将“if(t=0)”改为“if(t=0”。)
[考点] 指针,if条件语句,for循环
三、程序设计题
1. 
请编写函数fun:在形参指针所指的4个整数中出最大值和最小值,最大的放在a中,最小的放在d中。
注意:部分源程序存在PROG1. C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio. h>
void NONO( );
void fun(int *a, int *b, int*c, int *d)
{
}
main( )
{int a, b, c, d;
printf("请输入4个整数: ");
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("原始顺序: %d, %d, %d, %d\n", a, b, c, d);
fun(&a, &b, &c, &d);
printf("处理后: %d, %d, %d, %d\n", a, b, c, d);
NONO( );
}
void NONO( )
{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/
FTLE *fp, *wf;
int i, a, b, c, d;
fp=fopen
("C:\\WEXAM\\24990001\\in. dat", "r");
wf=fopen
("C:\\WEXAM\\24990001\\out. dat", "w");
for(i=0; i<5; i++)
{
fscanf(fp, "%d%d%d%d", &a, &b, &c, &d);
fun(&a, &b, &c, &d);
fprintf(wf, "a=%d, d=%d\n", a, d);
}
fclose(fp);
fclose(wf);
}
printf函数返回值    分值: 40
#include <stdio. h>
void NONO( );
void fun
(int *a, int *b, int *c, int *d)
{ int t;
if(*a<*b) {t=*a; *a=*b; *b=t;}
if(*a<*c) {t=*a; *a=*c; *c=t;}
if(*a<*d) {t=*a; *a=*d; *d=t;}
if(*b<*c) {t=*b; *b=*c; *c=t;}
if(*b<*d) {t=*b; *b=*d; *d=t;}
if(*c<*d) {t=*c; *c=*d; *d=t;}
}
main( )
{int a, b, c, d;
printf("请输入4个整数:");
scanf("%d%d%d%d", &a, &b, &c, &d);
print"原始顺序: %d, %d, %d, %d\n", a, b, c, d);
fun(&a, &b, &c, &d);
printf("排序后:%d, %d, %d, %d\n", a, b, c, d);
NONO( );
}
void NONO( )
{FILE *fp, *wf;
int i, a, b, c, d;
fp=fopen
("c:\\WEXAM\\24990001\\in. dat", "r");
wf=fopen
("c:\\WEXAM\\24990001\\out. dat", "w");
for(i=0, i<5; i++)
{
fscanf(fp, "%d%d%d%d", &a, &b, &c, &d);
fun(&a, &b, &c, &d);
fprintf(wf, "a=%d, d=%d\n", a, d);
}
fclose(fp);
fclose(wf);
} [解析] 本题中的函数功能主要是在形参指针所指的4个整数中出最大值和最小值,最大的放在a中,最小的放在d中。这个题目类似于排序,但是又不是严格的排序,只要重新排序最大值和最小值的位置即可。所以类似于排序,这一题需要相互比较4个数字,然后进行位置的调换。基本思路就是比较相邻的两个数字,如果靠近a的数字比靠近d的数字要大,就不用进行交换,如果靠近a的数字比靠近d的数字小,就进行交换,这样的话最大的数字就会慢慢交换到a的位置,然后最小的数字就会慢慢交换到d的位置。所以根据分析我们就要用到if语句来进行判断和处理,只要经过几轮的if判断大小然后交换,就能实现题目条件所给出的位置的重置,得到要求的结果。
首先在主函数main中我们需要的就是四个数字,这四个数字需要手动输入,件程序代码第13~15行,四个数字输入完城后就可以进入fun函数进行数据处理了。进入到fun函数中,只要从a到d进行比较,按照一开始的规则即可,如果a大于b,不变,比较a与c,若a小b,a与b交换位置,交换过后a就大于b了,这样就进行a与c的比较;a与c的比较同理,这样的循环比较,就能发现,每比较一次,较大的数字就能交换到a的位置,较小的数字就离a越来越远,也就是到了d的位置,这样就完成了题目所给出的要求了,最大的数字放在a中,最小的数字放在d中。当新的排序排好后,就可以返回主函数进行输出了。
[考点] if循环语句、排序

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。