三、程序填空题

自己收藏的
觉得很有用
故上传到百度
与大家一起分享!
PART 1 程序填空题
1. 以下程序按每行5个数的格式输出1至n范围内能被7或17 整除的整数
并求出其和

如输入:50
则输出:
7 14 17 21 28
34 35 42 49
Sum=247
源程序:
#include <stdio.h>
void main()
{
int i, n, ct=0, sum=0;
scanf( "%d", &n );
for ( i=1; i<=n; i++ )
if ( ____(1)_____ )
{
printf( "%d\t", i );
_____(2)_______;
ct++;
if ( ___(3)______ )
printf( "\n" );
}
printf( "\nSum=%d\n", sum );
}

2. 以下程序输入10个整数到a数组
找到并输出其中最大的整数及其下标

如输入:80 290 150 520 330 -160 -99 0 200 9
则输出:a[3]=520
源程序:
#include <stdio.h>
#define N 10
int get_max_index( int a[], int n )
{
int i, k=0;
for ( i=1; i<n; i++ )
if ( ____(1)____ )
k = i;
return ______(2)_____;
}
void main()
{
int i, k, a[N];
for ( i=0; i<N; i++ )
scanf( "%d", &a[i] );
k = _______(3)______;
printf( "a[%d]=%d\n", k, a[k] );
}

3. 以下程序从文件"student.txt"读取学生的学号、姓名、平时成绩和考试成绩
从键盘上输入平时成绩在总成绩中所占比重
计算每个学生的总成绩(四舍五入为整数)后输出到屏幕上
文件的最后一行为0表示学生数据结束

设文件student.txt的内容为
101 Zhao 95 58
103 Qian 75 81
105 Sun 99 91
107 Li 80 67
0
运行时键盘输入:0.1
则屏幕输出:
101 Zhao 95 58 62
103 Qian 75 81 80
105 Sun 99 91 92
107 Li 80 67 68
源程序:
#include <stdio.h>
void calc( FILE *fp, float x )
{
int num, score1, score2;
float score3;
char name[20];
while ( !feof(fp) )
{ /* 文件还有未读数据时 */
num = 0;
fscanf( fp, "%d%s%d%d", &num, name, &score1, &score2 );
if ( num > 0 )
{ /* 学生数据有效时 */
score3 = score1 * x + score2 * (1-x); /* 计算总成绩 */
printf( "%3d %-7s %3d %3d %3d\n", num, name, score1,
score2, ______(1)______ ); /* 总成绩四舍五入为整数 */
}
}
}
void main()
{
FILE *fp;
float x;
fp = fopen( "student.txt", "r" );
if ( ____(2)____ ) /* 如果文件打开失败 */
{
printf( "File Open Error!\n" );
return;
}
scanf( "%f", &x );
calc( ____(3)____ ); /* 调用calc函数 */
fclose( ____(4)____ ); /* 关闭文件 */
}

4. 下面程序实现的功能是打印n以内的水仙花数
水仙花数是指其本身的值等于每一位数字的立方和
例如: 153是一个水仙花数, 153=1*1*1+5*5*5+3*3*3.
如输入:400
则输出:1 153 370 371
#include <stdio.h>
void main()
{
in

t n, digit, k, m, s;
scanf( "%d", &n );
for ( k=1; ____(1)____; k++ )
{
s = 0;

m = k;
while ( m != 0 )
{
digit = ____(2)____;
s = s + digit*digit*digit;
m = m/10;
}
if ( ____(3)____ )
printf( "%d ", s );
}
}

5. 以下函数 int sum(int x[], int num)计算数组x前num个元素之和
在主函数中
输入10个任意整数和下标index1、index2的值(设1<=index1<=index2<=9)
调用sum()函数计算index1元素到第index2元素的和
并输出结果

如输入:
1 3 2 5 7 9 6 4 8 10
2 4
则输出:Sum=14
例示说明:下标从2至4的元素为2、5、7
其累加为14
源程序:
#include <stdio.h>
int sum( int x[], int num )
{
int i, s=0;
for ( i=0; ____(1)____; i++ )
s = ____(2)____;
return s;
}
void main()
{
int i, index1, index2, result;
int x[10];
for ( i=0; i<10; i++ )
scanf( "%d", &x[i] );
scanf( "%d%d", &index1, &index2 );
result = sum( x+index1, ____(3)____ );
printf( "Sum=%d\n", result );
}

6. 以下程序从文件"student.txt"读取学生的学号、姓名、平时成绩和考试成绩(学生已按学号从小到大排序)
从键盘上输入一个新学生的信息
按学号顺序将数据插入到学生表中
并生成新的文本文件"studentC.txt"
文件的最后一行为0表示学生数据结束

设文件student.txt的内容为
101 Zhao 95 58
103 Qian 75 81
105 Sun 99 91
107 Li 80 67
0
运行时键盘输入:104 Chen 80 90
则生成新文件studentC.txt的内容为:
101 Zhao 95 58
103 Qian 75 81
104 Chen 80 90
105 Sun 99 91
107 Li 80 67
0
源程序:
#include <stdio.h>
void main( )
{
FILE *fp1, *fp2;
int fnum, fscore1, fscore2;
char fname[20];
int num, score1, score2;
char name[20];
int flag;
fp1 = fopen( "student.txt", ____(1)____ );
fp2 = fopen( "studentC.txt", "w" );
if ( fp1==NULL || fp2==NULL )
{
printf( "File Open Error!\n" );
return;
}
scanf( "%d%s%d%d", &num, name, &score1, &score2 );
_______(2)______;
while ( 1 )
{
fnum = 0;
fscanf( fp1, "%d%s%d%d", &fnum, fname, &fscore1, &fscore2 );
if ( fnum == 0 )
break;
if ( flag==1 && num<=fnum )
{
flag = 0;
fprintf( fp2, "%3d %-7s %3d %3d\n", num, name,
score1, score2 );
}
fprintf( fp2, "%3d %-7s %3d %3d\n", fnum, fname,
fscore1, fscore2 );
}
if ( ____(3)____ )
fprintf( fp2, "%3d %-7s %3d %3d\n", num, name, score1, score2 );
fprintf( fp2, ____(4)____ );
fclose( fp1 );
fclose( fp2 );
}

7. 以下程序输入n和n个大于1的正整数
输出其中素数

如输入:5 19 93 11 37 15
则输出:19 11 37
例示说明:先输入n

为5
再输入5个正整数
输出5个整数中的素数
#include <stdio.h>
void main()
{
int n, a, i, j, ct;
scanf( "%d", &n );
for ( i=
0; ____(1)____; i++ )
{
______(2)______;
scanf( "%d", &a );
for( j=2; j<a; j++ )
if ( ____(3)____ )
ct++;
if ( ct==0 )
printf( "%d ", a );
}
printf( "\n" );
}

8. 以下程序输入一个10进制整数
转换为16进制
计算16进制的各个位数
并从高位到低位依次输出

如输入:687
则输出:2 A F
例示说明:10进制687等于16进制2AF
输出时2、A、F中间包含空格
源程序:
#include <stdio.h>
void main()
{
int a[10], i, n;
scanf( "%d", &n );
for ( i=0; n>0; i++ )
{
a[i] = ____(1)____;
n /= 16;
}
for ( i--; ____(2)____; ____(3)____ )
printf( "%X ", a[i] );
}

9. 以下程序从文件"student.txt"读取学生的学号、姓名、平时成绩和考试成绩
再从键盘上输入一个成绩
将所有考试成绩达到或超过该成绩的学生数据写到新的文本文件"studentD.txt"
文件的最后一行为0表示学生数据结束

设文件student.txt的内容为
101 Zhao 95 58
103 Qian 75 81
105 Sun 99 91
107 Li 80 67
0
运行时键盘输入:80
则生成新文件studentD.txt的内容为:
103 Qian 75 81
105 Sun 99 91
0
例示说明:student.txt中考试成绩在80分以上的Qian与Sun信息写到studentD.txt
源程序:
#include <stdio.h>
void select( FILE *fp1, FILE *fp2, int x )
{
int num, score1, score2;
char name[20];
while ( 1 )
{
num = 0;
fscanf( fp1, "%d%s%d%d", &num, name, &score1, &score2 );
if ( num == 0 )
____(1)____;
if ( ____(2)____ )
fprintf( fp2, "%3d %-7s %3d %3d\n", num, name,
score1, score2 );
}
fprintf( fp2, "0" );
}
void main()
{
FILE *fp1, *fp2;
int x;
fp1 = fopen( "student.txt", "r" );
fp2 = fopen( "studentD.txt", ____(3)____ );
if ( fp1==NULL || fp2==NULL )
{ /* 文件打开失败 */
printf( "File Open Error!\n" );
return;
}
scanf( "%d", &x );
select( ____(4)____ );
fclose( fp1 );
fclose( fp2 );
}

PART2 程序调试题
调试要求:下列各程序有3处错误
请按题中的功能要求
在不改变程序结构(不增加、删除语句
不调整语句顺序)的情况下调试并修改该程序(在所修改语句后加/*******/字样的注释)
使其运行能得到正确的结果

1. 程序调试题1
功能说明:程序计算并输出1! + 2! + ...... + n!(1至n阶乘的累加和)
其中函数fact(n)计算n!的值
返回类型为double

如输入:10
则输出:1!+2!+...+10!=4037913
原程序:
#include <stdio.h>
double fact( int n )
{
int i;
double result = 1

;
for ( i=1; i<n; i++ )
result = result * i;
return result;
}
void main()
{
int i, n;
double sum = 0;
scanf( "%d", &n );
for ( i=1 ; i<=n; i++ )
sum += fact(int i);
printf( "1!+2!+...+%d! = %.0lf\n", n, sum );
}

2. 程序调试题2
功能说明:程序输
入任意一行字符串(设字符数不大于20)
提取该字符串中的数字字符并组成一个整数
输出该整数及其两倍的值

如输入:abc12e3fgh4i
则输出:1234 2468
原程序:
#include <stdio.h>
void main()
{
int i, n=0;
char str[80];
gets(str[80]);
for ( i=0; str[i]!='\0'; i++ )
if ( str[i]>=0 && str[i]<=9 )
n = n*10 + str[i];
printf("%d %d\n", n, 2*n);
}

3. 程序调试题3
功能说明:程序输入一个正整数并因式分解
输出分解等式

如输入:60
则输出:60=1*2*2*3*5
原程序:
#include <stdio.h>
void main()
{
int n, i;
scanf( "%d", &n );
printf( "%d=1", n );
for ( i = 2; i <= n; )
{
if ( n % i = 0 )
{
printf( "*%d", i );
n / i;
}
else
i++;
}
}

4. 程序调试题4
功能说明:以下程序中函数str_to_upper将字符串中的小写字母转换为大写字母
主函数调用此函数及输入输出数据
用户通过键盘输入计算所需的数据

如输入:Hello world.
则输出:HELLO WORLD.
原程序:
#include <stdio.h>
void str_to_upper( char *s )
{
while ( *s == '\0' )
{
if ( *s>='a' || *s<='z' )
*s = *s - 'A' + 'a';
s++;
}
}
void main()
{
char str[80];
gets( str );
str_to_upper( str );
puts( str );
}

5. 程序调试题5
功能说明:以下程序计算并输出等差数列的累加和
数列的首项为a0
公差为d
项数为n

如输入:-3 5 4
则输出:sumx=18
例示说明:-3为首项
5为公差
4为项数
前4项之和为18
原程序:
#include <stdio.h>
int sumx( int a0, d, n )
{
int i, k, s=0;
k = a0;
for ( i=0; i<n; i++ )
s += k;
k += d;
return s;
}
void main()
{
int a0, d, n;
scanf( "%d%d%d", &a0, &d, &n );
printf( "sumx=%d\n", sumx(a0,d,n) );
}

6. 程序调试题6
功能说明:以下函数length返回字符串中字母A到字母Z所包含字符的长度
主程序输入一行字符串
调用length函数输出该字符串中大写字母A到Z的子串长度

如输入:Z2009-AShanghaiZ
则输出:Length=8
例示说明:从A到Z的子串为Shanghai
其长度为8
原程序:
#include <stdio.h>
int length( char *p )
{
char *q, *r;
for ( q=p; *q!='\0' || *q!='A'; q++ )
;
for ( r=q; *r!='\0' && *r!='Z'; r++ )
;
return r-q;
}
void main()
{
char str[81];
int n;
gets( str[0] );
n = length( str );
printf( "Length=%c\n", n );
}

PART 3 编

程题
1. 编程求下列序列的累加和
累加n项
正整数n从键盘输入

s=2/1+3/2+5/3+8/5+13/8+21/13+...

2. 编写程序
求出一个给定整数的所有质因子
输出格式如72=2*2*2*2*3*3


3. 编写判断素数的函数
调用该函数
计算并输出区间[n
m]内所有的素数及素数的和
正整数n和m从键盘输入


4. 寻找满足下列条件的4位整数:(1)无重复数字;(2)千位数字非0;(3)能整除它的各位数字和的平

求这样的数中最小一个数是多大?最大一个数是多大?

5. 将一个正整数n(长整型)输出成千分位形式
即从个位数起
每三位之间加一个逗号
例如
将7654321输出成7,654,321


6. 输入10个数
将10个整数按升序排列输出
并且奇数在前
偶数在后
如果输入的10个数是10 9 8 7 6 5 4 3 2 1
则输出1 3 5 7 9 2 4 6 8 10


7. 输入一个日期(年、月、日)
计算从当年1月1日起到这一天的天数


8. 一个整数等于该数所有因子之和
则称该数是一个完数
例如6=1+2+3
28=1+2+4+7+14
6和28都是完数
输出三位数中所有的完数


9. 写一函数
它有三个字符串参数
第一个是目的串
第二个是源串
第三个是字符表
其功能是把源串中所有由字符表指出的字符复制到目的串中
函数值是得到的目的串的长度
例如
如果源串为"ABCDAEFAC"
字符表为"ABC"
结果目的串为"ABCAAC"
函数值为6


10. 根据要求显示不同特征的图形

从键盘读入一个1~9的数字字符(或一个A~I的字母)
而后显示出具有如下特征的图形
例如
当输入数字字符4时
显示图形如下:
1
121
12321
1234321
当输入字母D时
显示图形如下:
A
ABA
ABCBA
ABCDCBA

11. 编写程序实现
已知今天星期几
求n天后星期几
输入的信息是数值型
输出的结果要翻译成英语星期的单词


12. 开灯问题:有从1~n依次编号的n个同学和n盏灯
1号同学将所有的灯都关掉;2号同学将编号为2的倍数的灯都打开;3号同学则将编号为3的倍数的灯作相反处理(该号灯如打开的
则关掉;如关闭的
则打开);以后的同学都将自己编号的倍数的灯
作相反处理
问经n个同学操作后
哪些灯是打开的?

13. 三位老师对某次数学竞赛进行了预测
他们的预测如下:
甲说:学生A得第一名
学生B得第三名

乙说:学生C得第一名
学生D得第四名

丙说:学生D得第二名
学生A得第三名

竞赛结果表明
他们都说对了一半
说错了一半
并且无并列名次
试编写程序输出A、B、C、D各自的名次


14. 编程验证:任一个充分大的偶数(≥4)
总可以分解为两个素数之和


15. 青年歌手参加歌曲大奖赛
有10个评委对

她进行打分
试编程求这位选手的平均得分(去掉一个最高分和一个最低分)
要求用函数maxmin(...)求最高分和最低分的下标
用函数ave(...)求平均分
在主函数中进行输入输出


16. 任意输入一个4位自然数
调用函数输出该自然数的各位数字组成的最大数


17. 编写程序
将输入的两个字符串进行合并
合并后的字符串中的字符按照其ASCII码从小到大的顺序排序
在合并后的字符串中相同的字符只出现一次


18. 对数组A中的7个
整数从小到大进行连续编号
要求不能改变数组A中元素的顺序
且相同的整数要具有相同的编号

例如:数组是A=(5
3
4
7
3
5
6)
则输出为(3
1
2
5
1
3
4)

19. 编写程序完成如下功能:
(1)输入5个学生的信息:学号(6位整数)、姓名(6个字符)、三门课的成绩(3位整数1位小数)
计算每个学生的平均成绩(3位整数2位小数)
将所有数据写入文件STU1.TXT

(2)从STU1.TXT文件中读入学生数据
按平均成绩从高到低排序后写入文件STU2.TXT

(3)按照输入学生的学号
在STU2.TXT文件中查找该学生
找到以后输出该学生的所有数据
如果文件中没有输入的学号
给出相应的提示信息


20. 用编辑软件建立一个名为d1.txt的文本文件存入磁盘
文件中有18个数
从磁盘上读入该文件
并用文件中的前9个数和后9个数分别作为两个3*3矩阵的元素
求这两个矩阵的和
并把结果按每行三个数据写入文本文件d2.txt
用DOS命令TYPE显示d2.txt




1




相关文档
最新文档