程序设计基础07-08春试题及答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(073 试卷) 5 / 13
fib( n-2, &f1 ); fib( n-1, &f2 ); *s=f1+f2; } } main() { long fn; int n; scanf( “%d”, &n ); fib( n, &fn ); printf( “f(%d)=%ld\n”, n, fn ); } 输入:9 输出:? (9)程序 #include <stdio.h> main() { FILE *fp; int i,a[10] = { 11,22,33,44,55,66,77,88,99,100 }; fp = fopen( "test.dat", "wb" ); fwrite( a, sizeof(int), 10, fp ); fclose( fp ); fp = fopen( "test.dat", "rb" ); for ( i = 0; i < 4; i++ ) fread( &a[i+3], sizeof(int), 1, fp ); for ( i = 0; i < 3; i++ ) fread( &a[i+1], sizeof(int), 1, fp ); fclose( fp ); for ( i = 0; i < 10; i++ ) printf( "%d ", a[i] ); } 假设文件操作总是成功。 输出:?
姓名: 二 36 三 8 四 12
学院/教师: 卷面 77 上机 23 总分 100
考生须知: 1. 试卷和答题纸上的”学号、姓名、学院、教师”都要填上; 2. 所有答题内容都写在答卷纸上,交卷时将试卷和答卷纸一起交上; 3. 不遵守上述要求者考试成绩将为零分。 4. 本卷考试的得分为卷面分,电脑上机考试(另行安排)的得分为上 机分,考试成绩为卷面分与上机分之和。
一、基础题(21 分,第 1 小题 3 分,其它每小题 2 分)
1.以下所有项中哪三项是合法的 C 语言变量名:_int、a[i]、*p、 long、Sum、a2.1、“abc”、b12、3s。 2.设 a 和 b 为正整数,分别写出判断表达式:a 和 b 都不是偶数; a 和 b 至少有一个是偶数。 3. 计算位运算表达式的值, 结果用十进制描述: 100^200、 100&36。 4.定义 char s[]=“12345AbCdE”; 分别写出 printf(“%s”, &s[4]); 和 printf(“%c”, *(s+7)+1); 的结果。 5.定义 int x=111, y=112; 写出执行语句 x+=x==y--?--y:++x; 后 x 和 y 的值。 6.写出 printf(“%d,%u,%x,%o”, -1,-1,-1,-1); 的结果。 7.定义 int i=0; 写出执行语句 while(i++<10); 后的 i 的值。 8.定义 int a[]={1,3,5,7,9,11,13,15,17,19}, *p=&a[3]; 分别计算表达 式 (&a[8] - &p[-2]) 和 (*(a+7)-*(p+2)) 的值。 9.定义 char s[20]=“string\061\nstring\062”; 写出 printf(“%d”, strlen(s)); 和 printf(“%d”, sizeof(s)); 的结果
ቤተ መጻሕፍቲ ባይዱ
二、阅读程序(36 分,每小题 4 分)
仔细阅读下列程序,将各程序的运行结果写在答卷纸上。 (1)程序 #include <stdio.h> main() { int a, b; scanf(“%d %d”, &a, &b); while ( a!=b ) if ( a>b ) a = a-b; else b = b-a; printf(“%d\n”, a); } 输入: 30 54 输出:? (2)程序 #include <stdio.h> #include <string.h> main() { int i, j, n; char s[20], t; gets(s); n = strlen(s); for ( i = n; i > 0; i-- ) { t = s[n-1]; for ( j = n-1; j > 0; j-- ) s[j] = s[j-1]; s[j] = t;
(073 试卷) 4 / 13
} 输出:? (7)程序 #include <stdio.h> #include <stdlib.h> main() { int *a, n, m, i, j, t; scanf( “%d%d”, &n, &m ); a=(int *)malloc(n*sizeof(int)); for(i=0; i<n; i++) scanf( “%d”, &a[i] ); for(i=0; i<m; i++) { t=a[n-1]; for(j=n-1; j>0; j--) a[j]=a[j-1]; a[j]=t; } for(i=0; i<n; i++) printf( “%d ”, a[i] ); printf( “\n” ); } 输入:10 6 1 2 3 4 5 6 7 8 9 0 输出:? (8)程序 #include “stdio.h” void fib( int n, long *s ) { long f1, f2; if( n==1||n==2 ) *s=1; else {
(073 试卷) 6 / 13
三、改错程序(8 分,每错误点 2 分)
下列程序各有两个错误(两个错误分别是在不同的行上,并只在有 注解行号所标注的行上) ,按原来程序的要求,纠正错误,并将错 误所在行号以及错误行完整的正确内容写在答卷纸的对应栏内。 (1)以下程序是在 5 个字符串中求最小字符串并输出结果。 #include <string.h> #include <stdio.h> main() { char *min,*s[5]={ “int”,“short”,“long”,“char”, “float” }; int i; /*1*/ min=s[0]; /*2*/ for ( i=1; i<5; i++) /*3*/ if( min>s[i] ) /*4*/ min=s[i]; /*5*/ printf("%s\n", *min); } (2)以下程序从输入的 10 个整数中找到并输出正好出现 2 次的数 (该数只输出一次) ,如没有这样的数,则输出 No。 #include <stdio.h> main() { int a[10], i, j, count, yn; for(i=0; i<10; i++) scanf(“%d”, &a[i]); /*1*/ for(count=i=0; i<10; i++) { /*2*/ for(yn=j=0; j<10; j++) /*3*/ if(a[i]==a[j]) /*4*/ if(i>j) break; /*5*/ else count++; /*6*/ if(count==2) { /*7*/ printf(“%d”, a[i]);
(073 试卷) 8 / 13
创建并插入新结点到链表表尾; 函数 reverse 实现将头指针为 head 的链表的链接顺序颠倒的功能;函数 list 输出头指针为 head 的链 表信息。 #include <stdlib.h> #include <stdio.h> struct node { char data; struct node *next; }; struct node *insert(struct node *head, char ch) { /* 创建并插入新结点到链表表尾 */ struct node *p, *q; p=(struct node *)malloc(sizeof(struct node)); p->data=ch; p->next=NULL; if( head==NULL ) return p; for( q=head; (4) ; q=q->next ); q->next=p; return head; } struct node *reverse(struct node *head) { /* 颠倒链表的链接顺序 */ struct node *p, *q1,*q2; q2=head; q1=NULL; while( q2!=NULL ) { p=q2->next; q2->next=q1; q1=q2; ; q2= (5) } head= (6) ; return head;
(073 试卷) 7 / 13
/*8*/ }
yn=1; } if(yn==0) printf(“No.”); printf(“\n”); }
四、程序填空(12 分,每填空 2 分)
阅读下列问题描述和相应的 C 程序,把应填入其中 (n) 处的 内容写在答卷纸的对应栏内。 (1) 以下程序用二分法在一个各元已按升序排序的整型数组中查找 某个数。若存在,输出该数及它的下标位置;若不存在,输出表示 找不到该数的信息。 main ( ) { int low, high, m, x; int a[10]={ -54, -34, -8, 0, 3, 12, 25, 56, 68, 98 }; scanf (“%d”, &x); low=0; high=9; while (low<=high) { m=(low+high)/2; ; if ( x==a[m] ) (1) else if ( (2) ) low=m+1; else high=m-1; } ) if ( (3) printf (“%d position is %d\n”, x, m); else printf(“%d is not found.\n”, x); } (2)以下程序读入一行字符,且每个字符存入一个结点,按输入 顺序建立一个链表的结点序列,并输出该行字符,然后反序链表的 结点序列,再输出反序的该行字符。其中,函数 insert 的功能是
(073 试卷) 1 / 13
(strlen( ) 为求字符串长度的库函数,sizeof 为求对象存储字节 数的运算符) 。 10.定义 struct student { int num; char name[20];} st[3]; FILE *fp; fp 已以文本方式打开文件写,试写一条语句:将 st[2] 的各成员的值写到文件 fp 中。
(073)上海大学 2007-2008 年春季学期试卷
2008.6
课程名:程序设计基础(C) 课程号:00863006 学分:5
应试人声明: 我保证遵守《上海大学学生手册》中的《上海大学考场规则》 ,如有考试违纪、作弊行 为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。
学号: 题号 题分 得分 一 21
(073 试卷) 3 / 13
int run( int *p ) { int i, r=0; for( i=0; *(p+i)!=0; i+=2 ) switch( *(p+i) ) { case 1: r+=*(p+i+1); break; case 2: r-=*(p+i+1); break; case 3: r*=*(p+i+1); break; case 4: r/=*(p+i+1); } return r; } main() { int a[]={ 2, 100, 4, 4, 1, 50, 3, 5, 0, 0 }; printf( “%d\n”, run(a) ); } 输出:? (6)程序 #include <stdio.h> int n=0; int func( int x ) { int y=1; static int z=1; y+=x; z+=x; printf( “%d: %d,%d,%d\n”, ++n, x, y, z); } main() { int i=0; while( i++<3 ) func(i); printf( “Total: %d\n”, n );
(073 试卷) 2 / 13
puts(s); } } 输入: abcd 输出:? (3)程序 #include <stdio.h> main() { int i = 1; while ( i<=15 ) if( ++i%3!=2 ) continue; else printf( “%d ”, i ); printf( “\n” ); } 输出:? (4)程序 #include <stdio.h> main() { int a[3][3]={ 1,3,6,7,9,11,14,15,17 }; int i,j,s; for( s=i=0, j=2; i<3; i++, j-- ) s+=a[i][j]; printf( “%d,”, s ); for( s=i=j=0; j<3; i++, j++ ) s+=a[i][j]; printf( “%d\n”, s ); } 输出:? (5)程序 #include <stdio.h>
fib( n-2, &f1 ); fib( n-1, &f2 ); *s=f1+f2; } } main() { long fn; int n; scanf( “%d”, &n ); fib( n, &fn ); printf( “f(%d)=%ld\n”, n, fn ); } 输入:9 输出:? (9)程序 #include <stdio.h> main() { FILE *fp; int i,a[10] = { 11,22,33,44,55,66,77,88,99,100 }; fp = fopen( "test.dat", "wb" ); fwrite( a, sizeof(int), 10, fp ); fclose( fp ); fp = fopen( "test.dat", "rb" ); for ( i = 0; i < 4; i++ ) fread( &a[i+3], sizeof(int), 1, fp ); for ( i = 0; i < 3; i++ ) fread( &a[i+1], sizeof(int), 1, fp ); fclose( fp ); for ( i = 0; i < 10; i++ ) printf( "%d ", a[i] ); } 假设文件操作总是成功。 输出:?
姓名: 二 36 三 8 四 12
学院/教师: 卷面 77 上机 23 总分 100
考生须知: 1. 试卷和答题纸上的”学号、姓名、学院、教师”都要填上; 2. 所有答题内容都写在答卷纸上,交卷时将试卷和答卷纸一起交上; 3. 不遵守上述要求者考试成绩将为零分。 4. 本卷考试的得分为卷面分,电脑上机考试(另行安排)的得分为上 机分,考试成绩为卷面分与上机分之和。
一、基础题(21 分,第 1 小题 3 分,其它每小题 2 分)
1.以下所有项中哪三项是合法的 C 语言变量名:_int、a[i]、*p、 long、Sum、a2.1、“abc”、b12、3s。 2.设 a 和 b 为正整数,分别写出判断表达式:a 和 b 都不是偶数; a 和 b 至少有一个是偶数。 3. 计算位运算表达式的值, 结果用十进制描述: 100^200、 100&36。 4.定义 char s[]=“12345AbCdE”; 分别写出 printf(“%s”, &s[4]); 和 printf(“%c”, *(s+7)+1); 的结果。 5.定义 int x=111, y=112; 写出执行语句 x+=x==y--?--y:++x; 后 x 和 y 的值。 6.写出 printf(“%d,%u,%x,%o”, -1,-1,-1,-1); 的结果。 7.定义 int i=0; 写出执行语句 while(i++<10); 后的 i 的值。 8.定义 int a[]={1,3,5,7,9,11,13,15,17,19}, *p=&a[3]; 分别计算表达 式 (&a[8] - &p[-2]) 和 (*(a+7)-*(p+2)) 的值。 9.定义 char s[20]=“string\061\nstring\062”; 写出 printf(“%d”, strlen(s)); 和 printf(“%d”, sizeof(s)); 的结果
ቤተ መጻሕፍቲ ባይዱ
二、阅读程序(36 分,每小题 4 分)
仔细阅读下列程序,将各程序的运行结果写在答卷纸上。 (1)程序 #include <stdio.h> main() { int a, b; scanf(“%d %d”, &a, &b); while ( a!=b ) if ( a>b ) a = a-b; else b = b-a; printf(“%d\n”, a); } 输入: 30 54 输出:? (2)程序 #include <stdio.h> #include <string.h> main() { int i, j, n; char s[20], t; gets(s); n = strlen(s); for ( i = n; i > 0; i-- ) { t = s[n-1]; for ( j = n-1; j > 0; j-- ) s[j] = s[j-1]; s[j] = t;
(073 试卷) 4 / 13
} 输出:? (7)程序 #include <stdio.h> #include <stdlib.h> main() { int *a, n, m, i, j, t; scanf( “%d%d”, &n, &m ); a=(int *)malloc(n*sizeof(int)); for(i=0; i<n; i++) scanf( “%d”, &a[i] ); for(i=0; i<m; i++) { t=a[n-1]; for(j=n-1; j>0; j--) a[j]=a[j-1]; a[j]=t; } for(i=0; i<n; i++) printf( “%d ”, a[i] ); printf( “\n” ); } 输入:10 6 1 2 3 4 5 6 7 8 9 0 输出:? (8)程序 #include “stdio.h” void fib( int n, long *s ) { long f1, f2; if( n==1||n==2 ) *s=1; else {
(073 试卷) 6 / 13
三、改错程序(8 分,每错误点 2 分)
下列程序各有两个错误(两个错误分别是在不同的行上,并只在有 注解行号所标注的行上) ,按原来程序的要求,纠正错误,并将错 误所在行号以及错误行完整的正确内容写在答卷纸的对应栏内。 (1)以下程序是在 5 个字符串中求最小字符串并输出结果。 #include <string.h> #include <stdio.h> main() { char *min,*s[5]={ “int”,“short”,“long”,“char”, “float” }; int i; /*1*/ min=s[0]; /*2*/ for ( i=1; i<5; i++) /*3*/ if( min>s[i] ) /*4*/ min=s[i]; /*5*/ printf("%s\n", *min); } (2)以下程序从输入的 10 个整数中找到并输出正好出现 2 次的数 (该数只输出一次) ,如没有这样的数,则输出 No。 #include <stdio.h> main() { int a[10], i, j, count, yn; for(i=0; i<10; i++) scanf(“%d”, &a[i]); /*1*/ for(count=i=0; i<10; i++) { /*2*/ for(yn=j=0; j<10; j++) /*3*/ if(a[i]==a[j]) /*4*/ if(i>j) break; /*5*/ else count++; /*6*/ if(count==2) { /*7*/ printf(“%d”, a[i]);
(073 试卷) 8 / 13
创建并插入新结点到链表表尾; 函数 reverse 实现将头指针为 head 的链表的链接顺序颠倒的功能;函数 list 输出头指针为 head 的链 表信息。 #include <stdlib.h> #include <stdio.h> struct node { char data; struct node *next; }; struct node *insert(struct node *head, char ch) { /* 创建并插入新结点到链表表尾 */ struct node *p, *q; p=(struct node *)malloc(sizeof(struct node)); p->data=ch; p->next=NULL; if( head==NULL ) return p; for( q=head; (4) ; q=q->next ); q->next=p; return head; } struct node *reverse(struct node *head) { /* 颠倒链表的链接顺序 */ struct node *p, *q1,*q2; q2=head; q1=NULL; while( q2!=NULL ) { p=q2->next; q2->next=q1; q1=q2; ; q2= (5) } head= (6) ; return head;
(073 试卷) 7 / 13
/*8*/ }
yn=1; } if(yn==0) printf(“No.”); printf(“\n”); }
四、程序填空(12 分,每填空 2 分)
阅读下列问题描述和相应的 C 程序,把应填入其中 (n) 处的 内容写在答卷纸的对应栏内。 (1) 以下程序用二分法在一个各元已按升序排序的整型数组中查找 某个数。若存在,输出该数及它的下标位置;若不存在,输出表示 找不到该数的信息。 main ( ) { int low, high, m, x; int a[10]={ -54, -34, -8, 0, 3, 12, 25, 56, 68, 98 }; scanf (“%d”, &x); low=0; high=9; while (low<=high) { m=(low+high)/2; ; if ( x==a[m] ) (1) else if ( (2) ) low=m+1; else high=m-1; } ) if ( (3) printf (“%d position is %d\n”, x, m); else printf(“%d is not found.\n”, x); } (2)以下程序读入一行字符,且每个字符存入一个结点,按输入 顺序建立一个链表的结点序列,并输出该行字符,然后反序链表的 结点序列,再输出反序的该行字符。其中,函数 insert 的功能是
(073 试卷) 1 / 13
(strlen( ) 为求字符串长度的库函数,sizeof 为求对象存储字节 数的运算符) 。 10.定义 struct student { int num; char name[20];} st[3]; FILE *fp; fp 已以文本方式打开文件写,试写一条语句:将 st[2] 的各成员的值写到文件 fp 中。
(073)上海大学 2007-2008 年春季学期试卷
2008.6
课程名:程序设计基础(C) 课程号:00863006 学分:5
应试人声明: 我保证遵守《上海大学学生手册》中的《上海大学考场规则》 ,如有考试违纪、作弊行 为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。
学号: 题号 题分 得分 一 21
(073 试卷) 3 / 13
int run( int *p ) { int i, r=0; for( i=0; *(p+i)!=0; i+=2 ) switch( *(p+i) ) { case 1: r+=*(p+i+1); break; case 2: r-=*(p+i+1); break; case 3: r*=*(p+i+1); break; case 4: r/=*(p+i+1); } return r; } main() { int a[]={ 2, 100, 4, 4, 1, 50, 3, 5, 0, 0 }; printf( “%d\n”, run(a) ); } 输出:? (6)程序 #include <stdio.h> int n=0; int func( int x ) { int y=1; static int z=1; y+=x; z+=x; printf( “%d: %d,%d,%d\n”, ++n, x, y, z); } main() { int i=0; while( i++<3 ) func(i); printf( “Total: %d\n”, n );
(073 试卷) 2 / 13
puts(s); } } 输入: abcd 输出:? (3)程序 #include <stdio.h> main() { int i = 1; while ( i<=15 ) if( ++i%3!=2 ) continue; else printf( “%d ”, i ); printf( “\n” ); } 输出:? (4)程序 #include <stdio.h> main() { int a[3][3]={ 1,3,6,7,9,11,14,15,17 }; int i,j,s; for( s=i=0, j=2; i<3; i++, j-- ) s+=a[i][j]; printf( “%d,”, s ); for( s=i=j=0; j<3; i++, j++ ) s+=a[i][j]; printf( “%d\n”, s ); } 输出:? (5)程序 #include <stdio.h>