厦门大学《C语言程序设计》课程试卷 信息科学与技术学院 系 2013 年级 专业
已经反复修改调试过了,应该没问题了。如果对答案有什么疑问可以直接私戳我 qq553915228 李添锐
主考教师: 试卷类型:(A卷) 一、 写出下列程序段的运行结果(40分)
1.(4分) 4.(4分)
int i=1, j=2, k=4; int printf(\p[7]={11,13,15,17,18,20,23}, printf(\i=0,k=0; k+=(i+k)/10+0.5 ; for (;p[i]%2;) printf(\ { printf(\ switch(p[i]%5) 输出:1.000000,1,(此处有空格)4,2 {
case 1: k+=p[i++]; break;
case 3: k+=p[i]; 2.(4分) default: i++;
} char a=0x12303F;
} printf(\
printf(\a='a'-'B'+'E';
printf(\输出:4,24 输出:63,c 5.(4分) char s[]=\3.(4分) for (p=s+3; p>s; p--) int i = 3, j = 2; { if (!i&&i--) printf(\ i+=2; } i++; 输出:4,34,234, printf(\ do{j+=i; 6.(4分) i/=2; int f() if(j>8) break; { } while(i=3); static int j=1; int k=1; printf(\ return ((++j)+(++k)); 输出:4,9(此处需要换行即\\n) } int main()
1
{
int i;
for (i=0; i<3; i++) printf(\ return 0; }
输出:4,5,6,
7.(4分)
void fun(int i) {
if (i) {
fun(i-3);
printf(\
} }
int main() {
fun(9); return 0; }
输出:3,6,9,
8.(4分) union {
struct { int a,b,c; } s; int a[3]; }u;
int main() {
u.s.a=0; u.s.b=1; u.s.c=2; 二、 改错题(20分)
*(u.a+1)=3; u.a[2]=4; printf(%u.s.a, u.s.b);
return 0; }
输出 0,3 9.(4分)
int s[3][3]= {1,2,3,4,5,6,7,8,9}; int sum;
sum = *(s[0]) + *(s[1]+1) + *(s[2]+2);
printf(\return 0;
输出:15
10.(4分)
FILE *fp; int e; long len; char c; fp=fopen(\fputs(\fclose(fp);
fp=fopen(\fscanf(fp,\len=ftell(fp);
fseek(fp, -1L, SEEK_END); len = ftell(fp)-len; printf(\
输出:6
已知数据文件“c:\\data.dat”以二进制方式存有300个整数,函数readDat( )把这些数存入数组a中,函数fun( )的功能是:依次从数组a中取出一个数,若该数连续大于它之前的五个数且该数是偶数(若之前不满五个数,则不统计),统计满足此条件的个数cnt,并把这些数按从大到小的顺序存入数组b中。
程序中包含若干个错误,请指出程序中的错误并更正。提示:程序30行之前存在
2
8个错误。
#include
#define MAX 300; /*第2行*/ 去掉分号; int a[MAX], b[MAX], cnt ; /*第3行*/ void fun( ) /*第4行*/ { /*第5行*/ int I, j, flag; /*第6行*/
for(I=5;I if(a[I]>a[j]& a[I]%2==0) flag=1; /*第10行*/ &应该双写 else /*第11行*/ { /*第12行*/ flag=0; /*第13行*/ continue; /*第14行*/ } /*第15行*/ if(flag==1) b[cnt++]=a[I]; /*第16行*/ } /*第17行*/ for(I=0;I if(b[I]>b[j]) /*第20行*/>改成< { /*第21行*/ b[I]=b[j]; /*第22行*/将22行与23行对调 flag=b[I]; /*第23行*/ b[j]=flag; /*第24行*/ } /*第25行*/ } /*第26行*/ int main() /*第27行*/ { /*第28行*/ int i ; /*第29行*/加一个函数声明 void readDat(); readDat( ); /*第30行*/ fun( ); /*第31行*/ printf(\ /*第32行*/ for(i = 1 ; i < cnt ; i++) /*第33行*/ i=0 printf(\ /*第34行*/ 3 printf(\ /*第35行*/ return 0; /*第36行*/ } /*第37行*/ void readDat() /*第38行*/ { /*第39行*/ int i ; /*第40行*/ FILE *fp ; /*第41行*/ if ((fp=fopen(“c:\\data.dat”, “rb”))==NULL) /*第42c:\\\\data.dat 注意双写\\ { /*第43行*/ printf(\/*第44行*/ exit(0); /*第45行*/ } /*第46行*/ for(i = 0 ; i < MAX ; i++) /*第47行*/ fscanf(fp, \ /*第48行*/加上fclose(fp); } /*第49行*/ 本题20分 应该是有10处错 三、编程题(40分) 注意:程序中请添加必要的注释 行*/ 1、某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。例如:输入2468,输出3197(12分) 解:本题较简单,按照题目所述编写代码即可 #include char a[4]; //因为是直接输入2468输出3197 所以我们要用字符串 int i; scanf(\for(i=0;i<4;i++) { 4