上海大学程序设计基础(C)06-07秋试卷及答案

(061) 2006 2007 (061)上海大学 2006-2007 年秋季学期试卷 61 课程名: 程序设计基础( 课程名: 程序设计基础(C)
学号: 学号: 题号 题分 得分 一 21 姓名: 姓名: 二 36 三 8 四 12

2006 2006.11

学分: 学分:
学院/教师: 学院/教师: 卷面 77 上机 23

5

总分 100

考生须知: 1. 试卷和答题纸上的“学号、姓名、学院、教师”都要填上; 2. 所有答题内容都写在答卷纸上,交卷时将试卷和答卷纸一起交上; 3. 不遵守上述要求者考试成绩将为零分。 4. 本卷考试的得分为卷面分,电脑上机考试(另行安排)的得分为上 机分,考试成绩为卷面分与上机分之和。

一、基础题(21 分,第 1 小题 3 分,其它每小题 2 分) 基础题( 其它每
1.设 x=3,y=4,z=61,写出 z+=(x++==--y)?5:8;执行后各变量的值。 2.定义 int b=7;float a=5.2,c=6.3;计算表达式 b*(int)(a+c)/2 与(float)b/(int)a 的值。 3.设 a=b=5,分别判断表达式 6>a>4 和 b++==6 是真还是假。 4. 写出判断表达式:a 是 b 和 c 的公约数,a 是 b 和 c 的公倍数。 5. 将 0x5E 转换为二进制和十进制。 6. 计算 0x5E|0x20 和 0x5E&~(1<<2)的值,结果用 16 进制表示。 7.设 float x;写出表达式:x 四舍五入后的整数值。 8.设 char *pc[3];试用 puts 写出语句:输出字符串 pc[1]。 9.设 int a[10],s,i;写出语句片段:计算 a 数组的累加和至变量 s。 10.设 struct student {int num;char name[20];}st; 写出 printf 语句:输出学生 st 的各个成员分量。要求按 num、 name 的顺序输出,各成员之间使用空格分隔开。

二、阅读程序(36 分,每小题 4 分) 阅读程序(36 (3
仔细阅读下列程序,将各程序的运行结果写在答卷纸上。
(061 试卷) 1 / 10

(1)程序 #include <stdio.h> main() { int x,y,z,w,t; scanf( "%d%d%d%d",&x,&y,&z,&w ); t=x; x=y; y=z; z=w; w=t; printf( "%d,%d,%d,%d\n", x,y,z,w ); } /* 输入:111 222 333 444 */ 输出:? (2)程序 #include <stdio.h> main() { int n,i; scanf( "%d", &n ); for ( i=n; 1; i++ ) { printf( "%d ", i ); if ( i % 9 == 0 ) break; } } /* 输入:11 */ 输出:? (3)程序 #include <stdio.h> #include <string.h> main() {
(061 试卷) 2 / 10

char str[81], a[81], b[81]; int n, i, j=0, k=0; gets( str ); n=strlen( str ); for ( i=0; i<n; i++ ) { if ( i%2==0 ) a[j++] = str[i]; if ( i%3==0 ) b[k++] = str[i]; } a[j] = b[k] = '\0'; puts( a ); puts( b ); } /* 输入:Hello_my_name_is_ricky. 输出:? (4)程序 #include <stdio.h> void printline( int m, int n ) { int i; for ( i=0; i<m; i++ ) printf( " " ); for ( i=0; i<n; i++ ) printf( "*" ); printf( "\n" ); } main() { int i; for ( i=1; i<=3; i++ ) printline( 3-i, 2*i-1 ); for ( i-=2; i>=1; i-- ) printline( 3-i, 2*i-1 ); } 输出:?
(061 试卷) 3 / 10

*/

(5)程序 #include <stdio.h> #include <string.h> int func( int k ) { int x=1; static y=10; x++; y++; k++; return x+y+k; } main() { int k=100; printf( "%d\n", func(k+=100) ); printf( "%d\n", func(k+=100) ); printf( "%d\n", func(k+=100) ); } 输出:? (6)程序 #include <stdio.h> int gcd( int m, int n ) { if ( n==0 ) return m; return gcd( n, m%n ); } main() { int m, n, x, y; scanf( "%d%d", &m, &n ); x = gcd( m, n ); y = m*n/x; printf( "x=%d, y=%d\n", x, y ); } /* 输入:24 32 */ 输出:?
(061 试卷) 4 / 10

(7)程序 #include <stdio.h> void getmxmn(int a[],int n,int *pmx,int *pmn) { int i; *pmx=*pmn=a[0]; for (i=1;i<n;i++) if (*pmx<a[i]) *pmx=a[i]; else if (*pmn>a[i]) *pmn=a[i]; } main() { int x[10]={20,30,15,95,55,20,88,90,66,90},mx,mn; getmxmn(x,10,&mx,&mn); printf("mx=%d,mn=%d\n",mx,mn); } 输出:? (8)程序 #include <stdio.h> main() { char words[][20] = {"First-1","Second-2","Third-3"}, *p; int i; for ( i=0; i<3; i++ ) { for ( p=words[i]; *p!='\0'; p++ ) if ( *p>='a' && *p<='f' ) *p = *p - 'a' + 'A'; else if ( *p>='G' && *p <='Z' ) *p = *p - 'A' + 'a'; puts( words[i] ); } } 输出:? (9)程序
(061 试卷) 5 / 10

#include <stdio.h> #include <stdlib.h> struct node { int num; struct node *next; }; struct node *insert1( struct node *head, int num ) { struct node *p; p = (struct node *)malloc(sizeof(struct node)); p->num = num; p->next = head; return p; } void print( struct node *head ) { struct node *p; for ( p=head; p!=NULL; p=p->next ) printf( "%d\t", p->num ); printf( "\n" ); } main() { struct node *head1=NULL, *head2=NULL, *head=NULL; struct node *p, *q; head1=insert1( head1, 600 ); head1=insert1( head1, 100 ); head1=insert1( head1, 400 ); head2=insert1( head2, 700 ); head2=insert1( head2, 300 ); head2=insert1( head2, 500 ); head2=insert1( head2, 200 ); for ( p=head1,q=head2; p!=NULL && q!=NULL; p=p->next,q=q->next ) if ( p->num < q->num ) head = insert1( head, p->num );
(061 试卷) 6 / 10

else head = insert1( head, q->num ); print( head ); /* 释放链表的内存略 */ } 输出:?

三、改错程序(8 分,每错误点 2 分) 改错程序(
下列程序各有两个错误(两个错误分别是在不同的行上,并只在有 注解行号所标注的行上) ,按原来程序的要求,纠正错误,并将错 误所在行号以及错误行完整的正确内容写在答卷纸的对应栏内。 (1)以下程序输入 10 个数,分别判断并输出其中的素数。 #include <stdio.h> main() { int x,n,i; /*1*/ for (x=0;x<10;x++) { /*2*/ scanf( “%d”, &n ); /*3*/ for ( i=2; i<n; i++ ) /*4*/ if ( n%i!=0 ) /*5*/ break; /*6*/ if ( i<n ) /*7*/ printf( “%d\t”, n ); } } (2)以下程序输入整数 n 和 n 个整数,判断它们是否有重复,如 果没有重复输出 Yes,否则输出 No。 #include <stdio.h> #define N 100 main() { int a[N], n, i, j, isyes=1; /*1*/ scanf( "%d", &n ); /*2*/ for ( i=0; i<n; i++ ) /*3*/ scanf( "%d", &a[i] );
(061 试卷) 7 / 10

/*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/ /*10*/ /*11*/

for ( i=0; i<N; i++ ) for ( j=0; j<n; j++ ) if ( a[i]==a[j] && i!=j ) isyes=0; if ( isyes==1 ) printf( "No\n" ); else printf( "Yes\n" ); } /* 若输入 10 1 2 3 4 5 6 7 8 9 10 则输出 Yes */ /* 若输入 10 1 2 3 4 5 6 7 8 9 2 则输出 No */

四、程序填空(12 分,每填空 2 分) 程序填空(12 (1
阅读下列问题描述和相应的 C 程序,把应填入其中 (n) 处的 内容写在答卷纸的对应栏内。 (1)以下程序从 words.txt 文件中读出所有单词,并将所有单词 的首字符组成字符串后输出。 #include <stdio.h> main() { /* 将 words.txt 中所有单词的首字符组成字符串并输出 */ FILE *fp; char str[81], out[81]; int n=0; /* 以文本文件方式打开文件 words.txt */ fp = fopen( (1) ); /* 如果打开失败则程序结束 */ if ( fp==NULL ) return; /* 如果文件未读空则循环 */ while ( !feof(fp) ) { /* 从文件中读取一个单词 */ if ( fscanf(fp,"%s",str) > 0 ) /* 如果成功,将第一个字符加到 out 串中 */ out[n++] = str[0]; } out[n] = (2) ; /* 置 out 字符串的结束符 */
(061 试卷) 8 / 10

fclose(fp); puts( (3)

);

/* 关闭文件 */ /* 输出 out 串 */

} /* 若文件 words.txt 中的内容为: Hi, how are you. Good morning. Hello 则程序输出:HhayGmH */ (2)以下程序输入 n,输出 n 个数的所有排列。 #include <stdio.h> #include <stdlib.h> void printlist( int a[], int n ) { /* 本函数输出数组 a 中的所有元素 */ int i; for ( i=0; i<n; i++ ) printf( "%d\t", (4) ); printf("\n"); } void swap( int *p, int *q ) { /* 本函数交换指针 p 和 q 所指向变量的值 */ int t; t=*p; *p=*q; *q=t; } main() { /* 输入 n,并输出 1 至 n 各数值的所有排列 */ int n, *a, m, k, i, j; scanf( "%d", &n ); /* 输入变量 n */ /* 申请 n 个 int 变量的内存空间*/ a = malloc( n*sizeof(int) ); /* 假设内存申请成功 */ /* 初始化第一个排列的值,按升序顺序 */ for ( i=0; i<n; i++ ) a[i] = i+1; /* 输出第一个排列 */ printlist( a, n ); /* 以下 while 语句无限循环直到输出所有排列 */ while ( 1 ) { /* 从右边找到第一个升序的数值下标给 m */
(061 试卷) 9 / 10

/* 从 a[m]至 a[m+1]为升序,a[m+1]以后为降序 */ /* 在下一个排列中,a[m]应选择一个更大的数 */ m = n-2; while ( (m>=0) && (a[m]>a[m+1]) ) m--; /* 如果所有元素为降序, 则所有排列已输出, 退出循环 */ ; if ( m<0 ) (5) /* 从右边找到第一个正好超过 a[m]的数,其下标为 k */ /* 则 a[k]是 a[m]以后各元素中正好超过 a[m]的一个值 */ k = n-1; while ( a[m] > a[k] ) k--; /* 下一个排列时, a[m]应改为 a[k], 故交换 a[m]与 a[k] */ /* 交换后,从 a[m+1]以后的数值仍为降序 */ swap( (6) ); /* 将从 a[m+1]开始的其它元素按升序重新排列 */
/* 由于 a[m+1]至 a[n-1]为降序, 故逆排 a[m+1]以后各元素即可 */

for ( i=m+1,j=n-1; i<j; i++,j-- ) swap( a+i, a+j ); /* 下一个排列的生成完毕,输出该排列 */ printlist( a, n ); } /* 释放开始时申请的内存空间 */ free( a ); } /* 1 1 2 2 3 3 */ 输入 3 时,输出以下 6 个排列: 2 3 3 2 1 3 3 1 1 2 2 1

(061 试卷)

10 / 10

(061)上海大学 2006 2007 秋季学期答卷 (061)上海大学 2006-2007 年秋季学期答卷 课程名: 程序设计基础( 课程名: 程序设计基础(C)
学号: 学号: 题号 题分 得分 一 21 姓名: 姓名: 二 36 三 8 四 12

2006 2006.11

学分: 学分:
学院/教师: 学院/教师: 卷面 77 上机 23

5

总分 100

小 题 1 2 3 4 5 6 7 8 9 10

第 一 题 答 栏 (基础题) 21%
第 1 小题 3 分,其它每小题 2 分

x= 4
前式: 前式:

y= 3 38 假
后式: 后式:

z= 66 1.4 假 94 5A

前式: b%a==0 && c%a==0 二进制:00..01011110 前式:

后式: a%b==0 && a%c==0 十进制: 后式:

7E

(int)(x+0.5) puts(pc[1]) for (s=i=0;i<10;i++) s+=a[i]; printf(“ %s” printf(“%d %s”,st.num,st.name); 小计: 阅读程序) 第 二 题 答 栏 (阅读程序) 36% 222,333,444,111 11 12 13 14 15 16 17 18 Hlom_aei_ik. Hlmnesiy
(061 试卷) 11 / 10

小题 1 2 3

4 分/格

4

5 6 7 8 9

* *** ***** *** * 214 315 416 x=8, y=96 mx=95,mn=15 FirstFirst-1 sEConDsEConD-2 thirDthirD-3 300 100

200 小计:

改错程序) 第 三 题 答 栏 (改错程序) 8% 改错点 行号 修 改 后 程 序 行 4 1. (1) if ( n%i==0 ) 6 1. (2) if(i= if(i>=n) 或 if(i==n) 2. (3) 2. (4)
4 8

2 分/格

for ( i=0; i<n; i++ ) if(isyes==0) if(isyes! syes!= 或 if(isyes!=1)
小计:

填空号 1. (1) 1. (2) 1. (3) 2. (4)

程序填空) 第 四 题 答 栏 (程序填空) 12% 2 分/格

"words.txt","r" '\0' out a[i]
(061 试卷) 12 / 10

2. (5) 2. (6)

break &a[m],&a[k] 或 a+m,a+k
小计:

(061 试卷)

13 / 10


相关文档

上海大学程序设计基础(C)07-08秋试卷及答案
上海大学程序设计基础(C)06-07冬试卷及答案
上海大学程序设计基础(C)07-08春试题及答案
上海大学程序设计基础(C)07-08冬试卷及答案
上海大学程序设计基础(C)08-09冬试卷及答案
上海大学机械原理期末试卷2007
上海大学C++2006-2007秋
上海大学机械设计06-07年春季学期试卷两套及答案解析10P
上海大学06-07(秋)高数B1试题及解答(A卷)
上海大学机械设计2006真题
电脑版