资源预览内容
第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
第9页 / 共16页
第10页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
(092)上海大学 2009-20XX 年冬季学期试卷2010.3课程名 :程序设计基础( C 语言)课程号 :00863006学分:5 应试人声明:我保证遵守上海大学学生手册中的上海大学考场规则 ,如有考试违纪、作弊行为,愿意接受上海大学学生考试违纪、作弊行为界定及处分规定的纪律处分。学号:姓名:学院/教师:题号一二三四卷面上机总分题分16 12 24 18 70 30 100 得分考生须知:1.试卷和答题纸上的” 学号、姓名、学院、教师” 都要填上;2.所有答题内容都写在答卷纸上,交卷时将试卷和答卷纸一起交上;3.不遵守上述要求者考试成绩将为零分。4.本卷考试的得分为卷面分,电脑上机考试(另行安排)的得分为上机分,考试成绩为卷面分与上机分之和。一、单项选择题 (16 分,每小题 1 分) 1以下选项中,哪个是合法的C标识符 (_) A) b-a B) 5ab C) int D) INT 2. 以下选项中,哪个是合法的常量(_) A) 0789 B) 0 xEFG C) 9.2e2 D) 2e9.2 3. 设 n 为 16 位整数,则 n 的取值范围是 (_) A) -32768至 32768 B) 0至 65536 C) -32768至 32767 D) 0至 65535 4. 设 int n=-1; 则 n 在内存中的 16 位编码是 (_) A) 1111 1111 1111 1111 B) 1000 0000 0000 0001 C) 1111 1111 1111 1110 D) 0000 0000 0000 0000 5. 设有 int n;判断 n 是一个 2 位正整数的表达式是 (_) A) n10 & n=10 & n=99 C) !(n10) | n=10 | nname1 C) stu0.name1D) *p-name1 15. 设有定义 FILE *fp; 将整数 n 以文本方式写到 fp 文件的语句是(_) A) fp = fopen( file.txt, w ); B) fprintf( fp, %d, n ); C) fwrite( &n, sizeof(int), 1, fp ); D) fclose(fp); 16. 表达式 10 & 12 和 10 12 的计算结果分别是 (_) A) 8和 14 B) 8和 6 C)14和 8 D) 6 和 8 二、基础填空题 (12 分,每小题 2 分) 1. 已知 C语言中专用的字符输出函数为putchar 函数,请写出与之对应的字符输入专用函数。2. 已知 C语言中选择结构的一种语句为if 语句,请写出选择结构的另一种语句,一般称之为分支语句。3. 设有定义 int a=1234;float x=56.789;写出下列语句的结果。 printf(%3d,%4.2f,a,x); 4. 设有 float x;写出得到 x 小数部分的表达式(如x 为 12.345,则表达式的结果为0.345) 。5. 设有定义 int a,b;写出满足以下条件的逻辑表达式。 a是 3 的倍数,或者 b 不是 5 的倍数6. 设有如下结点定义,并已建立链表如下图所示(成员next 指向下一结点),p 指针指向链表中的某个结点, 写出使 p 指向下一结点的语句。 struct node int data; struct node *next; ; headdatap三、阅读程序 (24 分,每小题4 分) 仔细阅读下列程序,将各程序的运行结果写在答卷纸上。(1)程序#include float sc2pt(int sc) float pt; if (sc=90) pt=4.0; else if (sc=85) pt=3.7; else if (sc=82) pt=3.3; else if (sc=78) pt=3.0; else if (sc=75) pt=2.7; else if (sc=72) pt=2.3; else if (sc=68) pt=2.0; else if (sc=66) pt=1.7; else if (sc=64) pt=1.5; else if (sc=60) pt=1.0; else pt=0.0; return pt; main() int sc; float pt; scanf(%d,&sc); pt = sc2pt(sc); printf(Score=%dn,sc); printf(Point=%3.1fn,pt); 输入: 88 输出:?(输出共2 行)(2)程序#include void prtline(int m,int n,char c) int i; for (i=0;im;i+) putchar( ); /*空格*/ for (i=0;in;i+) putchar(c); putchar(n); main() int n, i; scanf(%d,&n); for (i=0;in;i+) prtline(n-1-i,2*i+1,#); 输入: 4 输出:?(输出共4 行)(3)程序#include void prtfact(int n) int i; printf( %d=, n ); for ( i=2; i1 ) printf( * ); else i+; printf( n ); main() int n; scanf( %d, &n ); prtfact( n ); 输入: 42 输出: ? (输出共 1 行)(4)程序#include void sca(int a,int n) int i; for (i=0;in;i+) scanf(%d,&ai); long sum(int a,int n) long s=0; int i; for (i=0;in;i+) s += ai; return s; int maxk( int a, int n ) int i, k=0; for ( i=1; in; i+ ) if ( ak ai ) k = i; return k; main() int a5,k; sca(a,5); printf(Sum=%ldn,sum(a,5); k=maxk(a,5); printf(Max:a%d=%dn,k,ak); 输入: 30 20 10 50 40 输出:?(输出共2 行)(5)程序#include int split(int a,long d,int m) a0 = d%m; d = d/m; if ( d=0 ) return 1; return split(a+1,d,m) + 1; void prt(int a,int n) int i; for (i=0;in;i+) printf(%d , ai); printf(n); void reverse(int a,int n) int i, j, t; for (i=0,j=n-1;ij;i+,j-) t=ai; ai=aj; aj=t; main() int a10,n; long d; scanf(%lx,&d); /*输入 16进制数 */ printf(Line1: %ldn,d); n=split(a,d,10); printf(Line2: ); prt(a,n); reverse(a,n); printf(Line3: ); prt(a,n); 输入: 12A (提示: 16 进制 12A等于 10 进制 298)输出:?(输出共3 行)(6)程序#include void clean(char b,char a) char *p=a, *q=b; while ( *p!=0 ) for ( ; *p= ; p+ ) ; if ( qb & *p!=0 ) *(q+) = _; /*下划线 */ for ( ; *p!= & *p!=0; p+ ) *(q+) = *p; *q = 0; main() char a80, b80; gets(a); puts(a); clean(b,a); puts(b); 输入: Can I help you? 输出:?(输出共2 行)四、程序填空 (18 分,每填空 2 分) 阅读下列问题描述和相应的C 程序,把应填入其中 (n) 处的内容写在答卷纸的对应栏内。(1)程序以下程序从键盘上输入整数n,输出 2 到 n 之间的所有素数。其中函数 getprime 求解 2 到 n 之间(包含 2 与 n)的所有素数并保存在数组 a 中,同时返回素数的个数。判断整数m是否为素数可以采用以下方法:依次判断m是否为 2 到 m-1之间各个素数的倍数,如果都不能整除,则 m是素数。#include int getprime(int a,int n) /* 求解 2 到 n 之间的所有素数,保存到数组a 中,并返回其个数 */ int m,i,k=0; for ( m=2; (1) ; m+ ) /* 依次判断 m 是否为素数 */ for ( i=0; ik; i+ )/* 对已求解素数进行循环 */ if ( m%ai=0 )/* 判断是否为已求解素数的倍数*/ (2) ;/*如果整除,则 m 不是素数 */ if (i=k) ak+ = m;/*m 为素数,保存到数组a中*/ return (3) ;/*返回素数个数 */ main() int a100,n,k,i; scanf(%d,&n); k=getprime(a,n); for (i=0;ik;i+) printf(%d ,ai); printf(n); /*如果输入 20,则输出 2 3 5 7 11 13 17 19*/ (2)程序以下程序从键盘输入一行字符串,所有字符依次向右移动1 个位置并输出,参见以下示例。函数shift_s将字符串 a 的 n 个字符向右移动 m个位置后复制到字符串b 中,移出的字符循环到最左边。如输入: Abcd 则输出: (第 1 行为原输入串,第2 行开始依次向右移1 个字符)Abcd dAbc cdAb bcdA #include #include void shift_s(char b,char a,int n,int m) /*a 数组的 n 个字符右移 m 个位置后复制到数组b 中*/ int i; for (i=0;in;i+) b (4) =ai; /* 移位并复制 */ bn = (5) ; /*字符串结束 */ main() char stra80, strb80; int i, n; gets(stra); n = strlen(stra); for (i=0; in; i+ ) /*共输出 n 行*/ shift_s( (6) );/* 函数调用参数 */ puts(strb); (3)程序以下结点 node定义了一个学生的信息。 函数 find 查找并返回学号小于 num ,且下一节点学号不小于num的结点指针。函数insert按学号递增顺序插入新学生。测试主函数从键盘输入5 个学号,调用 insert函数插入链表,并输出链表内容。#include #include struct node int num; /*学生的学号 */ struct node *next; /*指向下一结点 */ ; struct node *find(struct node *head,int num) /* 如果 head为空链表,则返回空指针。如果第一个结点的学号不小于 num ,也返回空指针。如果最后一个结点的学号仍小于num ,则返回最后一个结点指针。如果当前结点的学号小于num且下一结点学号不小于num ,则返回当前结点的指针*/ struct node *p, *q; for ( p=head; p!=NULL; p=p-next ) q = p-next; if ( p-num = num ) return NULL;/*第一个结点的学号不小于num*/ if
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号