C语言期末复习(平时练习答案)
[特别适用于千千万北航学子]
考试重点:(编程题)排序,选择与冒泡排序,,各种进制转换。。。。]
第二次大作业— 前驱、后继字符
1. 【问题描述】 从键盘输入一个字符,求出它的前驱和后继字符(按照ASCII码值排序),并按照从小到大的顺序输出这三个字符和对应的ASCII值。 【输入形式】 从键盘输入一个字符 【输出形式】 按两行输出: 第一行按照从小到大的顺序输出这三个字符,并以一个空格隔开; 第二行按照从小到大的顺序输出三个字符对应的ASCII值,并以一个空格隔开。 【输入样例】 b 【输出样例】 a b c 97 98 99 【样例说明】 输入字符b,b的前驱字符是a,后继字符是c,第一行按照从小到大的顺序输出a b c;第二行输出对应的ASCII值97 98 99 【评分标准】 结果完全正确得20分,每个测试点4分。提交程序名为:c0103.c。
//*从键盘输入一个字符,求出它的前驱和后继字符(按照ASCII码值排序),并按照从小到大的顺序输出这三个字符和对应的ASCII值。*// #include
1 / 30
printf(\ scanf(\ //*从键盘输入一个字符*// printf(\%c %c %c\\n\第一行按照从小到大的顺序输出这三个字符,并以一个空格隔开*// printf(\第二行按照从小到大的顺序输出三个字符对应的ASCII值,并以一个空格隔开。*// return 0; }
当前编程题:第二次大作业---数值变换 2. 【问题描述】 编写一程序,从键盘输入输入一个三位正整数,然后反向输出对应的数,如果输入的数不是三位正整数,则输出-1。 【输入形式】 从键盘输入三位的正整数。 【输出形式】 输出交换后的正整数值。 【输入样例】 356 【输出样例】 653 【样例说明】 从键盘输入的正整数值为356,将该数的个位与百位互换,所得结果为653.如果输入的正整数为300,则输出为3。 【评分标准】 结果完全正确得20分,每个测试点4分。提交程序名为:c0102.c。
//*编写一程序,从键盘输入输入一个三位正整数,然后反向输出对应的数,如果输入的数不是三位正整数,则输出-1。 *// #include
if(a>0) //*对输入的值的正负做判断*// { d=a/100; e=(a-d*100)/10; f=a; sum=100*f+10*e+d; printf(\
//*输出交换后的正整数值。*// } else printf(\
当前编程题:第二次大作业---正整数的打印
4. 【问题描述】给出一个不多于5位的正
整数,要求: 1.求出它是几位数。 2.分别打印出每一位数字。 3.按照逆序
//*如果输入的数不是三位正整数,则输出打印出每一位数字。 【输入形式】控制台-1*// 输入该正整数。 【输出形式】控制台分行} 输出输出结果。 【样例输入】1234 【样例 输出】 4 1234 4321 【样例说明】1234位当前编程题:第二次大作业---计算平均值 数为4,分别为1,2,3,4,逆序为4321 【评3. 【问题描述】 从键盘输入三个整数,分别存入x,y,z三个整型变量中,计算并输出三个数的和以及平均值。 【输入形式】 从键盘输入三个整数,整数之间以空格隔开。 【输出形式】 在屏幕上分两行显示结果:
第一行为三个数的和,整数形式输出; 第二行为三个数的平均值,浮点数形式输出,小数点后保留两位小数。 【输入样例】 3 2 3 【输出样例】 8 2.67 【样例说明】 3、2、
3的和为8,所以第一行输出8; 第二行输
出3、2、3的平均值2.67(保留两位小数)。
【评分标准】 结果完全正确得20分,每个
测试点4分。提交程序名为:c0101.c。
//*从键盘输入三个整数,分别存入x,y,z
三个整型变量中,计算并输出三个数的和以及平均值*//
#include
float average; scanf(\ //*从键盘输入三个整数,整数之间以空格
隔开*//
sum=x+y+z; average = (float)sum/3; //*第一行为三个数的和,整数形式输出;
*// printf(\ printf(\ //* 第二行为三个数的平均值,浮点数形式
输出,小数点后保留两位小数*//
return 0; }
2 / 30
分标准】该题共有三个输出整数,完全正确得10分,每答错一个扣掉4分,直至得分为0。本题要求上传程序的源文件。所采用语言可以是C(.c)。主文件名设定为intprint.c
//*给出一个不多于5位的正整数,要求: 1.求出它是几位数。 2.分别打印出每一位数字。 3.按照逆序打印出每一位数字。
*// #include
scanf(\ if(a>9999) n=5; else if(a>999)
n=4; else if(a>99)
n=3; else if(a>9) n=2;
else n=1; printf(\这个数的位数=%d\\n\
f=a/10000; e=a000/1000; d=a00000/100;
c=a000000/10;
b=a000000; switch(n) { case 5:
printf(\
printf(\
k; case 4: printf(\ printf(\ case 3: printf(\
printf(\;
case 2:
printf(\ printf(\ case 1: printf(\ printf(\ } }
当前编程题:第二次大作业---简易计算器 5. 【问题描述】 编程实现简易的计算器:读入两个整数运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值, 其中op可以是+,-,*,/。 【输入形式】 控制台输入运算数和运算符: 1.首先输入以空格分隔的两个整数,分别是data1和data2; 3 / 30
2.输入一个字符作为运算符op,op可以是’+’,’-’,’*’,’/’。 输入时,data1、data2、op之间各留有一个空格。具体格式见样例输入。 【输出形式】 控制台输出运算结果。作除法运算时,若能够整除,则输出为整数,否则输出结果小数点后应保留两位有效数字。 【样例输入】 23 5 * 【样例输出】 115 【样例说明】 输入中先后输入第一个运算数23,第二个运算数5,运算符’*’,要求对23和5进行乘法运算。计算结果为115。 【评分标准】 该题共20分,每个测试点4分。 本题要求上传程序的源文件。所采用语言可以是C(.c).即所上传的文件名为calculator.c
//*编程实现简易的计算器:读入两个整数运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值, 其中op可以是+,-,*,/。 *// #include
if(op=='-') { c=data1-data2; printf(\ } else if(op=='*') {
c=data1*data2;
printf(\
}
else if(op=='/') { d=(double)data1/data2; printf(\ } return 0; }
找最大最小整数
1. 【问题描述】编写一个程序,用户输入若干整数,试找出其中的最大数和最小数。
【输入形式】用户在第一行待输入数据个数,在第二行输入数据。
【输出形式】程序在下一行输出数据的最大值和最小值 【样例输入】 5
89 62 96 74 52 【样例输出】96 52
【样例说明】用户第一次输入的为数据个数,在下一行依次输入数据。输出为5个数中的最大值和最小值,输出时候两个数之间用空格分隔。
【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:getmaxandmin.c 矩形相交 2.
【问题描述】
4 / 30
平面上有两个矩形A和B,其位置是任意的。
编程求出其相交部分(如图中阴影部分)的面积。(0≤a,b≤1000)
【输
入形式】
从标准输入读取两行以空格分隔的整数,格式如下: Ax1 Ay1 Ax2 Ay2 Bx1 By1 Bx2 By2
其中(x1,y1)和(x2,y2)为矩形对角线上端点的坐标。各坐标值均为整数,取值在
0至1000之间。
【输出形式】
向标准输出打印一个整数,是两矩形相交部分的面积(可能为0)。在输出末尾要有一个回车符。 【输入样例】 0 0 2 2
1 1 3 4 【输出样例】
1
【评分标准】
结果完全正确得20分,每个测试点4分,
提交程序文件名为area.c。
[红色为采用答案
#include
struct point { int x;
int y; }A1,A2,B1,B2;
struct rect { struct point p1; struct point p2; }R1,R2;
struct point makepoint(int x,int y);
struct rect makerect(struct point p1,struct point p2);
struct rect guifanrect(struct rect R);
#define max(A,B) ((A)>(B)?(A):(B)) #define min(A,B) ((A)>(B)?(B):(A)) main() {
5 / 30
int i,num1[4],num2[4],area;
for(i=0;i<4;i++) scanf(\ for(i=0;i<4;i++) scanf(\
R1 = makerect(A1 =
makepoint(num1[0],num1[1]), A2 = makepoint(num1[2],num1[3]));
R2 = makerect(B1 =
makepoint(num2[0],num2[1]), B2 = makepoint(num2[2],num2[3]));
R1 = guifanrect(R1); R2 = guifanrect(R2);
if( R1.p2.x <= R2.p1.x || R1.p2.y <= R2.p1.y ||
R1.p1.x >= R2.p2.x || R1.p1.y >= R2.p2.y) area = 0; else
area = abs(max(R1.p1.x, R2.p1.x) - min(R1.p2.x, R2.p2.x)) *
abs(max(R1.p1.y, R2.p1.y) - min(R1.p2.y, R2.p2.y));
printf(\}
struct point makepoint(int x,int y) {
struct point temp; temp.x = x; temp.y = y; return temp; }
struct rect makerect(struct point p1,struct point p2) {
struct rect temp; temp.p1 = p1; temp.p2 = p2; return temp; }
struct rect guifanrect(struct rect r) {
struct rect temp;
temp.p1.x = min (r.p1.x, r.p2.x); temp.p1.y = min (r.p1.y, r.p2.y); temp.p2.x = max (r.p1.x, r.p2.x); temp.p2.y = max (r.p1.y, r.p2.y); return temp; }
6 / 30
3. 【问题描述】编写一个程序,当在一个字符串中出现子串时就删除它。
【输入形式】用户在第一行输入一个字符串,用户在第二行输入一个子串。
【输出形式】程序在下一行输出删除其中所有子串后的字符串。如果字符串不包含子串则输出原字符串本身。 【样例输入】 I am a boy! a 【样例输出】 I m boy!
【样例说明】用户首先输入字符串I am a boy!,然后输出子串a,程序会寻找字符串中的子串删除它,最后 将删除后的结果输出:I#m##boy! #表示空格。
【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:delsubstring.c。 #include
int main( void ) {
char *pdest; int result;
fgets(source_str, 1024, stdin);
fgets(del_str, 1024, stdin);
source_str[strlen(source_str)-1] = '\\0'; del_str[strlen(del_str)-1] = '\\0';
pdest = strstr(source_str, del_str); result = 0;
while(pdest != NULL) {
strncat(dest_str, &source_str[result], (int)(pdest - &source_str[result])); result += (int)(pdest -
&source_str[result]) + strlen(del_str);
pdest = strstr(&source_str[result], del_str); }
if(result < strlen(source_str)) {
strncat(dest_str, &source_str[result], strlen(source_str) - result); }
printf(\ return 0; }
4. 【问题描述】
编写一个函数char * str_bin(char* str1, char* str2), str1、str2是两个有序字符串(其中字符按ASCII码从小到大排序),将str2合并到字符串str1中,要求合并后的字符串仍是有序的,允许字符重复。在main函数中测试该函数:从键盘输入两个有序字符串,然后调用该函数,最后输出合并后的结果。
7 / 30
【输入形式】
分行从键盘输入两个有序字符串(不超过100个字符) 【输出形式】
输出合并后的有序字符串 【输入样例】 aceg bdfh
【输出样例】 abcdefgh 【样例说明】
输入两个有序字符串aceg和bdfh,输出合并后的有序字符串abcdefgh 【评分标准】
结果完全正确得20分,每个测试点4分,提交程序文件名为combine.c。 #include
char * str_bin(char* str1, char* str2) {
static char str[100]; int i = 0;
while (*str1 && *str2) {
if (*str1 < *str2) str[i++] = *str1++; else
str[i++] = *str2++;
} if (*str1)
while (str[i++] = *str1++); else
while (str[i++] = *str2++); return str; }
int main () { char a[100]; char b[100];
scanf(\ printf (\ return 0; } 作业四
填空题
# 题目
1. 已知: int a=2, b=7; 计算下列表达式的值: 5
a=4,b=1,a>b?++a:++b;
选择题
# 题目 1. 已知:char a=’a’;float b=2.3;double c=41;int d;则执行语句d=a+b+c;后变量d的数据类型为 A
8 / 30
(A) int (B) char (C) float (D) double
2. 字符串“\\ta\\017bc”的长度(不包括结束符)是 C (A) 9 (B) 5 (C) 6
(D) 7
3. 设整型变量x和y的值均为7,则表达式“x/(y-4)”的值是C A. 3
B. -3 C. 2 D. 1
4. 题目内容: 有输入语句:int a,b,c; scanf(\&a, &b, &c); 为使变量a的值为1,b的值为3,c的值为2,
从键盘输入数据的正确形式应当是(注:#表示空格)D
(A) 132<回车> (B) 1,3,2<回车>
(C) a=1#b=3#c=2<回车> (D) a=1,b=3,c=2<回车> 编程题
作业四---反弹
1. 【问题描述】
已知一球从高空落下时,每次落地后反弹至原高度的四分之一再落下。编写一程序,从键盘输入整数n和m,求该球从n米的高空落下后,第m次落地时共经过的路程以及第m次落地后反弹的高度,并输出结果。 【输入形式】
从键盘输入整数n和m,以空格隔开。 【输出形式】 输出两行:
第一行输出总路程,保留小数点后两位; 第二行输出第m次落地后反弹的高度,保留小数点后两位。 【输入样例】 40 3
【输出样例】 65.00 0.63
【评分标准】
结果完全正确得20分,每个测试点4分,提交程序文件high.c。
---日期天数转换
2. 【问题描述】编写一个程序,用户输入日期,计算该日期是这一年的第几天。
【输入形式】用户在第一行输入一个日期(年 月 日,中间以空格分割)
【输出形式】程序在下一行输出一个整数 【样例输入】2006 2 21 【样例输出】52
【样例说明】用户以年月日的格式输入,中间以空格分割,程序计算出该天是输入年份的第几天并输出该天数。另外还需要判断这一年是否为闰年。
【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:datetoday.c
#include
int days(int year,int month,int day) { int
s=0,i,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(year%4==0&&year0!=0||year@0==0) a[2]=29; for(i=1;i 9 / 30 return s; } void main() { int k=0; struct tian a; scanf(\day); k=days(a.year,a.month,a.day); printf(\} 第五次走也 填空题 # 题目 1. 已知:int k= 4,a=3,b=2,c=1;则表达式“k 2. 已知:char x=’A’, y=’B’; 执行“(x=’B’)||(y=’C’)”的运算后,变量x,y的值分别为(答案用逗号隔开) 'B','B' 3. 已知:int a=5,b=6,w=1,x=2,y=3,z=4;执行语句“(a=w>x)&&(b=y>z);”后b 的值为6 选择题 # 题目 1. 执行以下程序段后,变量a,b,c的值分别是B int x = 10, y = 9; int a, b, c; a = (--x == y++)? --x: ++y; b = x++; c = y; (A) a = 9, b = 9, c = 9 (B) a = 8, b= 8, c = 10 (C) a = 9, b = 10, c = 9 (D) a = 11, b = 11, c = 10 编程题 作业五---删数问题 1. 【问题描述】输入一个高精度的大正整数S(S最长可达240位),去掉其中任意N位数字后剩下的数字按原次序组成一个新的正整数S’。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数S’最小。 【输入形式】输入有两行: 1.第一行是大整数S。其中S最长可达240位。 2.第二行是整数N。S、N均以非0数字开头。【输出形式】输出有一行,是在S中删除N位后所得的最小数字S’。 【样例输入1】 178543 4 【样例输出1】13 【样例输入2】 1002 1 【样例输出2】002 【样例说明】样例1中输入整数S=178543,N=4,要求在178543中删除4位,使剩下的数字最小。正确答案为S’ = 13。样例2中输入整数S=1002,N=1,删完一位后S’ = 002,而不是2,即2之前的0也必须输出。【运行时限】程序一次运行的最长时间限制在15秒内,超出则认为程序错误。 10 / 30 【算法提示】将整数看作字符串形式读入;删数时,从前往后寻找第一个比后一个数字大的数字,然后删除之,按照这种方法删除N个数字即得最小数字。 【评分标准】该题要求输出一个大整数的各位数字。结果完全正确得20分,每个测试点4分。上传C语言文件名为delete.c。 #include /* scan from 0 - 9, test the input, rescan if get the result. */ int main() { char integer[250], result[250]; int start = 0, strlength, n, i = 0, j, temp, k = 0; fgets(integer, 249, stdin); strlength = strlen(integer) - 1; integer[strlength] = '\\0'; scanf(\ for (i = 0; i <= 9; i++) { temp = i; for (j = start; j <= n && n < strlength; j++) if (integer[j] == temp + '0') { result[k++] = temp + '0'; n++; start = j + 1; i = -1; break; } } for (i = 0; i < k; i++) printf(\ return 0; } 作业五---求公式近似值 2. 【问题描述】 已知ex的近似值可由下面公式计算得出: ex=1 + x/1! + x2/2! + x3/3! + ...... + xn/n! 给定x和n,利用上述公式求得ex的近似值。 【输入形式】 从控制台输入小数x,和整数n(n>=1),用空格隔开。 【输出形式】 向控制台输出求得的ex 的近似值(小数点后保留6位有效数据)。 【样例输入】 7 27 【样例输出】 1096.633156 【样例说明】 输入的x为7,n的值为27,即:求e7的近似值,利用上述公式求得的近似值为:1096.633156。 【评分标准】 该题要求输出ex的近似值,共有5个测试点。上传C语言文件名为formula.c。 #include 11 / 30 int n,i; double t; scanf(\ t=1; s=1; y=1; for(i=1;i<=n;i++) { t*=i; y*=x; s+=y/t; } printf(\ return 0; } 作业六: 选择题 # 题目 1. 若有变量定义int a; double b; 要输入数据存放在a和b中,则下面正确的输入数据的语句为:C A. scanf(\B. scanf(\C. scanf(\D. scanf(\ 2. 在C语言程序中,以下正确的描述是 (A) 函数的定义可以嵌套,但函数的调用不可以嵌套B (B) 函数的定义不可以嵌套,但函数的调用可以嵌套 (C) 函数的定义和函数的调用均不可以嵌套 (D) 函数的定义和函数的调用均可以嵌套 3. 以下正确的函数声明形式是 A (A) double fun(int x, int y) (B) double fun(int x; int y) (C) double fun(int x, int y); (D) double fun(int x, y); 实验六---字符串中字符排序 1. 【问题描述】编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。 【输入形式】用户在第一行输入一个字符串。 【输出形式】程序按照字符(ASCII)顺序从小到大排序字符串,并删除重复的字符进行输出。 【样例输入】badacgegfacb 【样例输出】abcdefg 【样例说明】用户输入字符串badacgegfacb,程序对其进行按从小到大(ASCII)顺序排序,并删除重复的字符,最后输出为abcdefg 【评分标准】结果完全正确得20分,每个测试点4分。提交源程序名为stringsort.c #include 作业七: 选择题 # 题目 1. 若有说明: char *language[] = {\\\\\则以下不正确的叙述是 D (A) language+2 表示字符串\的首地址 12 / 30 (B) *language[2]的值是字母P (C) language是一个字符型指针数组,它包含5个元素,每个元素都是一个指向字符串变量的指针 (D) language包含5个相同长度的数组 2. 设有说明 int (* ptr) [M]; 其中ptr是 C (A) M个指向整型变量的指针 (B) 指向M个整型变量的函数指针 (C) 一个指向具有M个整型元素的一维数组的指针 (D) 具有M个指针元素的一维指针数组,每个元素都只能指向整型量 3. 下面能正确进行字符串赋值,并且能确保字符串以’\\0’结尾的操作是 C (A) char s[5] = {\ (B) char s[5] = {’A’, ’B’, ’C’, ’D’, ’E’}; (C) char *s; s = \(D) char *s; scanf(\ 4. 若有说明: char *language[] = {\\\\\则表达式 *language[1] > *language[3] 比较的是 C (A) 字符F和字符P (B) 字符串BASIC和字符串JAVA (C) 字符B和字符J (D) 字符串FORTRAN和字符串PASCAL 5. 若有以下定义,则数值不为3的表达式是 int x[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p1;C (A) x[3] (B) p1 = x + 3, *p1++ (C) p1 = x + 2, *(p1++) (D) p1 = x + 2, *++p1 6. 以下正确的说明语句是A (A) int *b[] = {1, 3, 5, 7, 9}; (B) int a[5], *num[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]}; (C) int a[] = {1, 3, 5, 7, 9}; int *num[5] = {a[0], a[1], a[2], a[3], a[4]}; (D) int a[3][4], (*num)[4]; num[1] = &a[1][3]; 当前编程题:实验七---整数的N进制字符串表示 1. 【问题描述】编写函数itob(n,s,b),用于把整数n转换成以b为基的字符串并存储到s中. 编写程序,使用函数itob(n,s,b)将输入的整数n,转换成字符串s,将s输出.转换后的字符串从最高的非零位开始输出。如果n为负数,则输出的字符串的第一个字符为’-’。b为大于1小于37的任意自然数值。当b=2时,输出字符只可能是’0’和’1’;当b=16时,输出字符串中可能含有字符为’0’-’9’,’a’-’f’(字母以小写输出)。b还可以是其它数值。比如输入n=33,b=17,则输出33的17进制值为\。 【输入形式】控制台输入整数n和b,其中n可以为负数。n和b以空格分隔. 【输出形式】控制台输出转化后的字符串s. 【样例输入】5 2 【样例输出】101 【样例说明】5的二进制就是101 【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:itob.c #include void itob(int n,char s[],int b); void itob(int n,char s[],int b) { int tmp; int i = 0; tmp=n; while (tmp) { 13 / 30 if((tmp%b)>=10) s[i]='a'+tmp%b-10; else s[i]='0'+tmp%b; tmp=tmp/b; i++; } s[i]='\\0'; } int main() { int n, b, i; char s[100]; scanf(\ itob(n,s,b); for(i = strlen(s) - 1;i>=0;i--) printf(\ return 0; } 第八次 填空题 # 题目 1. 写出程序的运行结果 1,2,3,3,5,4 #include int a[] = {1,2,3,4,5,6}; int *p; p=a; printf(\ printf(\ printf(\ printf(\ p+=3; printf(\} 2. 以下程序的运行结果是 10 x #include void func(struct n b) { b.x = 20; b.c= ’y’; } main() { struct n a = {10, ’x’}; func(a); printf (\} 3. 以下程序的运行结果是6,9 #include int i; for (i=4;i<=10;i++) { if (i%3==0) continue; printf(\ } } 选择题 # 题目 1. 若有以下程序段 struct dent { int n; int *m; }; int a=1, b=2, c=3; struct dent s[3]={{101,&a},{102,&b},{103,&c}}; strcut dent *p =s; 则以下表达式值为2的是 A A.(p++)->m B.*(p++)->m 14 / 30 C.(*p).m D.*(++p)->m 2. 下面程序是求数组中的最小的元素,请选择填空。 D findmin(int *s, int t, int *k) { int p; for(p = 0;p if(s[p] main() { int a[10],i,*k=&i; for(i=0;i<10;i++) { scanf(\ } i=0; findmin(a, 10,k); printf(\} A.k=p B.*k=p-s C.k=p-s D.*k=p 3. 有如下定义: struct { int x; char *y; } tab[2] = {{1, \ 语句 printf(\的输出结果是b 4. 已知学生记录的定义为: struct student { int no; char name[20]; char sex; struct { int year; int month; int day; }birth; }; struct student s; 假设变量s中的“生日”应是“1988年5 月10日”,对“生日”的正确赋值语句是D (A) year=1988; month=5; day=10; (B) brith.year=1988; birth.month=5; birth.day=10; (C) s.year=1988; s.month=5; s.day=10; (D) s.birth.year=1988; s.birth.month=5; s.birth.day=10; 5. 若有以下说明和语句,则下面表达式中值为1002的是 D struct student { int age; int num; }; struct student stu[3] = {{1001, 20}, {1002, 19}, {1003, 21}}; struct student *p; p = stu; (A) (p++)->num (B) (p++)->age (C) (*p).num (D) (*++p).age 当前编程题:实验八---统计整数 15 / 30 1. 【问题描述】 输入若干个整数,统计出现次数最多的那个整数。如果出现最多的整数有两个以上,打印最早输入的那个整数。 【输入形式】 从标准输入读取输入。第一行只有一个数字N(1≤N≤10000),代表整数的个数。以后的N行每行有一个整数。 【输出形式】 向标准输出打印出现次数最多的那个数字。 【输入样例】 6 11 0 -1 20 0 300 【输出样例】 0 【样例说明】 输入6个整数,其中出现次数最多的是0,共出现两次。 【评分标准】 本题不准使用数学库函数。运行时限1秒,正确得20分,每个测试点4分,提交程序名为count.c。 {{建电脑桌面}} C 语言总复习C六月,奋战CC语言,大家一起加油啦~~~~~~~~~~~!! 总体上必须清楚的:? 1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)? 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选 择)。? 3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址.? 4)bit是位 是指为0 或者1。 byte 是指字节, 一个字节 = 八个位.? 5)一定要记住 二进制 如何划成 十进制。? 概念常考到的:? 1、编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。? 2、每个C语言程序中main函数是有且只有一个。? 3、在函数中不可以再定义函数。? 4、算法的是一定要有输出的,他可以没有输入。? 5、break可用于循环结构和switch语句。? 6、逗号运算符的级别最低。? 第一章? 1)合法的用户标识符考查:? 合法的要求是由字母,数字,下划线组成。有其它元素就错了。? 并且第一个必须为字母或则是下划线。第一个为数字就错了。? 关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。? 2)实型数据的合法形式:? 2.333e-1 就是合法的,且数据是2.333×10-1。? 考试口诀:e前e后必有数,e后必为整数。.? 3)字符数据的合法形式::? '1' 是字符占一个字节,\是字符串占两个字节(含有一个结束符号)。? '0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。? 4) 整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:? 考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。? 5)转义字符的考查:? 16 / 30 在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。? 在程序中 int a = 06d, 是一个八进制的形式。? 在转义字符中,’\\x6d’ 才是合法的,0不能写,并且x是小写。? ‘\\141’ 是合法的, 0是不能写的。? ‘\\108’是非法的,因为不可以出现8。? 6)算术运算符号的优先级别:? 同级别的有的是从左到右,有的是从右到左。? 7)强制类型转换:? 一定是 (int)a 不是 int(a),注意类型上一定有括号的。? 注意(int)(a+b)和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。? 8)表达式的考查:? 是表达式就一定有数值。? 赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。? 自加、自减表达式:假设a=5,++a(是为6), a++(为5);? 运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这? 个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,? 再放到变量a中。 进行了++a和a++后在下面的程序中再用到a的话都是变量a中的6了。? 考试口诀:++在前先加后用,++在后先用后加。? 逗号表达式:优先级别最低 ;表达式的数值逗号最右边的那个表达式的数值。? (2,3,4)的表达式的数值就是4。? 9)位运算的考查:? 会有一到二题考试题目。? 总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。? 例1: char a = 6, b;? b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。 ? 例2: 一定要记住,? 例3: 在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。? 10)018的数值是非法的,八进制是没有8的,逢8进1。 ? 11)%符号两边要求是整数。不是整数就错了。? 12) 三种取整丢小数的情况:? 1、int a =1.6;? 2、(int)a; ? 3、 ? ? 第二章? 1)printf函数的格式考查:? %d对应整型;%c对应字符;%f对应单精度等等。宽度的,左对齐等修饰。? %ld对应 long int;%lf 对应double。? 2)scanf函数的格式考察:? 注意该函数的第二个部分是&a 这样的地址,不是a; ? Scanf(“%d%d%*d%d”,&a,&b,&c); 跳过输入的第三个数据。? 3)putchar ,getchar 函数的考查:? char a = getchar() 是没有参数的,从键盘得到你输入的一个字符给变量a。- putchar(‘y’)把字符y输出到屏幕中。? 4)如何实现两个变量x ,y中数值的互换(要求背下来)? 不可以把 x=y ,y=x; 要用中间变量 t=x;x=y;y=t。? 5)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来)? 这个有推广的意义,注意 x = (int)x 这样是把小数部分去掉。? ? 第三章? 特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的。? 1)关系表达式:? 表达式的数值只能为1(表示为真),或0(表示假)? 当关系的表达是为真的时候得到1。如 9>8这个是真的,所以表达式的数值就是1;? 17 / 30 2)逻辑表达式:? 只能为1(表示为真),或0(表示假)? a) 共有&& || ! 三种逻辑运算符号。? b) !>&&>|| 优先的级别。? c) 注意短路现象。考试比较喜欢考到。? d) 要表示 x 是比0大,比10小的方法。0 else 是与最接近的if且没有else的相组合的。? 4)条件表达式:? 表达式1 ?表达式2 :表达式3? 注意是当非0时候是表达式2的数值,当为0是就是表达式2的数值。? 考试口诀:真前假后。? 5)switch语句:? a)一定要注意 有break 和没有break的差别,书上(34页)的两个例子,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。? b)switch只可以和break一起用,不可以和continue用。? ? 第四章? 1)三种循环结构:? a)for() ; while(); do- while()三种。? b)for循环当中必须是两个分号,千万不要忘记。? c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。- d) do-while()循环的最后一个while();的分号一定不能够丢。(当心上机改错)? 2) break 和 continue的差别? 记忆方法:? break:是打破的意思,(破了整个循环)所以看见break就退出真个一层循环。? continue:是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。? 3)嵌套循环? 就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算,一般记住两层是处理二维数组的。? 4) while((c=getchar())!=’\\n’) 和 while(c=getchar() !=’\\n’)的差别? 先看a = 3 != 2 和(a=3)!=2 的区别:? (!=号的级别高于=号 所以第一个先计算 3!=2) 第一个a的数值是得到的1;第二个a的数值是3。? 考试注意点: 括号在这里的重要性。? ? 第五章? 函数:是具有一定功能的一个程序块;? 1) 函数的参数,返回数值(示意图):? main()? {? int a = 5,b=6,c;? c = add(a,b);? printf(“%d”,c);? }? ? 调用函数? a,b是实参? 整个函数得到一个数值就是? Add函数的返回数值。? int add ( int x, int y)? {? int z;? z=x+y;? return z;? }? 被调用函数? x,y是形式参数? 函数返回数值是整型? ? z就是这个add函数计算后得到的结果,就是函数返回给主程序的返回数值。- 程序是在从上往下顺序执行,当碰到了函数add后,把a,b的数值穿给调用函数,程序暂时中断等待返回数值。当得到了返回数值后,再顺序的往下执行? 2)一定要注意参数之间的传递? 实参和形参之间 传数值,和传地址的差别。 18 / 30 (考试的重点)? 传数值的话,形参的变化不会改变实参的变化。? 传地址的话,形参的变化就会有可能改变实参的变化。? 3)函数声明的考查:? 一定要有:函数名,函数的返回类型,函数的参数类型。? 不一定要有:形参的名称。? ? 第六章? 指针变量的本质是用来放地址,而一般的变量是放数值的。? int *p 中 *p和p的差别:? *p可以当做变量来用;*的作用是取后面地址p里面的数值? p是当作地址来使用。? *p++ 和 (*p)++的之间的差别:改错题目中很重要? *p++是 地址会变化。? (*p)++ 是数值会要变化。 ? 三名主义:(考试的重点)? 数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次)? 函数名:表示该函数的入口地址。? 字符串常量名:表示第一个字符的地址。? ? 第七章? 1一维数组的重要概念:? 对a[10]这个数组的讨论。? 1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。? 2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。? 3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。 ? 对a[3][3]的讨论。? 1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。? 2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。? 3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。? 4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。? 5、注意a和a[0] 、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。? 二维数组做题目的技巧:? 如果有a[3][3]={1,2,3,4,5,6,7,8,9}这样的题目。? 步骤一:把他们写成: 第一列 第二列 第三列 ? a[0]à 1 2 3 ->第一行? a[1]à 4 5 6 —>第二行? a[2]à 7 8 9 ->第三行? 步骤二:这样作题目间很简单: ? *(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以是1。? *(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。? 一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。? 数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写? int a[]={1,2} 合法。 int a[][4]={2,3,4}合法。 但int a[4][]={2,3,4}非法。? 二维数组中的行指针? int a[1][2]; ? 其中a现在就是一个行指针,a+1跳一行数组元素。 搭配(*)p[2]指针? a[0],a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用? 还有记住脱衣服法则:? a[2] 变成 *(a+2) a[2][3]变成 *(a+2)[3]再可以变成 *(*(a+2)+3)- 这个思想很重要!? 学习 模拟试题:::: 一、 选择题 1、字符串\的长度是:( ). 19 / 30 A、3 B、11 C、7 D、5 2、设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的 数据类型为()。 A、double B、不确定 C、int D、float 3、下列语句的结果是()。 main() { int j; j=3; printf(\ printf(\} A、3,3 B、4,4 C、3,4 D、4,3 4、逻辑表达式!(2-1)&&x||0的值是( ) A、1 B、0 C、3 D、2 5、int a=1,b=2,c=3; if(a>b)a=b; if(a>c)a=c; 则a的值为()。 A、3 B、2 C、1 D、不一定 6、执行语句 for(i=1;i++<4;); 后变量 i 的值是()。 A、3 B、5 C、4 D、不定 7、以下正确的描述是( ). A、只能用continue语句来终止本次循环 B、switch语句中不能出现continue语句 C、在循环中break语句不能独立出现 D、goto语句只能用于退出多层循环 8、下面合法的语句定义是( ). A、char a[ ]={'0','1','2','3','4','5'}; B、int a[ ]=\ C、int a[5]={0,1,2,3,4,5}; D、char a=\9、char a[10];不能将字符串\存储在数组中的是()。 A、int i;for(i=0;i<3;i++)a[i]=i+97;a[i]=0; B、a=\ C、strcpy(a,\ D、a[0]=0;strcat(a,\ 10、在C语言中,一维数组的定义方式为:类型说明符 数组名()。 A、[整型常量]或[整型表达式] B、[正整型常量表达式] C、[整型表达式] D、[常量表达式] 11、在定义全局变量和局部静态变量的同时赋值,变量的初始化在( )时确定的. A、运行 B、编辑 C、编译 D、调试 12、关于建立函数的目的,以下正确的说法是()。 A、提高程序的可读性 B、减少程序文件所占内存 C、减少程序的篇幅 D、提高程序的执行效率 13、以下函数调用语句中实参的个数是()。 func((e1,e2),(e3,e4,e5)); A、3 B、5 C、语法错误 D、2 14、设有宏定义#define SUB(x,y) (x)*y,且a=3,b=4,则 SUB(a++,b++) 的值为( ). A、13 B、16 C、20 D、12 15、变量p为指针变量,若p=&a,下列写法不正确的是()。 A、*(p++)==a++ 20 / 30 B、&*p==&a C、(*p)++==a++ D、*&a==a 16、下列程序正确的运行结果为( ). #include union u {char *name; int age; int income; } s; s.name=\s.age=28; s.income=1000; printf(\} A、8 B、28 C、1000 D、不确定 17、定义my_file 为文件型指针变量,使用fopen只读方式打开一个已存在的二进制文件,以下正 确的调用形式为( ). A、my_file=fopen(\B、my_file=fopen(\C、my_file=fopen(\D、my_file=fopen(\ 答案:CABBC BAABB CADDA CC 二、 判断 1、若i =3,则printf(\输出的值为 -4。2、格式字符%x用来以八进制形式输出整数. 3、设u=1,v=2,w=3,则逻辑表达式u||v-w&&v+w的值为0. 4、已知a=4,b=2,c=3,d=5,表达式a>b?a:c int a[3][3]={{3,5},{8,9},{12,35}},i,sum=0; for(i=0;i<3;i++) sum+=a[i][2-i];则sum=21. 8、二维数组在内存中存贮时,是按行的顺序进行存储的。 9、C语言中引用数组元素的方括号可以用花括号代替. 10、每次调用函数时,都要对静态局部变量重新进行初始化. 11、在程序中的第二个函数之后定义了某全局变量,则该程序的所有函数均可使用它. 12、在C程序中 , 函数既可以嵌套定义 , 也可以嵌套调用 13、在定义宏时,在宏名与带参数的括弧之间不应加空格. 14、数组名与指针变量是相互等价的. 15、两个类型相同的结构体变量,可以互相赋值. 16、C语言中,在打开文件时,必须说明文件的使用方式,\用于打开一个不存在的文件. 答案:错错错错错 对对对错错 错错对错对 错 三、 填空 1、设x和y均为int型变量,且x=1,y=2,则表达式1.0+x/y的值为____1.0_. 2、在C语言中,long类型数据占___4__个字节, short类型数据占_2____个字节. 3、int x=2,y=3,z=4; 则表达式x+y>z&&y==z的值为 0_____. 4、int x=2,y=3,z=4; 则表达式x+y&&(x=y)的值为____1_. 5、C语言中,二维数组在内存中的存放方式为按___行__优先存放. 6、函数调用时的实参和形参之间的数据是单向的_值____传递. 7、结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体___类型__,再说明结构体变量. 8、调用 fopen 函数打开一文本文件,在\使用方式\这一项中, 为输入而打开需填入_r____. 答案:(1)1 1.0 1. (2) 4 2 (3) 21 / 30 0 (4) 1 (5) 行 (6) 值 (7) 类型 (8)r+ r 四、程序设计 1、功能:求出二维数组外围元素之和,作为函数值返回。二 维数组的值在主函数中赋予。 ------------------------------------- #define M 4 #define N 5 #include \ int fun(int a[M][N]) { /*********Begin**********/ /********** End **********/ } main() { int a[M][N]={{1,3,5,7,9},{2,4,6,8,10},{2,3,4,5,6},{4,5,6,7,8}}; void TestFunc(); int y; y=fun(a); printf(\ TestFunc(); } void TestFunc() { FILE *IN,*OUT; int iIN[M][N],iOUT; int i,j,k; IN=fopen(\if(IN==NULL) {printf(\Be Changed\} OUT=fopen(\ if(OUT==NULL) {printf(\Be Changed\} for(k=0;k<10;k++) { for(i=0;i fscanf(IN,\ iOUT=fun(iIN); fprintf(OUT,\} fclose(IN); fclose(OUT); } 【参考代码】 int s=0; int i,j; for(i=0;i s=s+a[i][0]+a[i][N-1]; for(j=1;j s=s+a[0][j]+a[M-1][j]; return s; =============== 2、功能:找出一个大于给定整数且紧随这个整数的素数,并 作为函数值返回。 ------------------------------------------------*/ #include \#include\ int fun(int n) { /*********Begin**********/ /********** End **********/ } void TestFunc() { FILE *IN,*OUT; int s ; 22 / 30 int t; int o; IN=fopen(\ if(IN==NULL) { printf(\ } OUT=fopen(\ if(OUT==NULL) { printf(\ } for(s=1;s<=5;s++) { fscanf(IN,\ o=fun(t); fprintf(OUT,\ } fclose(IN); fclose(OUT); } main() { int m; printf(\ scanf(\ printf(\ TestFunc(); } 【参考代码】 int i,k; for(i=n+1;;i++){ for(k=2;k 五、程序改错 1、功能:一个5位数,判断它是不是回文数。即12321是回文数,个 位与万位相同,十位与千位相同。 ------------------------------------- #include \main( ) { /**********ERROR**********/ long ge,shi,qian;wan,x; scanf(\ /**********ERROR**********/ wan=x000; qian=x000/1000; shi=x0/10; ge=x; /**********ERROR**********/ if (ge==wan||shi==qian) printf(\ else printf(\} 【改错1】 【参考答案】 long ge,shi,qian,wan,x; =========================================== 【改错2】 【参考答案】 wan=x/10000; =========================================== 【改错3】 【参考答案】 if (ge==wan&&shi==qian) if (shi==qian&&ge==wan) ===========================================2、功能:一个5位数,判断它是不是回文数。即12321是回文数,个 位与万位相同,十位与千位相同。 ------------------------------------- #include \main( ) { /**********ERROR**********/ long ge,shi,qian;wan,x; scanf(\ 23 / 30 /**********ERROR**********/ wan=x000; qian=x000/1000; shi=x0/10; ge=x; /**********ERROR**********/ if (ge==wan||shi==qian) printf(\ else printf(\} 【参考答案】 #include \#include ===========================================【参考答案】 float s=0,t=1,p=1; float s=0,p=1,t=1; float p=1,s=0,t=1; float p=1,t=1,s=0; float t=1,p=1,s=0; float t=1,s=0,p=1; double s=0,t=1,p=1; float s=0.0,t=1.0,p=1.0; double s=0.0,t=1.0,p=1.0; =========================================== 【参考答案】 while(fabs(t)>1e-4) while(0.0001 =========================================== 【参考答案】 printf(\printf(\ =========================================== 六、程序填空 1、功能:计算并输出500以内最大的10个能被13或17整除的自然数之和。 ------------------------------------- #include \ /***********FILL***********/ int fun(_____ ) { int m=0, mc=0, j, n; /***********FILL***********/ while (k >= 2 && _____) { /***********FILL***********/ if (k == 0 || _____) { m=m+k; mc++; } k--; } /***********FILL***********/ _____; } main ( ) { printf(\} 【空1】 【参考答案】 int k =========================================== 【空2】 【参考答案】 mc < 10 10 > mc mc <= 9 9 >= mc ===========================================【空3】 【参考答案】 k == 0 !(k) k/17*17==k =========================================== 【空4】 【参考答案】 return m 24 / 30 return (m) =========================================== 2、功能:以下程序中,函数fun的功能是计算x^2-2x+6,主函数中将调用fun函数计算: y1=(x+8)^2-2(x+8)+6 y2=(sin(x))^2-2sin(x)+6 请填空。 -------------------------------------#include #include return(x*x-2*x+6); } main() { /***********FILL***********/ double x, __________; printf(\ scanf(\ /***********FILL***********/ y1=fun( _________); /***********FILL***********/ y2=fun( _________); printf(\ y1, y2); } 【空1】 【参考答案】 y1,y2 y2,y1 =========================================== 【空2】 【参考答案】 (x+8) (8+x) x+8 8+x =========================================== 【空3】 【参考答案】 sin(x) C语言必背18个经典程序 1、/*输出9*9口诀。共9行9列,i控制行,j控制列。*/ #include \main() {int i,j,result; for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf(\表示左对齐,占3位*/ } printf(\每一行后换行*/ } } 2、/*古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列1,1,2,3,5,8,13,21....*/ main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) { printf(\ if(i%2==0) printf(\控制输出,每行四个*/ f1=f1+f2; /*前两个月加起来赋值给第三个月*/ f2=f1+f2; /*前两个月加起来赋值给第三个月*/ } } 3、/*判断101-200之间有多少个素数,并输出所有素数及素数的个数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 25 / 30 则表明此数不是素数,反之是素数。*/ #include \main() { int m,i,k,h=0,leap=1; printf(\ for(m=101;m<=200;m++) { k=sqrt(m+1); for(i=2;i<=k;i++) if(m%i==0) {leap=0;break;} if(leap) /*内循环结束后,leap依然为1,则m是素数*/ {printf(\ if(h==0) printf(\ } leap=1; } printf(\} 4、/*一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。*/ main() { static int k[10]; int i,j,n,s; for(j=2;j<1000;j++) { n=-1; s=j; for(i=1;i {printf(\ \ for(i=0;i printf(\ printf(\ } } } 5、/*下面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出, 请在空白处完善程序。*/ main() { int a[4][4],b[4][4],i,j; /*a存放原始数组数据,b存放旋转后数组数据*/ printf(\ /*输入一组数据存放到数组a中,然后旋转存放到b数组中*/ for(i=0;i<4;i++) for(j=0;j<4;j++) { scanf(\ b[3-j][i]=a[i][j]; } printf(\ for(i=0;i<4;i++) { for(j=0;j<4;j++) printf(\ printf(\ } } 6、/*编程打印直角杨辉三角形*/ main() {int i,j,a[6][6]; for(i=0;i<=5;i++) {a[i][i]=1;a[i][0]=1;} for(i=2;i<=5;i++) for(j=1;j<=i-1;j++) a[i][j]=a[i-1][j]+a[i-1][j-1]; for(i=0;i<=5;i++) {for(j=0;j<=i;j++) printf(\ printf(\} 7、/*通过键盘输入3名学生4门课程的成绩, 分别求每个学生的平均成绩和每门课程的 26 / 30 平均成绩。 要求所有成绩均放入一个4行5列的数组中,输入时同一人数据间用空格,不同人用回车 其中最后一列和最后一行分别放每个学生的平均成绩、每门课程的平均成绩及班级总平均分。*/ #include { float a[4][5],sum1,sum2; int i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(\ for(i=0;i<3;i++) { sum1=0; for(j=0;j<4;j++) sum1+=a[i][j]; a[i][4]=sum1/4; } for(j=0;j<5;j++) { sum2=0; for(i=0;i<3;i++) sum2+=a[i][j]; a[3][j]=sum2/3; } for(i=0;i<4;i++) { for(j=0;j<5;j++) printf(\ printf(\ } } 8、/*完善程序,实现将输入的字符串反序输出, 如输入windows 输出swodniw。*/ #include { char c[200],c1; int i,j,k; printf(\ scanf(\ k=strlen(c); for (i=0,j=k-1;i { c1=c[i];c[i]=c[j];c[j]=c1; } printf(\ } 指针法: void invert(char *s) {int i,j,k; char t; k=strlen(s); for(i=0,j=k-1;i { t=*(s+i); *(s+i)=*(s+j); *(s+j)=t; } } main() { FILE *fp; char str[200],*p,i,j; if((fp=fopen(\ { printf(\ exit(0); } printf(\gets(str); printf(“\\n%s”,str); fprintf(fp,“%s”,str); invert(str); printf(“\\n%s”,str); fprintf(fp,“\\n%s”,str); fclose(fp); } 9、/*下面程序的功能是从字符数组s中删除存放在c中的字符。*/ #include { char s[80],c; int j,k; printf(\ gets(s); printf(\ c=getchar( ); for(j=k=0;s[j]!= '\\0';j++) if(s[j]!=c) s[k++]=s[j]; s[k]= '\\0'; printf(\} 27 / 30 10、/*编写一个void sort(int *x,int n)实现将x数组中的n个数据从大到小 排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件p9_1.out中*/ #include int i,j,k,t; for(i=0;i for(j=i+1;j t=x[i]; x[i]=x[k]; x[k]=t; } } } void main() {FILE *fp; int *p,i,a[10]; fp=fopen(\ p=a; printf(\for(i=0;i<10;i++) scanf(\p=a; sort(p,10); for(;p fprintf(fp,\ } system(\ fclose(fp); } 11、已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列*/ main() { int a[10]={0,12,17,20,25,28,30}; printf(\/*a[0]为工作单元,从a[1]开始存放数据*/ int x , i, j=6; fprintf(fp,\ fclose(fp); /*j为元素个数*/ printf(\ } scanf(\13、/*在一个字串s1中查找一子串s2,若 a[0]=x; 存在则返回子串在主串中的起始位置 i=j; ,不存在则返回-1。*/ /*从最后一个单元开始*/ while(a[i]>x) { a[i+1]=a[i]; i--; } /*将比x 大的数往后移动一个位置*/ a[++i]=x; j++; /*插 入x后元素总个数增加*/ for(i=1;i<=j;i++) printf(\ printf(\} 12、/*编写函数replace(char *s,char c1,char c2)实现将s所指向的字符串中所有字符c1 用c2替换,字符串、字符c1和c2均在主 函数中输入,将原始字符串和替换后的字符 串显示在屏幕上,并输出到文件p10_2.out中*/ #include replace(char *s,char c1,char c2) { while(*s!='\\0') { if (*s==c1) *s=c2; s++; } } main() { FILE *fp; char str[100],a,b; if((fp=fopen(\ { printf(\ exit(0); } printf(\ gets(str); printf(\ scanf(\printf(\fprintf(fp,\replace(str,a,b); 28 / 30 main() {char s1[6]=\ printf(\system(\} int search(char s1[],char s2[]) {int i=0,j,len=strlen(s2); while(s1[i]){ for(j=0;j if(j>=len)return i; else i++; } return -1; } 14、/*用指针变量输出结构体数组元素。*/ struct student { int num; char *name; char sex; int age; }stu[5]={{1001,\M',19},{1003,\ou\main() {int i; struct student *ps; printf(\ /*用指针变量输出结构体数组元素。*/ for(ps=stu;ps printf(\s->name,ps->sex,ps->age); /*用数组下标法输出结构体数组元素学号和年龄。*/ for(i=0;i<5;i++) printf(\ } 15、/*建立一个有三个结点的简单链表:*/ #define NULL 0 struct student { int num; char *name; int age ; struct student *next; }; void main() { struct student a,b,c,*head,*p; a.num=1001; a.name=\a.age=18; /* 对结点成员进行赋值 */ b.num=1002; b.name=\c.num=1003; c.name=\head=&a; /* 建立链表,a为头结点 */ a.next=&b; b.next=&c; c.next=NULL; p=head; /* 输出链表 */ do{ printf(\ge); p=p->next; }while(p!=NULL); } 16、/*输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。*/ #include { char s[100]; int i,j,n; printf(\输入字符串:\\n\ gets(s); n=strlen(s); for(i=0,j=n-1;i 29 / 30 if(i>=j) printf(\是回文串\\n\ else printf(\不是回文串\\n\} 17、/*冒泡排序,从小到大,排序后结果输出到屏幕及文件myf2.out*/ #include for(i=0;i<=n-1;i++) for(j=0;j if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;} } main() {int a[10]={12,45,7,8,96,4,10,48,2,46},n=10,i; FILE *f; if((f=fopen(\ printf(\fun(a,10); for(i=0;i<10;i++) {printf(\ fprintf(f,\ } fclose(f); } 18、编写函数countpi,利用公式 计算π的近似值,当某一项的值小于10-5时,认为达到精度要求,请完善函数。将结果显示在屏幕上并输出到文件p7_3.out中。#include int m=1; double temp=1.0,s=0; while(temp>=eps) { s+=temp; temp=temp*m/(2*m+1); m++; } return(2*s); } main() {FILE *fp; double eps=1e-5,pi; if((fp=fopen(\ { printf(\ exit(0); } pi= countpi(eps); printf(\fprintf(fp,\fclose(fp); } 30 / 30