(073)上海大学2007-2008年春季学期试卷2008.6课程名:程序设计基础(C) 课程号:00863006 学分:5应试人声明:我保证遵守《上海大学学生手册》中的《上海大学考场规则》,如有考试违纪、作弊行为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。
学号:姓名:学院/教师:考生须知: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)); 的结果(strlen( ) 为求字符串长度的库函数,sizeof为求对象存储字节数的运算符)。
10.定义struct student { int num; char name[20];} st[3];FILE *fp; fp已以文本方式打开文件写,试写一条语句:将st[2]的各成员的值写到文件fp中。
二、阅读程序(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;puts(s);}}输入: abcd输出:?(3)程序#include <stdio.h>main(){int i = 1;while ( i<=15 )if( ++i%3!=2 )continue;elseprintf( “%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>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 );}输出:?(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 61 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{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] );}假设文件操作总是成功。
输出:?三、改错程序(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]);/*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);elseprintf(“%d is not found.\n”, x);}(2)以下程序读入一行字符,且每个字符存入一个结点,按输入顺序建立一个链表的结点序列,并输出该行字符,然后反序链表的结点序列,再输出反序的该行字符。