[南开] C语言程序设计复习资料

[复制链接]
发表于 2019-8-17 17:54:41 | 显示全部楼层 |阅读模式
《C语言程序设计》课程期末复习资料
一、单项选择题
【1.1】以下不正确的C语言标识符是____。
A) int B) a_1_2 C) ab1exe D) _x
【1.2】以下是正确的C语言标识符是____。
A) #define B) _123 C) %d D) \n
【1.3】下列四组字符串中都可以用作C语言程序标识符的一组是 。
A) print _3d oodb aBc
B) i\am one_half start$it 3pai
C) Pxq My->book line# His.age
D) str_l Cpp pow while
【1.4】下面各选项组中,均是C语言关键字的组是 。
A) auto,enum,include B) switch,typedef,continue
C) signed,union,scanf D) if,struct,type
【1.5】下列不属于C语言关键字的是 。 A) default B) register C) enum D) external
【1.6】C语言程序从main()函数开始执行,所以这个函数要写在____。
A) 程序文件的开始 B) 程序文件的最后
C) 它所调用的函数的前面 D) 程序文件的任何位置
【1.7】下列关于C语言的叙述错误的是____
A) 大写字母和小写字母的意义相同
B) 不同类型的变量可以在一个表达式中
C) 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型
D) 同一个运算符号在不同的场合可以有不同的含义
【1.8】在C语言中,错误的int类型的常数是 。
A) 32768 B) 0 C) 037 D) 0xAF
【1.9】执行语句 printf("%x",-1);屏幕显示____。
A) -1 B) 1 C) -ffff D) ffff
【1.10】已知 long i=32768;执行语句printf("%d",i);屏幕显示____。
A) -1 B) -32768 C) 1 D) 32768
【1.11】已知 long i=65539;执行语句printf("%d",i);屏幕显示____。
A) 65539 B) -3 C) 3 D) 程序不能执行
【1.12】在C语言中,整数-8在内存中的存储形式是 。
A) 1111 1111 1111 1000 B) 1000 0000 0000 1000
C) 0000 0000 0000 1000 D) 1111 1111 1111 0111
【1.13】C语言中字符型(char)数据在内存中的存储形式是____。
    A) 原码 B) 补码 C) 反码 D) ASCII码
【1.14】将字符g赋给字符变量c,正确的表达式是 。
A) c=\147 B) c="\147" C) c='\147' D) c='0147'
【1.15】下列转义字符中错误的一个是____。
A) '\000' B) '\0014' C) '\x111' D) '\2'
【1.16】将空格符赋给字符变量c,正确的赋值语句是____。
A) c='\0' B) c=NULL C) c=0 D) c=32
【1.17】已知:char a='\70';则变量a中 。
A) 包含1个字符 B) 包含2个字符 C) 包含3个字符 D) 说明非法
【1.18】字符串"\"EOF\n=-\61\""的长度是____。
A) 8 B) 9 C) 14 D) 非法字符串
【1.19】字符串""的长度是____。
A) 0 B) 1 C) 2 D) 非法字符串
【1.20】已知:char a;int b;float c;double d;执行语句"c=a+b+c+d;"后,变量c的数据类型是 。
A) int B) char C) float D) double
【1.21】温度华氏和摄氏的关系是: C=-(F-32)。已知:float C,F;由华氏求摄氏的正确的赋值表达式是____。
A) C=5/9(F-32) B) C=5*(F-32)/9
C) C=5/9*(F-32) D) 三个表达式都正确
【1.22】逗号表达式"(a=3*5,a*4),a+15"的值是____。
A) 15 B) 60 C) 30 D) 不确定
【1.23】如果int a=1,b=2,c=3,d=4;则条件表达式"a<b?a:c<d?c:d"的值是____。
A) 1 B) 2 C) 3 D) 4
【1.24】为求出s=10!的值,则变量s的类型应当为 。
A) int B) unsiged C) long D) 以上三种类型均可
【1.25】已知int i=10;表达式"20-0<=i<=9"的值是____。
A) 0 B) 1 C) 19 D) 20
【1.26】已知int x=1,y;执行下述语句后变量x的值是____。
y=++x>5&&++x<10;A) 1 B) 2 C) 3 D) 4
【1.27】为判断字符变量c的值不是数字也不是字母时,应采用下述表达式____。
A) c<=48||c>=57&&c<=65||c>=90&&c<=97||c>=122
B) !(c<=48||c>=57&&c<=65||c>=90&&c<=97||c>=122)
C) c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122
D) !(c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122)
【1.28】已知 int a[3][2]={3,2,1};则表达式"a[0][0]/a[0][1]/a[0][2]"的值是____。
A) 0.166667 B) 1 C) 0 D) 错误的表达式
【1.29】已知 int x=1,y=1,z=1;表达式"x+++y+++z++"的值是____。
A) 3 B) 4 C) 5 D) 表达式错误
【1.30】用十进制表示表达式"12|012"的值是____。
A) 1 B) 0 C) 12 D) 14
【1.31】已知以下程序段:
int a=3,b=4;
a=a^b;
b=b^a;
a=a^b;
则执行以上语句后a和b的值分别是____。
A) a=3,b=4 B) a=4,b=3 C) a=4,b=4 D) a=3,b=3
【1.32】在位运算中,操作数每右移一位,其结果相当于____。
A) 操作数乘以2 B) 操作数除以2 C) 操作数除以16 D) 操作数乘以16
【1.33】已知 char a=222;执行语句a=a&052;后,变量a的值是____。
A) 222 B) 10 C) 244 D) 254
【1.34】已知二进制数a是00101101,如果想通过整型变量b与a做异或运算,使变量a的高4位取反,低4位不变,则二进制数b的值应是____。
A) 11110000 B) 00001111 C) 11111111 D) 00000000
【1.35】已知 int a=15,执行语句a=a<<2以后,变量a的值是____。
A) 20 B) 40 C) 60 D) 80
【1.36】已知int x=5,y=5,z=5;执行语句x%=y+z;后,x的值是____。
A) 0 B) 1 C) 5 D) 6
【1.37】使用语句scanf("x=%f,y=%f",&x,&y);输入变量x、y的值(□代表空格),正确的输入是____。A) 1.25,2.4 B) 1.25□2.4 C) x=1.25,y=2.4 D) x=1.25□y=2.4
【1.38】下列循环语句中有语法错误的是____。
A) while(x=y) 5; B) while(0) ;
C) do 2;while(x==b); D) do x++ while(x==10);
【1.39】已知int x=(1,2,3,4);变量x的值是____。A) 1 B) 2 C) 3 D) 4
【1.40】表达式sizeof(double)是 。
A) 函数调用 B) double型表达式 C) int型表达式 D) 非法表达式
【1.41】执行语句printf("2:%d,",printf("1:%d,",scanf("%d",&x)));以后的输出结果是____。
A) 2:1,1:1, B) 1:1,2:1, C) 2:4,1:1 D) 1:1,2:4,
【1.42】已知:int x,y;double z;则以下语句中错误的函数调用是 。
A) scanf ("%d,%lx,%le",&x,&y,&z); B) scanf ("%2d*%d%lf",&x,&y,&z);
C) scanf ("%x%*d%o",&x,&y); D) scanf ("%x%o%6.2f",&x,&y,&z);
【1.43】与条件表达式"(n)?(c++)c--)"中的表达式(n)等价的表达式是____。
A) (n==0) B) (n==1) C) (n!=0) D) (n!=1)
【1.44】已知int i=1,j=0;执行下面语句后j的值是____。
while(i)
switch(i)
{ case 1: i+=1;j++;break;
case 2: i+=2;j++;break;
case 3: i+=3;j++;break;
default: i--;j++;break;
}
A) 1 B) 2 C) 3 D) 死循环
【1.45】求取满足式 12+22+32+ …… +n2 ≤1000的n,正确的语句是____。
A) for(i=1,s=0;(s=s+i*i)<=1000;n=i++) ;
B) for(i=1,s=0;(s=s+i*i)<=1000;n=++i) ;
C) for(i=1,s=0;(s=s+i*++i)<=1000;n=i) ;
D) for(i=1,s=0;(s=s+i*i++)<=1000;n=i) ;
【1.46】下面的for语句 。
for(x=0,y=10;(y>0)&&(x<4);x++,y-- ) ;
A) 是无限循环 B) 循环次数不定 C) 循环执行4次 D) 循环执行3次
【1.47】已知int i=1; 执行语句while (i++<4) ;后,变量i的值为____。
A) 3 B) 4 C) 5 D) 6
【1.48】已知int x=12,y=3;执行下述程序后,变量x的值是____。
do
{ x/=y--;
}while(x>y);
A) 1 B) 2 C) 3 D) 程序运行有错误
【1.49】已知 char a[][20]={"Beijing","shanghai","tianjin","chongqing"};语句printf("%c",a[30]);的输出是____。
A) <空格> B) n C) 不定 D) 数组定义有误
【1.51】对二维数组的正确说明是____。
A) int a[][]={1,2,3,4,5,6}; B) int a[2][]={1,2,3,4,5,6};
C) int a[][3]={1,2,3,4,5,6}; D) int a[2,3]={1,2,3,4,5,6};
【1.52】对字符数组s赋值,不合法的一个是____。
A) char s[]="Beijing";
B) char s[20]={"beijing"};
C) char s[20];s="Beijing";
D) char s[20]={'B','e','i','j','i','n','g'};
【1.53】对字符数组str赋初值,str不能作为字符串使用的一个是____。
A) char str[]="shanghai";
B) char str[]={"shanghai"};
C) char str[9]={'s','h','a','n','g','h','a','i'};
D) char str[8]={ 's','h','a','n','g','h','a','i'};
【1.55】如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为____。
A) 静态变量 B) 动态变量 C) 外部变量 D) 内部变量
【1.56】在一个C源程序文件中,若要定义一个只允许在该源文件中所有函数使用的变量,则该变量需要使用的存储类别是 。
A) extern B) register C) auto D) static
【1.57】在C语言中,函数的数据类型是指____。
A) 函数返回值的数据类型 B) 函数形参的数据类型
C) 调用该函数时的实参的数据类型 D) 任意指定的数据类型
【1.58】已知如下定义的函数:
fun1(a)
{ printf("\n%d",a);
}
则该函数的数据类型是____。
A) 与参数a的类型相同 B) void型
C) 没有返回值 D) 无法确定
【1.59】定义一个函数实现交换x和y的值,并将结果正确返回。能够实现此功能的是____。
A) swapa(int x,int y) B) swapb(int *x,int *y)
{ int temp; { int temp;
temp=x;x=y;y=temp; temp=x;x=y;y=temp;
} }
C) swapc(int *x,int *y) D) swapd(int *x,int *y)
{ int temp; { int *temp;
temp=*x;*x=*y;*y=temp; temp=x;x=y;y=temp;
} }
【1.60】求一个角的正弦函数值的平方。能够实现此功能的函数是____。
A) sqofsina(x)
float x;
{ return(sin(x)*sin(x));
}
B) double sqofsinb(x)
float x;
{ return(sin((double)x)*sin((double)x));
}
C) double sqofsinc(x)
{ return(((sin(x)*sin(x));
}
D) sqofsind(x)
float x;
{ return(double(sin(x)*sin(x)));
【1.61】一个函数内有数据类型说明语句如下:
double x,y,z(10);
关于此语句的解释,下面说法正确的是____。
A) z是一个数组,它有10个元素。
B) z是一个函数,小括号内的10是它的实参的值。
C) z是一个变量,小括号内的10是它的初值。
D) 语句中有错误。
【1.62】已知函数定义如下:
float fun1(int x,int y)
{ float z;
z=(float)x/y;
return(z);
}
主调函数中有int a=1,b=0;可以正确调用此函数的语句是____。
A) printf("%f",fun1(a,b)); B) printf("%f",fun1(&a,&b));
C) printf("%f",fun1(*a,*b)); D) 调用时发生错误


【1.63】下面函数的功能是____。
a(s1,s2)
char s1[],s2[];
{ while(s2++=s1++) ;
}
A) 字符串比较 B) 字符串复制 C) 字符串连接 D) 字符串反向
【1.64】在下列结论中,只有一个是错误的,它是 。
A) C语言允许函数的递归调用
B) C语言中的continue语句,可以通过改变程序的结构而省略
C) 有些递归程序是不能用非递归算法实现的
D) C语言中不允许在函数中再定义函数
【1.65】已知:int a, *y=&a;则下列函数调用中错误的是 。
A) scanf("%d", &a); B) scanf("%d", y);
C) printf("%d", a); D) printf("%d", y);
【1.66】说明语句"int (*p)( );"的含义是 。
A) p是一个指向一维数组的指针变量
B) p是指针变量,指向一个整型数据
C) p是一个指向函数的指针,该函数的返回值是一个整型
D) 以上都不对
【1.67】设有说明int (*p)[4];其中的标识符p是 。
A) 4个指向整型变量的指针变量
B) 指向4个整型变量的函数指针
C) 一个指向具有4个整型元素的一维数组的指针
D) 具有4个指向整型变量的指针元素的一维指针数组
【1.68】已知:char s[10], *p=s,则在下列语句中,错误的语句是 。
A) p=s+5; B) s=p+s; C) s[2]=p[4]; D) *p=s[0];
【1.69】已知:char s[100];int i;则引用数组元素的错误的形式是 。
A) s[i+10] B) *(s+i) C) *(i+s) D) *((s++)+i)
【1.70】已知:char s[6], *ps=s;则正确的赋值语句是 。
  A) s="12345"; B) *s="12345"; C) ps="12345"; D) *ps="12345";
【1.71】已知:char a[3][10]={"BeiJing","ShangHai","TianJin"}, *pa=a;不能正确显示字符串"ShangHai"的语句是 。
A) printf("%s",a+1); B) printf("%s",*(a+1));
C) printf("%s",*a+1); D) printf("%s",&a[1][0]);
【1.72】已知:int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*ptr)[3]=a,*p=a[0];
则以下能够正确表示数组元素a[1][2]的表达式是 。
A) *(*(a+1)+2) B) *(*(p+5)) C) (*ptr+1)+2 D) *((ptr+1)[2])
【1.73】已知:int a[ ]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a;则值为3的表达式是 。
A) p+=2,*(p++) B) p+=2,*++p C) p+=2,*p++ D) p+=2,++*p
【1.74】已知:int a[]={1,2,3,4}, y, *p=a;则执行语句y = (*++p)--;之后, 数组a各元素的值变为______。
A) 0,1,3,4 B) 1,1,3,4 C) 1,2,2,4 D) 1,2,3,3
变量y的值是____。
A) 1 B) 2 C) 3 D) 4
【1.75】已知:int a[ ]={1,3,5,7}, y *p= a;为使变量y的值为3,下列语句正确的是____。
A) y=++*p++; B) y=++(*p++); C) y=(++*p)++; D) y=(*++p)++;
【1.76】已知:int x[ ]={ 1,3,5,7,9,11 },*ptr=x;则能够正确引用数组元素的语句是 。
A) x B) *(ptr--) C) x[6] D) *(--ptr)
【1.77】函数的功能是交换变量x和y中的值,且通过正确调用返回交换的结果。能正确执行此功能的函数是 。
A) funa (int *x, int *y) B) funb (int x, int y)
{ int *p; { int t;
p=x;*x=*y;*y=*p; t=x;x=y;y=t;
} }
C) func (int *x, int *y) D) func (int *x, int *y)
{ *x=*y;*y=*x; { *x=*x+*y;*y=*x-*y;*x=*x-*y;
} }
【1.78】有定义如下:
struct sk
{ int a;
float b;
}data ,*p;
如果 p=&data;则对于结构变量data的成员a的正确引用是____。
A)(*).data.a B) (*p).a C) p->data.a D) p.data.a
【1.79】已知:
struct st
{ int n;
struct st *next;
};
static struct st a[3]={1,&a[1],3,&a[2],5,&a[0]},*p;
如果下述语句的显示是2,则对p的赋值是____。
printf("%d",++(p->next->n));
A) p=&a[0]; B) p=&a[1]; C) p=&a[2]; D) p=&a[3];
【1.80】已知:
struct person
{ char name[10];
int age;
}class[10]={"LiMing",29,"ZhangHong",21,"WangFang",22};
下述表达式中,值为72的一个是____。
A) class[0]->age + class[1]->age+ class[2]->age
B) class[1].name[5]
C) person[1].name[5]
D) clase->name[5]
【1.81】已知:
struct
{ int i;
char c;
float a;
}test;
则sizeof(test)的值是 。
A) 4 B) 5 C) 6 D) 7
【1.82】已知:
union
{ int i;
char c;
float a;
}test;
则sizeof(test)的值是 。
A) 4 B) 5 C) 6 D) 7
【1.83】已知:
union u_type
{ int i;
char ch;
float a;
}temp;
现在执行"temp.i=266;printf("%d",temp.ch)"的结果是 。
A) 266 B) 256 C) 10 D) 1
【1.84】若有以下程序段:
struct dent
{ int n;
int *m;
};
int a=1,b=2,c=3;
struct dent s[3] = { {101,&a},{102,&b},{103,&c} };
struct dent *p=s;
则以下表达式中值为2的是 。
A) (p++)->m B) *(p++)->m C) (*p).m D) *(++p)->m
【1.85】若有以下说明语句,则对结构变量pup中sex域的正确引用是 。
struct pupil
{ char name[20];
int sex;
}pup,*p;
p=&pup;
A) p.pup.sex B) p->pup.sex C) (*p).pup.sex D) (*p).sex
【1.86】以下对结构变量stul中成员age的非法引用是 。
struct student
{ int age;
int num;
}stu1,*p;
p=&stu1;
A) stu1.age B) student.age C) p->age D) (*p).age
【1.87】若有以下定义和语句:
union data
{ int i;
char c;
float f;
}a;
int n;
则以下语句正确的是         。A) a=5; B) a={2,'a',1.2}; C) printf("%d\n",a); D) n=a;
【1.88】已知:
struct sk
{ int a;
int age;
}date,*p;
如果要使指针p指向data中的成员a,正确的赋值语句是____。
A) p = (struct sk *)&data.a; B) p = (struct sk *)data.a;
C) p = &data.a; D) *p = data.a;
【1.89】已知 enum week {sun,mon,tue,wed,thu,fri,sat}day;则正确的赋值语句是____。
A) sun=0; C) san=day; D) sun=mon; D) day=sun;
【1.90】已知 enum color {red,yellow=2,blue,white,black}ren;执行下述语句的输出结果是____。
printf("%d",ren=white);
A) 0 B) 1 C) 3 D) 4
【1.91】已知 enum name{zhao=1,qian,sun,li}man;执行下述程序段后的输出是____。
man=0;
switch(man)
{ case 0: printf("eople\n");
case 1: printf("Man\n");
case 2: printf("Woman\n");
default: printf("Error\n");
}
A) People B) Man C) Woman D)Error




【1.92】下述关于枚举类型名的定义中,正确的是____。
A) enem a={ one,two,three }; B) enem a { one=9,two=-1,three };
C) enem a={"one","two","three"}; D) enem a {"one","two","three"};
【1.93】C语言中标准输入文件stdin是指 。
    A) 键盘 B) 显示器 C) 鼠标 D) 硬盘
【1.94】要打开一个已存在的非空文件"file"用于修改,选择正确的语句____。
A) fp=fopen("file", "r"); B) fp=fopen("file", "a+");
C) fp=fopen("file", "w"); D) fp=fopen('file", "r+");
【1.95】当顺利执行了文件关闭操作时,fclose函数的返回值是 。
A) -1 B) TRUE C) 0 D) 1
【1.96】fscanf函数的正确调用形式是 。
A) fscanf (文件指针, 格式字符串, 输出列表);
B) fscanf (格式字符串, 输出列表, 文件指针);
C) fscanf (格式字符串, 文件指针, 输出列表);
D) fscanf (文件指针, 格式字符串, 输入列表);
【1.98】已知宏定义
#define N 3
#define Y(n) ((N+1)*n)
执行语句z=2*(N+Y(5+1));后,变量z的值是____。
A) 42 B) 48 C) 52 D) 出错
【1.99】已知宏定义 #define SQ(x) x*x,执行语句printf("%d",10/SQ(3));后的输出结果是____。
A) 1 B) 3 C) 9 D) 10
【1.100】已知宏定义如下:
#define PR printf
#define NL "\n"
#define D "%d"
#define D1 DNL
若程序中的语句是 PR(D1,a);经预处理后展开为____。
A) printf(%d\n,a); B) printf("%d\n",a);
C) printf("%d""\n",a); D) 原语句错误
二、 阅读程序题
导读:学会阅读程序对于初学者来说很重要,一方面可以巩固所学的语法知识,另一方面通过阅读别人写好的程序来打开自己的思路,就所谓见多识广。读者通过阅读理解程序,从给出的四个备选参考答案中,选择程序的正确输出。如果选择有误,就要认真分析原因,是概念方面的错误还是对程序逻辑理解不对,从而加深对语法规则的理解,提高程序设计能力。程序设计语言是开发程序的一个工具,学习语言的目的是为了编写程序来解决实际问题,所以特别提倡通过实际上机来检验备选答案,增强动手能力。习题基本上是按照教材的章节来安排的,读者可以根据学习的进度选择部分习题。
【2.1】以下程序的输出结果是 。 main( )
{ float a;
a=1/100000000;
printf("%g",a);
}
A) 0.00000e+00 B) 0.0 C) 1.00000e-07 D) 0
【2.2】下面程序的输出结果是____。
#include <stdio.h>
  main( )
{ int x=10;
{ int x=20;
printf ("%d,", x);
}
printf("%d\n", x);
}
A) 10,20 B) 20,10 C) 10,10 D) 20,20
【2.3】以下程序的输出结果是____。
main()
{ unsigned int n;
int i=-521;
n=i;
printf("n=%u\n",n);
}
A) n=-521 B) n=521 C) n=65015 D) n=102170103
【2.4】以下程序的输出结果是 。 main( )
{ int x=10, y=10; printf("%d %d\n", x――, ――y);
}
A) 10 10 B) 9 9 C) 9 10 D) 10 9
【2.5】以下程序的输出结果是____。
main()
{ int n=1;
printf("%d %d %d\n",n,n++,n--);
}
A) 1 1 1 B) 1 0 1 C) 1 1 0 D) 1 2 1
【2.6】以下程序的输出结果是____。
main()
{ int x=0x02ff,y=0x0ff00;
printf("%d\n",(x&y)>>4|0x005f);
}
A) 127 B) 255 C) 128 D) 1
【2.7】以下程序的输出结果是____。
main()
{ int a=1;
char c='a';
float f=2.0;
printf("%d\n",(!(a==0),f!=0&&c=='A'));
}
A) 0 B) 1
【2.8】下面程序的输出结果是____。
main()
{ int a=1,i=a+1;
do
{ a++ ;
}while( !~i++ > 3);
printf("%d\n",a);
}
A) 1 B) 2 C) 3 D) 4
【2.9】下面程序的输出结果是____。
main()
{ int a=111;
a=a^00;
printf("%d,%o\n",a,a);
}
A) 111,157 B) 0,0 C) 20,24 D) 7,7
【2.10】下面程序的输出结果是____。
main()
{ char s[12]= "a book";
printf("%.4s",s);
}
A) a book! B) a book!<四个空格》
C) a bo D) 格式描述错误,输出不确定
【2.11】下面程序的输出结果是____。
main()
{ int a,b;
scanf("%2d%3d",&a,&b);
printf("a=%d b=%d\n",a,b);
}
A) a=12 b=34 B) a=123 b=45 C) a=12 b=345 D) 语句右错误
【2.12】以下程序段的输出结果是 。 int a=10,b=50,c=30;
if(a>b)
a=b;
b=c;
c=a;
printf("a=%d b=%d c=%d\n",a,b,c);
A) a=10 b=50 c=10 B) a=10 b=30 c=10
C) a=50 b=30 c=10 D) a=50 b=30 c=50
【2.13】以下程序的输出结果是 。 main()
{ int a=0,b=1,c=0,d=20;
if(a) d=d-10;
else if(!b)
if(!c) d=15;
else d=25;
printf("d=%d\n",d);
}
A) d=10 B) d=15 C) d=20 D) d=25
【2.14】下面程序的输出结果为 。
main()
{ int a=1,b=0;
switch(a)
{ case 1: switch (b)
{ case 0: printf("**0**"); break;
case 1: printf("**1**"); break;
}
case 2: printf("**2**"); break;
}
}
A) **0** B) **0****2** C) **0****1****2** D) 有语法错误
【2.15】以下程序的输出结果是 。 main()
{ char *s="12134211";
int v1=0,v2=0,v3=0,v4=0,k;
for(k=0;s[k];k++)
switch(s[k])
{ case '1': v1++;
case '3': v3++;
case '2': v2++;
default: v4++;
}
printf("v1=%d, v2=%d, v3=%d, v4=%d\n",v1,v2,v3,v4);
}
A) v1=4,v2=2,v3=1,v4=1 B) v1=4,v2=9,v3=3,v4=1
C) v1=5,v2=8,v3=6,v4=1 D) v1=4,v2=7,v3=5,v4=8
【2.16】下面程序的输出是 。
main()
{ int x=1,y=0,a=0,b=0;
switch(x)
{ case 1: switch(y)
{ case 0: a++;break;
case 1: b++;break;
}
case 2: a++;b++;break;
}
printf("a=%d,b=%d\n",a,b);
}
A) a=2,b=1 B) a=1,b=1 C) a=1,b=0 D) a=2,b=2
【2.17】下面程序的输出是____。
main()
{ int num=0;
while(num<=2)
{ num++;
printf("%d\n",num);
}
}
A) 1 B) 1 C) 1 D) 1
2 2 2
3 3
4
【2.18】下面程序的输出结果是____。
main()
{ int a=1,b=0;
do
{ switch(a)
{ case 1: b=1;break;
case 2: b=2;break;
default : b=0;
}
b=a+b;
}while(!b);
printf("a=%d,b=%d",a,b);
}
A) 1,2 B) 2,1 C) 1,1 D) 2,2
【2.19】从键盘上输入"446755"时,下面程序的输出是____。
#include <stdio.h>
main()
{ int c;
while((c=getchar())!='\n')
switch(c -'2')
{ case 0:
case 1: putchar(c+4);
case 2: putchar(c+4);break;
case 3: putchar(c+3);
default: putchar(c+2);break;
}
printf("\n");
}
A) 888988 B) 668966 C) 88898787 D) 66898787
【2.20】下面程序的输出结果是____。
main()
{ int k=0;
char c='A';
do
{ switch(c++)
{ case 'A': k++;break;
case 'B': k--;
case 'C': k+=2;break;
case 'D': k=k%2;contiue;
case 'E': k=k+10;break;
default: k=k/3;
}
k++;
}while(c<'C') ;
printf("k=%d\n",k);
}
A) k=1 B) k=2 C) k=3 D) k=4
【2.21】下面程序的输出结果是____。
main()
{ int x,i;
for(i=1;i<=100;i++)
{ x=i;
if(++x%2==0)
if(++x%3==0)
if(++x%7==0)
printf("%d ",x);
}
}
A) 39 81 B) 42 84 C) 26 68 D) 28 70
【2.22】下面程序的输出结果是____。
#include <stdio.h>
main( )
{ int i,k,a[10],p[3];
k=5;
for(i=0;i<10;i++)
a=i;
for(i=0;i<3;i++)
p=a[i*(i+1)];
for(i=0;i<3;i++)
k+=p*2;
printf("%d\n",k);
}
A) 20 B) 21 C) 22 D) 23
【2.23】假定从键盘上输入"3.6,2.4<回车>",下面程序的输出是____。
#include <math.h>
main()
{ float x,y,z;
scanf("%f,%f",&x,&y);
z=x/y;
while(1)
{ if(fabs(z)>1.0)
{ x=y;
y=z;
z=x/y;
}
else break;
}
printf("%f\n",y);
}
A) 1.500000 B) 1.600000 C) 2.000000 D) 2.400000
【2.24】下面程序的输出结果是____。
main()
{ int i,j,x=0;
for(i=0;i<2;i++)
{ x++;
for(j=0;j<-3;j++)
{ if(j%2)
continue;
x++;
}
x++;
}
printf("x=%d\n",x);
}
A) x=4 B) x=8 C) x=6 D) x=12
【2.25】下面程序的输出结果是____。
main()
{ int i,j,k=10;
for(i=0;i<2;i++)
{ k++;
{ int k=0;
for(j=0;j<=3;j++)
{ if(j%2) continue;
k++;
}
}
k++;
}
printf("k=%d\n",k);
}
A) k=4 B) k=8 C) k=14 D) k=18
【2.26】下面程序的输出结果是____。
#include <stdio.h>
main( )
{ int n[3][3], i, j;
for(i=0;i<3;i++ )
for(j=0;j<3;j++ )
n[j]=i+j;
for(i=0;i<2;i++ )
for(j=0;j<2;j++ )
n[i+1][j+1]+=n[j];
printf("%d\n", n[j]);
}
A) 14 B) 0 C) 6 D) 不确定
【2.27】下面程序的输出结果是____。
#include <stdio.h>
main( )
{ int a[4][5]={1,2,4,-4,5,-9,3,6,-3,2,7,8,4};
int i,j,n;
n=9;
i=n/5;
j=n-i*5-1;
printf("a[%d][%d]=%d\n", i,j,a[j]);
}
A) 6 B) -3 C) 2 D) 不确定
【2.28】下面程序的输出结果是____。
int m[3][3]={ {1}, {2}, {3} };
int n[3][3]={ 1, 2, 3 };
main( )
{ printf("%d\n", m[1][0]+n[0][0] ); /* ① */
printf("%d\n", m[0][1]+n[1][0] ); /* ② */
}
① A) 0 B) 1 C) 2 D) 3
② A) 0 B) 1 C) 2 D) 3
【2.29】下面程序的输出结果是____。
#include <stdio.h>
main( )
{ char s1[50]={"some string *"},s2[]={"test"};
printf("%s\n", strcat(s1,s2));
}
A) some string * B) test
C) some stritest D) some string *test
【2.30】下面程序的输出结果是____。
#include <stdio.h>
f(char *s)
{ char *p=s;
while(*p!='\0')
p++;
return(p-s);
}
main()
{ printf("%d\n",f("ABCDEF"));
}
A) 3 B) 6 C) 8 D) 0
【2.31】下面程序的输出结果是____。
#include <stdio.h>
#include <string.h>
main( )
{ char str[100] ="How do you do";
strcpy( str + strlen(str)/2, "es she");
printf("%s\n", str);
}
A) How do you do B) es she C) How are you D) How does she
【2.32】下面程序的输出结果是____。
#include <stdio.h>
func(int a,int b)
{ int c;
c=a+b;
return(c);
}
main()
{ int x=6,y=7,z=8,r;
r=func((x--,y++,x+y),z--);
printf("%d\n",r);
}
A) 11 B) 20 C) 21 D) 31
【2.33】下面程序的输出结果是____。
#include <stdio.h>
void fun(int *s)
{ static int j=0;
do
{ s[j]+=s[j+1];
}while(++j<2);
}
main()
{ int k,a[10]={1,2,3,4,5};
for(k=1;k<3;k++)
fun(a);
for(k=0;k<5;k++)
printf("%d",a[k]);
}
A) 35756 B) 23445 C) 35745 D) 12345
【2.34】下面程序的输出结果是____。
#include <stdio.h>
int k=1;
main( )
{ int i=4;
fun(i);
printf ("\n%d,%d",i,k); /* ① */
}
fun(int m)
{ m+=k;k+=m;
{ char k='B';
printf("\n%d",k-'A'); /* ② */
}
printf("\n%d,%d",m,k); /* ③ */
}
① A) 4,1 B) 5,6 C) 4,6 D) A,B,C参考答案都不对
② A) 1 B) -59 C) -64 D) A,B,C参考答案都不对
③ A) 5,66 B) 1,66 C) 5,6 D) A,B,C参考答案都不对
【2.35】下面程序的输出结果是____。
#include <stdio.h>
fun(int n, int *s)
{ int f1, f2;
if(n==1||n==2)
*s=1;
else
{ fun(n-1, &f1);
fun(n-2, &f2);
*s=f1+f2;
}
}
main()
{ int x;
fun(6, &x);
printf("%d\n", x);
}
A) 6 B) 7 C) 8 D) 9
【2.36】下面程序的输出结果是____。
int w=3;
main()
{ int w=10;
printf("%d\n",fun(5)*w);
}
fun(int k)
{ if(k==0) return(w);
return(fun(k-1)*k);
}
A) 360 B) 3600 C) 1080 D) 1200
【2.37】下面程序的输出结果是____。
#include <stdio.h>
funa(int a)
{ int b=0;
static int c=3;
a=c++,b++;
return(a);
}
main()
{ int a=2,i,k;
for(i=0;i<2;i++)
k=funa(a++);
printf("%d\n",k);
}
A) 3 B) 0 C) 5 D) 4
【2.38】下面程序的输出结果是____。
#include <stdio.h>
void num()
{ extern int x,y;
int a=15,b=10;
x=a-b;
y=a+b;
}
int x,y;
main()
{ int a=7,b=5;
x=a-b;
y=a+b;
num();
printf("%d,%d\n",x,y);
}
A) 12,2 B) 5,25 C) 1,12 D) 输出不确定
【2.39】下面程序的输出结果是____。
main()
{ int a=2,i;
for(i=0;i<3;i++)
printf("%4d",f(a));
}
f(int a)
{ int b=0;
static int c=3;
b++;
c++;
return(a+b+c);
}
A) 7 7 7 B) 7 10 13 C) 7 9 11 D) 7 8 9
【2.40】下面程序的输出结果是____。
#include <stdio.h>
try( )
{ static int x=3;
x++;
return(x);
}
main( )
{ int i, x;
for(i=0; i<=2; i++ )
x=try( );
printf("%d\n", x);
}
A) 3 B) 4 C) 5 D) 6
【2.41】下面程序的输出结果是____。
#include <stdio.h>
main( )
{ int x=1;
    void f1( ), f2( );
   f1( );
f2(x);
printf("%d\n", x);
}
void f1(void)
{ int x=3;
printf("%d ", x);
}
void f2( x )
int x;
{ printf("%d ", ++x);
}
A) 1 1 1 B) 2 2 2 C) 3 3 3 D) 3 2 1
【2.42】下面程序的输出结果是____。
#include <stdio.h>
#define SUB(X,Y) (X)*Y
main()
{ int a=3,b=4;
printf("%d\n",SUB(a++,b++));
}
A) 12 B) 15 C) 16 D) 20
【2.43】下面程序的输出结果是____。
main()
{ int a[]={1,2,3,4,5,6};
int *p;
p=a;
printf("%d ",*p);
printf("%d ",*(++p));
printf("%d ",*++p);
printf("%d ",*(p--));
p+=3;
printf("%d %d ",*p,*(a+3));
}
A) 1 2 3 3 5 4 B) 1 2 3 4 5 6 C) 1 2 2 3 4 5 D) 1 2 3 4 4 5
【2.44】下面程序的输出结果是____。
main()
{ int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a;
p+=6;
printf("%d ",*p); /* ① */
printf("%d ",*(*(a+6))); /* ② */
printf("%d ",*(a[1]+=2)); /* ③ */
printf("%d",*(&a[0][0]+6));/* ④ */
}
A) 7 7 7 7 B) ②句语法错误 C) ③句语法错误 D) ④句语法错误
【2.45】下面程序的输出结果是____。
#define FMT "%X\n"
#include <stdio.h>
main( )
{ static int a[ ][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
printf( FMT, a[2][2]); /* ① */
printf( FMT, *(*(a+1)+1) ); /* ② */
}
① A) 9 B) 11 C) A D) B
② A) 6 B) 7 C) 8 D) 前面三个参考答案均是错误的
【2.46】下面程序的输出结果是____。
#include <stdio.h>
main ( )
{ int a[]={1, 2, 3, 4, 5} ;
int x, y, *p;
p=&a[0];
x=*(p+2);
y=*(p+4);
printf("%d,%d,%d\n", *p, x, y);
}
A) 1,3,5 B) 1,2,3 C) 1,2,4 D) 1,4,5
【2.47】下面程序的输出结果是____。
void ive(x,n)
int x[],n;
{ int t,*p;
p=x+n-1;
while(x<p)
{ t=*x;
*x++=*p;
*p--=t;
}
return;
}
main()
{ int i,a[]={1,2,3,4,5,6,7,8,9,0};
ive(a,10);
for(i=0;i<10;i++)
printf("%d ",a);
printf("\n");
}
A) 1 2 3 4 5 6 7 8 9 0 B) 0 9 8 7 6 5 4 3 2 1
C) 1 3 5 7 9 2 4 6 8 0 D) 0 8 6 4 2 9 7 5 3 1
【2.48】下面程序的输出结果是____。
#include "string.h"
fun(char *w,int n)
{ char t,*s1,*s2;
s1=w;s2=w+n-1;
while(s1<s2)
{ t=*s1++;
*s1=*s2--;
*s2=t;
}
}
main()
{ static char *p="1234567";
fun(p,strlen(p));
printf("%s",p);
}
A) 7654321 B) 1717171 C) 7171717 D) 1711717
【2.49】下面程序的输出结果是____。
#include <stdio.h>
char *p = "abcdefghijklmnopq" ;
main( )
{ int i=0;
while( *p++!='e' );
printf("%c\n", *p);
}
A) c B) d C) e D) f
【2.50】下面程序的输出结果是____。
#include <stdio.h>
f(int x, int y)
{ return (y-x);
}
main( )
{ int a=5, b=6, c;
int f(), (*g)()=f;
printf("%d\n", (*g)(a,b) );
}
A) 1 B) 2 C) 3 D) 前面三个参考答案均是错误的【2.51】下面程序的输出结果是____。
#include <stdio.h>
main( )
{ int a=1,*p,**pp;
pp=&p;
p=&a;
a++;
printf ("%d,%d,%d\n", a,*p, **pp);
}
A) 2,1,1 B) 2,1,2 C) 2,2,2 D) 程序有错误
【2.52】下面程序的输出结果是____。
main()
{ char *alpha[7]={"ABCD","EFGH","IJKL","MNOP","QRST","UVWX","YZ"};
char **p;
int i;
p=alpha;
for(i=0;i<4;i++)
printf("%c",*(p));
printf("\n");
}
A) AEIM B) BFJN C) ABCD D) DHLP
【2.53】下面程序的输出结果是____。
#include <stdio.h>
char *pp[2][3]={ "abc", "defgh", "ijkl", "mnopqr", "stuvw", "xyz"};
main ( )
{ printf("%c\n",***(pp+1)); /* ① */
printf("%c\n",**pp[0]); /* ② */
printf("%c\n",(*(*(pp+1)+1))[4]); /* ③ */
printf("%c\n",*(pp[1][2]+2)); /* ④ */
printf("%s\n",**(pp+1)); /* ⑤ */
}
① A) a B) d C) i D) m
② A) a B) d C) i D) m
③ A) h B) l C) q D) w
④ A) k B) o C) u D) z
⑤ A) ijkl B) mnopqr C) stuvw D) xyz
【2.54】下面程序的输出结果是____。
#include "stdio.h"
struct str1
{ char c[5];
char *s;
};
main( )
{ struct str1 s1[2]={ {"ABCD""EFGH"},{"IJK","LMN"} };
struct str2
{ struct str1 sr;
int d;
}s2={"OPQ","RST",32767};
struct str1 *p[2];
p[0]=&s1[0];
p[1]=&s1[1];
printf("%s",++p[1]->s); /* ① */
printf("%c",s2.sr.c[2]); /* ② */
}
① A) LMN B) MN C) N D) IJK
② A) O B) P C) Q D) R
【2.55】以下程序的输出结果是____。
struct st
{ int x,*y;
}*p;
int s[]={10,20,30,40};
struct st a[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};
main()
{ p=a;
printf("%d\n",++(*(++p)->y));
}
A) 10 B) 11 C) 20 D) 21
【2.56】以下程序的输出结果是____。
#include <stdio.h>
main()
{ union EXAMPLE
{ struct
{ int x,y;
}in;
int a,b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf("%d,%d\n",e.in.x,e.in.y);
}
A) 2,3 B) 4,4 C) 4,8 D) 8,8
【2.57】下面程序的输出结果是____。
#include <stdio.h>
main()
{ union
{ int i[2];
long k;
char c[4];
}r,*s=&r;
s->i[0]=0x39;
s->i[1]=0x38;
printf("%c\n",s->c[0]);
}
A) 39 B) 9 C) 38 D) 8
【2.58】下面程序的输出是 。
main ( )
{ printf("%d\n", EOF);
}
A) -1 B) 0 C) 1 D) 程序是错误的
三、程序填空题
导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路,再选择正确的内容填入空白处,使程序完成既定的功能。这类习题的设计就是要引导读者逐步掌握编程的方法。本节习题的难度适中,可能有些典型的程序在课堂上已经有所接触,读者一定要独立完成它,这样就可以逐步提高自己的编程能力。在程序设计语言学习的中期,读者对程序设计已经有了初步的了解,而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而提高学习的效率。
【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。
#include <stdio.h>
main()
{ int a,b;
scanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
a= ① ;
b= ② ;
a= ③ ;
printf("a=%d,b=%d\n",a,b);
}
【3.2】下面程序的功能是根据近似公式:π2/6≈ 1/12+1/22+1/32+ …… +1/n2,求π值。
#include <math.h>
double pi(long n)
{ double s=0.0;
long i;
for(i=1;i<=n;i++)
s=s+ ① ;
return( ② );
}
【3.3】下面的程序的功能是求一维数组中的最小元素。
findmin(int *s,int t,int *k)
{ int p;
for(p=0,*k=p;p<t;p++)
if(s[p]<s[*k])
① ;
}
main()
{ int a[10],i,*k=&i;
for(i=0;i<10;i++)
scanf("%d",&a);
findmin(a,10,k);
printf("%d,%d\n",*k,a[*k]);
}
【3.4】下面程序的功能是计算1-3+5-7+ …… -99+101的值。
main()
{ int i,t=1,s=0;
for(i=1;i<=101;i+=2)
{ ① ;
s=s+t;
② ;
}
printf("%d\n",s);
}
【3.5】有以下程序段:
s=1.0;
for(k=1;k<=n;k++)
s=s+1.0/(k*(k+1));
printf("%f\n",s);
填空完成下述程序,使之与上述程序的功能完全相同。
s=0.0;
① ;
k=0;
do
{ s=s+d;
② ;
d=1.0/(k*(k+1));
}while( ③ );
printf("%f\n",s);
【3.7】下面程序的功能是将形参x的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为0的元素中。
fun(int x,int b[])
{ int k=0,r;
do
{ r=x% ① ;
b[k++]=r;
x/= ② ;
}while(x);
}
【3.8】下面程序的功能是输出1到100之间每位数的乘积大于每位数的和的数。例如数字26,数位上数字的乘积12大于数字之和8。
main()
{ int n,k=1,s=0,m;
for(n=1;n<=100;n++)
{ k=1;
s=0;
① ;
while( ② )
{ k*=m%10;
s+=m%10;
③ ;
}
if(k>s)
printf("%d",n);
}
}
【3.9】下面程序的功能是统计用0至9之间的不同的数字组成的三位数的个数。
main()
{ int i,j,k,count=0;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
if( ① ) continue;
else for(k=0;k<=9;k++)
if( ② ) count++;
printf("%d",count);
}
【3.10】下面程序的功能是输出100以内的个位数为6、且能被3整除的所有数。
main()
{ int i,j;
for(i=0; ① ;i++)
{ j=i*10+6;
if( ② ) countinue;
printf("%d",j);
}
}
【3.11】下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。
hcf(int m,int n)
{ int r;
if(m<n)
{ r=m;
① ;
n=r;
}
r=m%n;
while( ② )
{ m=n;
n=r;
r=m%n;
}
③ ;
}
【3.12】下面程序的功能是使用冒泡法对输入的10个浮点数从小到大进行排序。排好序的10个数分两行输出。程序如下:
#include <stdio.h>
main()
{ ① ;
int i,j;
printf("Input 10 numbers please\n");
for(i=0; ② ;i++ )
scanf("%f", &a);
printf("\n");
for(i=2; ③ ;i++ )
for(j=0; ④ ;j++ )
if( ⑤ )
{ x=a[j];
⑥ ;
a[j+1]=x;
}
printf("The sorted 10 numbers;\n");
for(i=0; ⑦ ;i++ )
{ if( ⑧ )
printf("\n");
printf("%f\t",a);
}
printf("\n");
}
【3.13】下面程序的功能是读入20个整数,统计非负数个数,并计算非负数之和。
#include "stdio.h"
main()
{ int i,a[20],s,count;
s=count=0;
for(i=0;i<20;i++ )
scanf("%d", ① );
for(i=0;i<20;i++)
{ if(a<0)
② ;
s+=a
count++;
}
printf("s=%d\t count=%d\n",s,count);
}
【3.14】下面程序的功能是删除字符串s中的空格。
#include <stdio.h>
main()
{ char *s="Beijing ligong daxue";
int i,j;
for(i=j=0;s!='\0';i++)
if(s!= ' ') ① ;
else ② ;
s[j]= '\0';
printf("%s",s);
}
【3.15】下面程序的功能是将字符串s中所有的字符'c'删除。请选择填空。
#include<stdio.h>
main( )
{ char s[80];
int i,j;
gets(s);
for(i=j=0;s!= '\0';i++ )
if(s!= 'c') ① ;
s[j]= '\0';
puts(s);
}
【3.16】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。
#include <stdio.h>
char x[]="programming";
char y[]="Fortran";
main()
{ int i=0;
while(x!= '\0' && y!= '\0')
if(x==y)
printf("%c", ① );
else
i++;
}
【3.17】下面程序的功能是将字符串s中的每个字符按升序的规则插到数组a中, 字符串a已排好序。
#include <string.h>
main()
{ char a[20]="cehiknqtw";
char s[]="fbla";
int i,k,j;
for(k=0;s[k]!= '\0';k++ )
{ j=0;
while(s[k]>=a[j] && a[j]!= '\0' )
j++;
for( ① )
② ;
a[j]=s[k];
}
puts(a);
}
【3.18】下面程序的功能是对键盘输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。例如:输入的两个字符串分别为"abcdefg"和"abceef",则输出为-1。
#include <stdio.h>
main()
{ char str1[100],str2[100],c;
int i,s;
printf("Enter string 1: "); gets(str1);
printf("Enter string 2: "); gets(str2);
i=0;
while((str1 == str2 && str1!= ① ))
i++;
s= ② ;
printf("%d\n", s);
}
【3.19】下面的函数expand在将字符串s复制到字符串t时, 将其中的换行符和制表符转换为可见的转义字符表示,即用'\n'表示换行符,用'\t'表示制表符。
expand(char s[],char t[])
{ int i,j;
for(i=j=0;s!= '\0';i++ )
switch (s)
{ case '\n': t[ ① ] = ② ;
t[j++] = 'n';
break;
case '\t': t[ ③ ] = ④ ;
t[j++] = 't';
break;
default: t[ ⑤ ] = s
break;
}
t[j] = ⑥ ;
}
【3.20】下面的函数index(char s[], char t[])检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则送回-1。
index(char s[], char t[])
{ int i,j,k;
for(i=0;s!= '\0';i++ )
{ for(j=i,k=0; ① && s[j]==t[k];j++,k++) ;
if( ② )
return (i);
}
return(-1);
}
n
【3.21】下面程序的功能是计算S= k! 。
k=0
long fun(int n)
{ int i;
long s;
for(i=1;i ① ;i++)
s*=i;
return( ② );
}
main()
{ int k,n;
long s;
scanf("%d",&n);
s= ③ ;
for(k=0;k<=n;k++)
s+= ④ ;
printf("%ld\n",s);
}
【3.22】下面程序的功能是显示具有n个元素的数组s中的最大元素。
#define N 20
main()
{ int i,a[N];
for(i=0;i<N;i++)
scanf("%d",&a);
printf("%d\n", ① );
}
fmax(int s[],int n)
{ int k,p;
for(p=0,k=p;p<n;p++)
if(s[p]>s[k]) ② ;
return(k);
}
【3.23】下面程序的功能是由键盘输入n,求满足下述条件的x、y:
nx和ny的末3位数字相同,且x≠y,x、y、n均为自然数,并使x+y为最小。
#include <stdio.h>
pow3(int n,int x)
{ int i, last;
for(last=1,i=1;i<=x;i++ )
last= ① ;
return(last);
}
main()
{ int x,n,min,flag=1;
scanf("%d", &n);
for(min=2;flag;min++)
for(x=1;x<min && flag;x++ )
if( ② && pow3(n,x)==pow3(n,min-x))
{ printf("x=%d,y=%d\n", x, min-x );
③ ;
}
}
【3.24】下面的程序是用递归算法求a的平方根。求平方根的迭代公式如下:


#include <math.h>
double mysqrt( double a, double x0 )
{ double x1, y;
x1 = ① ;
if( fabs(x1-x0)>0.00001 )
y = mysqrt( ② );
else y = x1;
return( y );
}
main()
{ double x;
printf("Enter x: ");
scanf("%lf", &x);
printf("The sqrt of %lf=%lf\n", x, mysqrt( x, 1.0) );
}
【3.25】以下程序是计算学生的年龄。已知第一位最小的学生年龄为10岁,其余学生的年龄一个比一个大2岁,求第5个学生的年龄。
#include <stdio.h>
age( int n )
{ int c;
if( n==1 ) c=10;
else c= ① ;
return(c);
}
main()
{ int n=5;
printf("age:%d\n", ② );
}
【3.26】下面的函数sum(int n)完成计算1~n的累加和。
    sum(int n)
{ if(n<=0)
printf("data error\n");
if(n==1) ① ;
else ② ;
}
【3.27】下面的函数是一个求阶乘的递归调用函数。
facto(int n)
{ if( n == 1 ) ① ;
else return( ② );
}
【3.28】组合问题,由组合的基本性质可知:
(1) C(m,n)=C(n-m,n)
(2) C(m,n+1)=C(m,n)+C(m-1,n)
公式(2)是一个递归公式,一直到满足C(1,n)=n为止。当n<2*m时,可先用公式(1) 进行简化,填写程序中的空白,使程序可以正确运行。
#include"stdio.h"
main()
{ int m,n;
printf("Input m,n=");
scanf("%d%d", &m, &n);
printf("The combination numbeers is %d\n", combin(m,n));
}
combin( int m, int n)
{ int com;
if( n<2*m ) m=n-m;
if( m==0 ) com=1;
else if(m==1) ① ;
else ② ;
return(com);
}
【3.29】下列函数是求一个字符串str的长度。
 int strlen( char *str )
{ if( ① ) return (0);
  else return ( ② );
}
【3.30】用递归实现将输入小于32768的整数按逆序输出。如输入12345,则输出54321。
#include"stdio.h"
main()
{ int n;
printf("Input n : ");
scanf("%d", ① );
r(n);
printf("\n");
}
r( int m )
{ printf("%d", ② );
m = ③ ;
if( ④ )
⑤ ;
}
【3.31】输入n值,输出高度为n的等边三角形。例如当n=4时的图形如下:
*
***
*****
*******
#include <stdio.h>
void prt( char c, int n )
{ if( n>0 )
{ printf( "%c", c );
① ;
}
}
main()
{ int i, n;
scanf("%d", &n);
for( i=1; i<=n; i++ )
{ ② ;
③ ;
printf("\n");
}
}
【3.32】下面的函数实现N层嵌套平方根的计算。
double y(double x, int n)
{ if( n==0 )
return(0);
else return ( sqrt(x+( ① )) );
}
【3.34】下面函数用递归调用的方法,将str中存放的长度为n的字符串反转过来,例如原来是"ABCDE",反序为"EDCBA"。
void invent(char *str,int n)
{ char t;
t=*str; *str=*(str+n-1); *(str+n-1)=t; if( n>2 ) invent ( ① ,n-2);
else ② ;
}
【3.35】从键盘上输入10个整数,程序按降序完成从大到小的排序。
#include <stdio.h>
int array[10];
sort( int *p, int *q )
{ int *max, *s;
if( ① )
return;
max=p; for( s=p+1; s<=q; s++)
if( *s > *max )
② ; swap( ③ );
sort( ④ ); }
swap( int *x, int *y ) { int temp;
temp=*x;
*x=*y;
*y=temp;
}
main()
{ int i; printf("Enter data :\n"); for( i=0; i<10; i++)
scanf("%d", &array); sort( ⑤ );
printf("Output:");
for( i=0; i<10; i++)
printf("%d ", array);
}
【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483存放成"384"。
#include <stdio.h>
void convert(char *a, int n)
{ int i;
if((i=n/10) !=0 )
convert( ① , i );
*a = ② ;
}
char str[10]= " ";
main()
{ int number;
scanf("%d", &number);
convert( str, number );
puts(str);
}
【3.38】下面程序通过指向整型的指针将数组a[3][4] 的内容按3行×4列的格式输出,请给printf( )填入适当的参数,使之通过指针p将数组元素按要求输出。
#include <stdio.h>
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, *p=a;
main()
{ int i,j;
for(i=0;i<3;i++ )
{ for(j=0;j<4;j++ )
printf("%4d ", ① );
}
}
【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。
#include <stdio.h>
main ( )
{ char str[81], *sptr;
int i;
for(i=0;i<80;i++ )
{ str=getchar( );
if(str== '\n') break;
}
str= ① ;
sptr=str;
while( *sptr )
putchar( *sptr ② );
}
【3.40】下面函数的功能是将字符变量的值插入已经按ASCII码值从小到大排好序的字符串中。
void fun(char *w,char x,int *n)
{ int i,p=0;
while(x>w[p]) ① ;
for(i=*n;i>=p;i--) ② ;
w[p]=x;
++*n;
}
【3.41】下面程序的功能是从键盘上输入两个字符串,对两个字符串分别排序;然后将它们合并,合并后的字符串按ASCII码值从小到大排序,并删去相同的字符。
#include <stdio.h>
strmerge(a,b,c) /* 将已排好序的字符串a、b合并到c */
char *a,*b,*c;
{ char t,*w;
w=c;
while( *a!= '\0' ① *b!='\0' )
{ t= ② ?*a++:*b<*a ? *b++ : ( ③ ); /* 将*a、*b的小者存入t */
if( *w ④ '\0' ) *w=t;
else if( t ⑤ *w) *++w=t; /* 将与*w不相同的t存入w */
}
while( *a != '\0' ) /* 以下将a或b中剩下的字符存入w */
if( *a != *w ) *++w=*a++;
else a++;
while( *b != '\0')
if( *b != *w ) *++w=*b++;
else b++;
*++w = ⑥ ;
}
strsort( char *s ) /* 将字符串s中的字符排序 */
{ int i,j,n;
char t,*w;
⑦ ;
for( n=0;*w != '\0'; ⑧ )
w++;
for( i=0;i<n-1;i++ )
for( j=i+1;j<n;j++ )
if( s>s[j] )
{ ⑨ }
}
main( )
{ char s1[100],s2[100],s3[200];
printf("\nPlease Input First String:");
scanf("%s",s1);
printf("\nPlease Input Second String:");
scanf("%s",s2);
strsort(s1);
strsort(s2);
⑩ = '\0';
strmerge(s1,s2,s3);
printf("\nResult:%s",s3);
}
【3.42】已知某数列前两项为2和3,其后继项根据前面最后两项的乘积,按下列规则生成:
① 若乘积为一位数,则该乘积即为数列的后继项;
② 若乘积为二位数,则该乘积的十位上的数字和个位上的数字依次作为数列的两个后继项。
下面的程序输出该数列的前N项及它们的和,其中,函数sum(n,pa) 返回数列的前N项和,并将生成的前N项存入首指针为pa的数组中,程序中规定输入的N值必须大于2,且不超过给定的常数值MAXNUM。
   例如:若输入N的值为10,则程序输出如下内容:
sum(10)=44
2 3 6 1 8 8 6 4 2 4
#include "stdio.h"
#define MAXNUM 100
int sum(n, pa)
int n, *pa;
{ int count, total, temp;
*pa = 2;
① =3;
total=5;
count=2;
while( count++<n )
{ temp = *(pa-1) * *pa;
if( temp<10 )
{ total += temp;
*(++pa) = temp;
}
else
{ ② = temp/10;
total += *pa;
if( count<n )
{ count ++; pa++;
③ = temp%10;
total += *pa;
}
}
}
④ ;
}
main()
{ int n, *p, *q, num[MAXNUM];
do
{ printf("Input N=? (2<N<%d):", MAXNUM+1);
scanf("%d", &n);
}while( ⑤ );
printf("\nsum(%d)=%d\n", n, sum(n, num));
for( p=num, q = ⑥ ; p<q; p++ )
printf("%4d", *p);
printf("\n");
}
【3.43】下面程序的功能是输入学生的姓名和成绩,然后输出。
#include <stdio.h>
struct stuinf
{ char name[20]; /* 学生姓名 */
int score; /* 学生成绩 */
} stu, *p;
main ( )
{ p=&stu;
printf("Enter name:");
gets( ① );
printf("Enter score: ");
scanf("%d", ② );
printf("Output: %s, %d\n", ③ , ④ );
}
【3.44】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到输入0时才结束。
 #include <stdio.h>
#include <string.h>
#define NUM 4
 struct student
 { int rank;
char *name;
float score;
};
 ① stu[ ]={ 3,"liming",89.3,
 4,"zhanghua",78.2,
 1,"anli",95.1,
 2,"wangqi",90.6
};
main()
{ char str[10];
 int i;
 do
{ printf("Enter a name");
 scanf("%s",str);
 for( i=0;i<NUM;i++ )
 if( ② )
 { printf("Name :%8s\n",stu.name);
 printf("Rank :%3d\n",stu.rank);
 printf("Average :%5.1f\n",stu.score);
 ③ ;
 }
 if( i>=NUM ) printf("Not found\n");
 }while( strcmp(str,"0")!=0 );
}
【3.45】下面程序的功能是从终端上输入5个人的年龄、性别和姓名,然后输出。
#include "stdio.h"
struct man
{ char name[20];
unsigned age;
char sex[7];
};
main ( )
{ struct man person[5];
data_in(person,5);
data_out(person,5);
}
data_in(struct man *p, int n )
{ struct man *q = ① ;
for( ;p<q;p++ )
{ printf( "age:sex:name" );
scanf("%u%s", &p->age, p->sex);
② ;
}
}
data_out( struct man *p, int n )
{ struct man *q = __③__;
for( ;p<q;p++ )
printf("%s;%u;%s\n", p->name, p->age, p->sex);
}
【3.46】输入N个整数,储存输入的数及对应的序号,并将输入的数按从小到大的顺序进行排列。要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第3个整数为5,第7个整数也为5,则将先输入的整数5排在后输入的整数5的前面。程序如下:
#include "stdio.h"
#define N 10
struct
{ int no;
int num;
} array[N];
main( )
{ int i,j,num;
for( i=0;i<N;i++ )
{ printf("enter No. %d:",i);
scanf("%d",&num);
for( ① ;j>=0&&array[j].num ② num; ③ )
array[j+1]=array[j];
array[ ④ ].num=num;
array[ ⑤ ].no=i;
}
for( i=0;i<N;i++ )
printf("%d=%d,%d\n",i,array.num,array.no);
}
【3.47】以下程序的功能是:读入一行字符(如:a、...y、z),按输入时的逆序建立一个链接式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。

#include <stdio.h>
main( )
{ struct node
{ char info;
struct node *link;
} *top,*p;
char c;
top=NULL;
while((c= getchar( )) ① )
{ p=(struct node *)malloc(sizeof(struct node));
p->info=c;
p->link=top;
top=p;
}
while( top )
{ ② ;
top=top->link;
putchar(p->info);
free(p);
}
}
【3.48】下面函数将指针p2所指向的线性链表,串接到p1所指向的链表的末端。假定p1所指向的链表非空。
#define NULL 0
struct link
{ float a;
struct link *next;
};
concatenate ( p1,p2 )
struct list *p1,*p2;
{ if( p1->next==NULL )
p1->next=p2;
else
concatenate( ① ,p2);
}
【3.49】下面程序的功能是从键盘输入一个字符串,然后反序输出输入的字符串。
#include <stdio.h>
struct node
{ char data;
struct node *link;
}*head;
main()
{ char ch;
struct node *p;
head = NULL;
while(( ch=getchar())!='\n' )
{ p = (struct node *)malloc(sizeof(struct node));
p->data = ch;
p->link = ① ;
head = ② ;
}
③ ;
while( p!=NULL )
{ printf("%c ", p->data);
p = p->link;
}
}
【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于0时才停止输入。然后反序输出这些整数。
#include <stdio.h>
struct data
{ int x;
struct data *link;
}*p;
input()
{ int num;
struct data *q;
printf("Enter data:");
scanf("%d", &num);
if( num<0 )
① ;
q = ② ;
q->x = num;
q->link = p;
p=q;
③ ;
}
main()
{ printf("Enter data until data<0:\n");
p=NULL;
input();
printf("Output:");
while( ④ )
{ printf("%d\n", p->x);
⑤ ;
}
}
【3.51】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。链表用于储存学生的学号和成绩。新产生的结点总是位于链表的尾部。
struct student
{ long num;
int score;
struct student *next;
};
struct student *creat()
{ struct student *head=NULL,*tail;
long num; int a;
tail= ① malloc(LEN);
do
{ scanf("%ld,%d",&num,&a);
if(num!=0)
{ if(head==NULL) head=tail;
else ② ;
tail->num=num; tail->score=a;
tail->next=(struct student *)malloc(LEN);
}
else tail->next=NULL;
}while(num!=0);
return( ③ );
}
【3.52】下面create函数的功能是建立一个带头结点的单向链表,新产生的结点总是插入在链表的末尾。单向链表的头指针作为函数值返回。
#include <stdio.h>
#define LEN sizeof(struct student)
struct student
{ long num;
int score;
struct student *next;
};
struct student *creat()
{ struct student *head=NULL,*tail;
long num;
int a;
tail=( ① )malloc(LEN);
do
{ scanf("%ld,%d",&num,&a);
if(num!=0)
{ if(head==NULL) head=tail;
else tail=tail->next;
tail->num=num;
tail->score=a;
tail->next=( ② )malloc(LEN);
}
else tail->next=NULL;
}while(num!=0);
③ ;
}
【3.53】下面程序的功能是统计文件中的字符的个数。
#include <stdio.h>
main()
{ long num=0;
① *fp;
if((fp=fopen("fname.dat", "r"))==NULL)
{ printf("Can't open the file! ");
exit(0);
}
while( ② )
{ fgetc(fp);
num++;
}
printf("num=%d\n",num);
fclose(fp);
}
【3.54】下面程序的功能是把从键盘输入的文件(用 @ 作为文件结束标志)复制到一个名为second.txt的新文件中。
#include <stdio.h>
FILE *fp;
main()
{ char ch;
if((fp=fopen( ① ))==NULL)
exit(0);
while((ch=getchar())!='@')
fputc(ch,fp);
② ;
}
【3.55】下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)。
#include <stdio.h>
main(int argc,char *argv[])
{ FILE &f1,*f2;
if(argc< ① )
{ printf("The command line error! ");
exit(0);
}
f1=fopen(argv[1], "r");
f2=fopen(arhv[2], "w");
while( ② )
fputs(fgetc(f1), ③ );
④ ;
⑤ ;
}
【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执行文件的文件名是sm,则执行该程序时输入:"sm + 10",可以实现10的累加;输入:"sm - 10",可以实现求10的阶乘。
#include <stdio.h>
#include <stdlib.h>
main (int argc,char *argv[])
{ int n;
void sum(),mult();
void (*funcp)();
n=atoi(argv[2]);
if(argc!=3 || n<=0)
dispform( );
switch ( ① )
{ case '+': funcp=sum;
break;
case '-': funcp=mult;
break;
default: dispform( );
}
② ;
}
void sum(int m)
{ int i,s=0;
for(i=1;i<m;i++ )
③ ;
printf("sum=%d\n",s);
}
void mult(int m)
{ long int i, s=1;
for(i=1;i<=m;i++ )
s *= i;
printf("mult= %ld\n";s);
}
dispform( )
{ printf ("usage:sm n(+/!) (n>0)\n");
exit (0);
}
【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。
#include <stdio.h>
main()
{ char str[100];
int i=0;
FILE *fp;
if((fp=fopen("test.txt", ① ))==NULL)
{ printf("Can't open the file.\n");
exit(0);
}
printf("Input a string:\n");
gets(str);
while(str)
{ if(str>= 'a'&&str<= 'z')
str= ② ;
fputc(str,fp);
i++;
}
fclose(fp);
fp=fopen("test.txt", ③ );
fgets(str,strlen(str)+1,fp);
printf("%s\n",str);
fclose(fp);
}
【3.58】下面程序的功能是将从终端上读入的10个整数以二进制方式写入名为"bi.dat"的新文件中。
#include <stdio.h>
FILE *fp;
main()
{ int i, j;
if(( fp=fopen( ① , "wb" )) == NULL )
exit (0);
for( i=0;i<10;i++ )
{ scanf("%d", &j );
fwrite( ② , sizeof(int), 1, ③ );
}
fclose( fp);
}
【3.59】以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、 输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或'\t'、 '\n'结束的字符串。
#include <stdio.h>
#include <string.h>
FILE *cp;
char fname[20], buf[100];
int num;
struct key
{ char word[10];
int count;
}keyword[]={ "if", 0, "char", 0, "int", 0,
"else", 0, "while", 0, "return", 0};
char *getword (FILE *fp)
{ int i=0;
char c;
while((c=getc(fp)) != EOF && (c==' '||c=='\t'||c=='\n')) ;
if( c==EOF ) return (NULL) ;
else buf[i++]=c;
while((c = ① && c!= ' ' && c!= '\t' && c!= '\n' )
buf[i++] = c;
buf= '\0';
return(buf);
}
lookup(char *p)
{ int i;
char *q, *s;
for(i=0;i<num;i++)
{ q = ② ;
s=p;
while( *s && (*s==*q) )
{ ③
}
if( ④ )
{ keyword.count++;
break;
}
}
return;
}
main()
{ int i;
char *word;
printf("Input file name:");
scanf("%s", fname);
if((cp=fopen(fname, "r")) ==NULL )
{ printf("File open error: %s\n", fname);
exit(0);
}
num = sizeof(keyword) / sizeof(struct key);
while( ⑤ )
lookup(word);
fclose(cp);
for(i=0;i<num;i++)
printf("keyword:%-20scount=%d\n",keyword.word,keyword.count);
}
【3.60】下面程序的功能是从键盘接受姓名(例如:输入"ZHANG SAN"),在文件"try.dat"中查找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该姓名存入文件。要求:⑴若磁盘文件"try.dat",已存在,则要保留文件中原来的信息;若文件"try.dat"不存在,则在磁盘上建立一个新文件;⑵当输入的姓名为空时(长度为0),结束程序。
#include <stdio.h>
main()
{ FILE *fp;
int flag;
char name[30], data[30];
if((fp=fopen("try.dat",  ① ))==NULL )
{ printf("Open file error\n");
exit(0);
}
do
{ printf("Enter name:");
gets(name);
if( strlen(name)==0 )
     break;
strcat(name, "\n");
 ② ;
flag=1;
while( flag && (fgets(data, 30, fp) ③ ) )
if( strcmp(data, name) == 0 )
④ ;
if( flag )
fputs(name, fp);
else
printf("\tData enter error !\n");
} while(  ⑤  );
fclose(fp);
}
四、编写程序题及参考答案
导读:虽然题目基本按照教材章节顺序排列的,但是把同类题目尽量排在一起,便于读者学习掌握编程方法和思路,提高自己的编程能力。


【4.1】已知银行整存整取存款不同期限的月息利率分别为:
0.315% 期限一年
0.330% 期限二年
月息利率 = 0.345% 期限三年
0.375% 期限五年
0.420% 期限八年
要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。
【4.2】输入年份year和月month,求该月有多少天。判断是否为闰年,可用如下C语言表达式:year%4==0 && year%100!=0 || year%400==0。若表达式成立(即表达式值为1),则year为闰年;否则,表达式不成立(即值为0),year为平年。
【4.3】编写一个简单计算器程序,输入格式为:data1 op data2。其中data1和data2是参加运算的两个数,op为运算符,它的取值只能是+、-、*、/。
【4.4】输入n值,输出如图所示矩形。



【4.5】输入n值,输出如图所示平行四边形。



【4.7】输入n值,输出如图所示高为n的等腰三角形。



【4.8】输入n值,输出如图所示高和上底均为n的等腰梯形。



【4.9】输入n值,输出如图所示高和上底均为n的等腰空心梯形。



【4.10】输入n值,输出如图所示边长为n的空心正六边型。



【4.11】输入n值,输出如图所示图形。



【4.12】输入n值,输出如图所示图形。



【4.13】输入n值,输出如图所示图形。



【4.14】输入n值,输出如图所示图形。



【4.15】输入n值,输出如图所示图形。



【4.16】输入n值,输出如图所示图形。(例为n=6时)



【4.17】编写程序,输出如图所示sin(x) 函数0到2π的图形。



【4.18】编写程序,在屏幕上输出一个由*号围成的空心圆。
【4.19】编写程序,在屏幕上绘制如图余弦曲线和直线。若屏幕的横向为x轴,纵向为y轴, 在屏幕上显示0~360度的cos(x)曲线与直线x=f(y)=45*(y-1)+31的迭加图形。其中cos图形用"*"表示,f(y)用"+"表示,在两个图形的交点处则用f(y)图形的符号。



【4.20】编写程序,输出如图所示高度为n的图形。



【4.21】编写程序,输出如图所示高度为n的图形。



【4.22】输入n值,输出如图所示图形。



【4.23】输入n值,输出如图所示的n×n(n<10)阶螺旋方阵。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
图4.19 n=5时的螺旋方阵
【4.24】输入n值,输出如图所示回型方阵。



【4.25】输出如图所示的数字金字塔



【4.26】输入n值,输出如图所示图形。



【4.27】输入顶行字符和图形的高,输出如图所示图形。



【4.28】输入首字符和高后,输出如图所示回型方阵。
A A A A A
A B B B A
A B C B A
A B B B A
A A A A A
图 4.24 首字符为'A'、高为5的方阵
【4.29】输入中心字符和高后,输出如图所示回型方阵。
X X X X X
X Y Y Y X
X Y Z Y X
X Y Y Y Y
X X X X X
图4.25 中心字符为'Z'、高为5的方阵
【4.30】编写程序,输出如图所示上三角形式的乘法九九表。



【4.31】编写程序,输出如图所示下三角乘法九九表。



【4.32】编写程序,输入三角型的三条边长,求其面积。注意:对于不合理的边长输入要输出数据错误的提示信息。
【4.33】编写程序求出555555的约数中最大的三位数是多少。
【4.34】编写程序计算下列算式的值:



直到某一项A<=0.000001时为止。输出最后C的值。
【4.35】从键盘输入任意的字符,按下列规则进行分类计数。
     第一类 '0','1','2','3','4','5','6','7','8','9'
     第二类 '+','-','*','/','%','='
     第三类 其它字符
当输入字符'\'时先计数,然后停止接收输入,打印计数的结果。
【4.36】对从键盘上输入的行、单词和字符进行计数。我们将单词的定义进行化简,认为单词是不包含空格、制表符(\t)及换行符的字符序列。例如:"a+b+c",认为是1个单词,它由5个字符组成。又如:"xy abc",为2个单词,6个字符。一般用[CTRL+D]作为文件结束标记,其字符码值为-1,当输入[CTRL+D]时表示文件输入结束,停止计数。
【4.37】编写程序计算当x=0.5时下述级数和的近似值,使其误差小于某一指定的值epsilon(例如:epsilon=0.000001):



【4.38】编写程序计算下式的值:



【4.39】编写程序计算下列序列的值:



要求最后一项小于0.001时、或者当N=20时尚未达到精度要求,则停止计算。
【4.40】已知求正弦sin(x)的近似值的多项式公式为:



编写程序,要求输入x和ε,按上述公式计算sin(x)的近似值,要求计算的误差小于给定的ε。
【4.41】从键盘输入十个整数,用插入法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。
【4.42】输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321。
【4.43】编写程序,读入一个整数N;若N为非负数,则计算N到2×N之间的整数和;若N为一个负数,则求2×N到N之间的整数和。分别利用for和while写出两个程序。
【4.44】求解爱因斯坦数学题。有一条长阶梯,若每步跨2阶,则最后剩余1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶,若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯共有多少阶?
【4.45】一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。
【4.46】编写程序,用二分法求一元二次方程2x3-4x2+3x-6=0在(10,10)区间的根。
【4.47】中国古代科学家祖冲之采用正多边形逼近的割圆法求出了π的值。请编写一程序,采用割圆法求出π的值,要求精确到小数点之后的第十位。
【4.48】A、B、C、D、E五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三竿,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E依次醒来,也按同样的方法拿鱼。编写程序求出他们合伙至少捕了多少条鱼。
【4.49】一辆卡车违犯交通规则,撞人逃跑。现场三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
【4.50】若一个口袋中放有12个球,其中有3个红的,3个白的和6个黑的,每次从中任取8个球,编写程序求出共有多少种不同的颜色搭配。
【4.51】100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。
【4.52】编写程序,输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法。
【4.53】显示200以内的完全平方数和它们的个数。(完全平方数:A2+B2=C2,求A、B、C)
【4.54】设N是一个四位数,它的9倍恰好是其反序数(例如:123的反序数是321),求N的值。
【4.55】将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。
【4.56】编写程序求解下式中各字母所代表的数字。
PEAR
- ARA
───────
PEA
【4.57】一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。
【4.58】请验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和。
【4.59】如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。如407=43+03+73就是一个阿姆斯特朗数。编写程序求1000以内的所有阿姆斯特朗数。
【4.60】任意输入一个偶数,请将它分解为两个素数之和。
【4.61】如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
【4.62】猜数游戏。由计算机"想"一个数请人猜,如果人猜对了,则结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机记录人猜的次数,以此可以反映出猜数者"猜"的水平。
【4.63】编写程序求出1000!后有多少个零。
【4.64】求矩阵 A[2*3] 的转置矩阵 B[3*2]。设矩阵 A 为:
┏ 1 2 3 ┓ ┏ 1 4 ┓
A = ┃ ┃ B = ┃ 2 5 ┃
┗ 4 5 6 ┛ ┗ 3 6 ┛
【4.65】十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14 块,第十个小孩20块。然后所有的小孩同时将自己手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次调整后大家手中的糖的块数都一样?每人各有多少块糖?
【4.66】输入5×5的数组,编写程序实现:
(1)求出对角线上各元素的和;
(2)求出对角线上行、列下标均为偶数的各元素的积;
(3)找出对角线上其值最大的元素和它在数组中的位置。
【4.67】编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。
【4.68】编写程序,输入一个十进制整数,将其变换为二进制后储存在一个字符数组中。
【4.69】编写程序,输出1000以内的所有完数及其因子。所谓完数是指一个整数的值等于它的因子之和,例如6的因子是1、2、3,而6=1+2+3,故6是一个完数。
【4.70】对数组A中的N(0<N<100=个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号。例如数组是:A=(5,3,4,7,3,5,6) 则输出为: (3,1,2,5,1,3,4)
【4.71】现将不超过2000的所有素数从小到大排成第一行,第二行上的每个数都等于它"右肩"上的素数与"左肩"上的素数之差。请编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假如存在的话,又有几种这样的情况?
第一行:2 3 5 7 11 13 17 ..... 1979 1987 1993     第二行: 1 2 2 4 2 4 ..... 8 6
【4.72】将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不许有重复数字,也不许同其它组的三个数字重复,要求将每组中的三位数组成一个完全平方数。
【4.73】一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。
【4.74】使用数组精确计算M/N(0<M<N<=100)的各小数位的值。如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数的序号)。
为了实现高精度计算结果,可将商M存放在有N(N>1)个元素的一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中……,依次类推。这样可使用数组来表示计算的结果。
【4.75】使用数组完成两个超长(长度小于100)正整数的加法。
为了实现高精度的加法,可将正整数M存放在有N(N>1)个元素的一维数组中,数组的每个元素存放一位十进制数,即个位存放在第一个元素中,十位存放在第二个元素中……,依次类推。这样通过对数组中每个元素的按位加法就可实现对超长正整数的加法。
【4.76】使用数组完成两个超长(长度小于100)正整数的加法。
为了实现高精度的加法,可将正整数M存放在有N(N>1)个元素的一维数组中,数组的每个元素存放一位十进制数,即个位存放在第一个元素中,十位存放在第二个元素中……,依次类推。这样通过对数组中每个元素的按位加法就可实现对超长正整数的加法。
【4.77】使用数组完成两个超长(长度小于100)正整数的乘法。
【4.78】马步遍历问题:已知国际象棋棋盘有8*8共64个格子。设计一个程序,使棋子从某位置开始跳马,能够把棋盘上的格子走遍。每个格子只允许走一次。
【4.79】八皇后问题:
在一个8×8的国际象棋盘,有八个皇后,每个皇后占一格;要求棋盘上放上八个皇后时不会出现相互"攻击"的现象,即不能有量个皇后在同一行、列或对角线上。问共有多少种不同的方法。
【4.80】编制一个计算函数y=f(x)的值程序,其中:
-x + 2.5 0<= x <2
y= 2 - 1.5(x-3)*(x-3) 2<= x <4
x/2 - 1.5 4<= x <6
【4.81】编写程序,实现比较两个分数的大小。
【4.82】求这样一个三位数,该三位数等于其每位数字的阶乘之和。
        即: abc = a! + b! + c!
【4.83】已知两个平方三位数abc和xyz,其中数码a、b、c、x、y、z未必是不同的;而ax、by、cz是三个平方二位数。编写程序,求三位数abc和xyz。任取两个平方三位数n和n1,将n从高向低分解为a、b、c,将n1从高到低分解为x、y、z。判断ax、by、cz是否均为完全平方数。
【4.84】找出一个二维数组中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。二维数组也可能没有鞍点。
【4.85】将数字1、2、3、4、5、6填入一个2行3列的表格中,要使得每一列右边的数字比左边的数字大,每一行下面的数字比上面的数字大。编写程序求出按此要求可有几种填写方法?
【4.86】编写一个函数实现将字符串str1和字符串str2合并,合并后的字符串按其ASCII码值从小到大进行排序,相同的字符在新字符串中只出现一次。
【4.87】已知计算x的n阶勒让德多项式值的公式如下:
1 (n=0)
Pn(x) = x (n=1)
( (2n-1)*x*Pn-1(x)-(n-1)*Pn-2(x))/n (n>1)
请编写递归程序实现。
【4.88】编写函数,采用递归方法实现将输入的字符串按反序输出。
【4.89】编写函数,采用递归方法在屏幕上显示如下杨辉三角形:
               1
   1 1
   1 2 1
   1 3 3 1
   1 4 6 4 1
   1 5 10 10 5 1
   …… …… …… …… ……
【4.90】编写函数,采用递归方法将任一整数转换为二进制形式。
【4.91】设有字母a、b、c,请编程用递归的方法产生由这些字母组成的,且长度为n的所有可能的字符串。例如,输入n=2,则输出:
aa ab ac ba bb bc ca cb cc
【4.92】将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称它为对称数。编写程序,采用递归算法求不超过1993的最大的二进制的对称数。
【4.93】从1到n(n<1000)个自然数中选出r个数进行组合,并按指定的格式输出组合的结果。例如:n=5,r=3时,共有10种组合,运行程序,要按下面的格式输出:
           123
             4
             5
            34
             5
            45
           234
             5
            45
           345
请用递归算法实现。
【4.94】从键盘输入十个整数,用合并排序法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。
【4.95】编写程序,读入一个以符号"."结束的长度小于20字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如:
读入句子:MADAM I'M ADAM. 它是回文,所以输出:YES
读入句子:ABCDBA). 它不是回文,所以输出:NO
【4.96】编写程序,其中包括一个函数,此函数的功能是:对一个长度为N 的字符串从其第K个字符起,删去M个字符,组成长度为N-M的新字符串(其中N、M<=80,K<=N)。例如输入字符串"We are poor students.",利用此函数进行删除"poor"的处理,输出处理后的字符串是"We are students."。
【4.97】编写函数,通过指针将一个字符串反向。
【4.98】编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2。
【4.99】编写程序将输入的两行字符串连接后,将串中全部空格移到串首后输出。
【4.100】编写程序,输入字符串,分别统计字符串中所包含的各个不同的字符及其各自字符的数量。如:输入字符串: abcedabcdcd
则输出:a=2 b=2 c=3 d=3 e=1。

【4.101】利用结构:struct complx
{ int real;
int im;
};
编写求两个复数之积的函数cmult,并利用该函数求下列复数之积:
⑴ (3+4i)×(5+6i) ⑵ (10+20i)×(30+40i
【4.103】编写程序,实现输入的时间屏幕显示一秒后的时间。显示格式为HH:MM:SS。程序需要处理以下三种特殊情况:
⑴ 若秒数加1后为60,则秒数恢复到0,分钟数增加1;
⑵ 若分钟数加1后为60,则分钟数恢复到0,小时数增加1;
⑶ 若小时数加1后为24,则小时数恢复到0。
【4.104】编写程序,从键盘输入3个学生的数据,将它们存入文件student;然后再从文件中读出数据,显示在屏幕上。
【4.105】编写程序,从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。
【4.106】编写程序,读入磁盘上C语言源程序文件"test8.c",删去程序中的注释后显示。


快速回复 返回顶部 返回列表