[新]C语言期末复习,经典练习题+知识点总结+模拟考题 三位一体,完胜c语言!!!!考期必备神器

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 int main() { char c=\

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 void main() { int a,d,e,f,sum; //*定义变量*// printf(\请输入一个三位正整数,\\n\ scanf(\ //* 输入一个数 *//

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 int main() { int x,y,z,sum; //*定义变量*//

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 void main() { long int a; int n,b,c,d,e,f; printf(\请输入一个整数(0~99999):\

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 int main() { int data1,data2,c; //定义变量// double d; char op; scanf(\%c\//输入运算数和运算符// if(op=='+') //进行判断// { c=data1+data2; printf(\ } else

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 #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 #include char source_str[1024]; char del_str[1024]; char dest_str[1024];

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 struct tian { int year; int month; int day;};

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 #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 int main() { double x,s,y;

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 int main() { char str[500]={0},hash[256]={0}; int i; scanf(\ for(i=0;str[i]!='\\0';i++) hash[str[i]]=1; for(i=0;i!=256;i++) if(hash[i]==1) printf(\ printf(\ scanf(\}

作业七:

选择题 # 题目

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 #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 main() {

int a[] = {1,2,3,4,5,6}; int *p; p=a;

printf(\ printf(\ printf(\ printf(\ p+=3;

printf(\}

2. 以下程序的运行结果是 10 x #include struct n { int x; char c; };

void func(struct n b) {

b.x = 20; b.c= ’y’; }

main() {

struct n a = {10, ’x’}; func(a);

printf (\}

3. 以下程序的运行结果是6,9

#include void main() {

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 main() {

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.00010.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 double fun(double x) {

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 #include main()

{ 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 main()

{ 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 main()

{ 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 void sort(int *x,int n) {

int i,j,k,t;

for(i=0;i

for(j=i+1;jx[k]) k=j; if(k!=i) {

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 #include #include main()

{ 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 void fun(int a[],int n) {int i,j,t;

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 double countpi(double eps) /*eps为允许误差*/ {

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

联系客服:779662525#qq.com(#替换为@)