300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > c语言期末考试复习题

c语言期末考试复习题

时间:2020-05-11 03:42:39

相关推荐

c语言期末考试复习题

单项选择题

1.(A)是构成C语言程序的基本单位。

A、函数B、过程C、子程序D、子例程

2.C语言程序从C开始执行。

A) 程序中第一条可执行语句 B) 程序中第一个函数

C) 程序中的main函数 D) 包含文件中的第一个函数

3、以下说法中正确的是(C)。

A、C语言程序总是从第一个定义的函数开始执行

B、在C语言程序中,要调用的函数必须在main( )函数中定义

C、C语言程序总是从main( )函数开始执行

D、C语言程序中的main( )函数必须放在程序的开始部分

4.下列关于C语言的说法错误的是(B)。

A) C程序的工作过程是编辑、编译、连接、运行

B) C语言不区分大小写。

C) C程序的三种基本结构是顺序、选择、循环

D) C程序从main函数开始执行

5.下列正确的标识符是(C)。

A.-a1 B.a[i] C.a2_i D.int t

5~8题为相同类型题

考点:标识符的命名规则

只能由字母、数字、下划线构成数字不能作为标识符的开头关键字不能作为标识符

选项A中的“-” ,选项B中“[”与“]”不满足(1);选项D中的int为关键字,不满足(3)

6.下列C语言用户标识符中合法的是(B)。

A)3ax B)x C)case D)-e2 E)union

选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D中的“-”不满足(1);

7.下列四组选项中,正确的C语言标识符是(C)。

A)%x B)a+b C)a123 D)123

选项A中的“%” ,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2)

8、下列四组字符串中都可以用作C语言程序中的标识符的是(A)。

A、print _3d db8 aBc B、I\am one_half start$it 3pai

C、str_1 Cpp pow while D、Pxq My->book line# His.age

选项B中的“\”,”$” ,选项D中“>”,”#”,”.”,”-”不满足(1);选项C中的while为关键字,不满足(3)

9.C语言中的简单数据类型包括(D)。

A、整型、实型、逻辑型B、整型、实型、逻辑型、字符型

C、整型、字符型、逻辑型D、整型、实型、字符型

10.在C语言程序中,表达式5%2的结果是C。

A)2.5 B)2 C)1 D)3

详见教材P52~53.

%为求余运算符,该运算符只能对整型数据进行运算。且符号与被模数相同。5%2=1;5%(-2)=1;(-5)%2=-1;(-5)%(-2)=-1;

/为求商运算符,该运算符能够对整型、字符、浮点等类型的数据进行运算,5/2=2

11.如果int a=3,b=4;则条件表达式"a<b? a:b"的值是__A__。

A) 3 B) 4 C) 0 D) 1

详见教材P97.

表达式1?表达式2:表达式3

先计算表达式1,

若表达式1成立,则选择计算表达式2,并表达式2的值作为整个大表达式的值;

若表达式1不成立,则选择计算表达式3,并将表达式3的值作为整个大表达式的值

此题中的a<b相当于表达式1,a相当于表达式2,b相当于表达式3.

a为3,b为4。a<b表达式1成立,因此计算表达式2,并将表达式2的值即a中的值,并作为整个表达式的值,因此整个表达式的值为3

12.若int x=2,y=3,z=4 则表达式x<z?y:z的结果是( B).

A)4 B)3 C)2 D)0 E)1

13.C语言中,关系表达式和逻辑表达式的值是(B)。

A) 0 B) 0或1 C) 1 D) ‘T’或’F’

14. 下面( D)表达式的值为4.

A) 11/3 B) 11.0/3

C) (float)11/3 D) (int)(11.0/3+0.5)

14~16题为同一类型

详见教材P54~56.

(1)相同数据类型的元素进行数学运算(+、-、*、/)得到结果还保持原数据类型。

(2)不同数据类型的元素进行数学运算,先要统一数据类型,统一的标准是低精度类型转换为高精度的数据类型。

选项A,11与3为两个整数,11/3结果的数据类型也应为整数,因此将3.666666的小数部分全部舍掉,仅保留整数,因此11/3=3.

选项B,11.0为实数,3为整数,因此首先要统一数据类型,将整型数据3转换为3.0,转换后数据类型统一为实型数据,选项B变为11.0/3.0,结果的数据类型也应为实型数据,因此选项B 11.0 /3=3.666666

选项C,先将整数11强制类型转换,转换为实型11.0,因此选项C变为11.0/3,其后计算过程、结果与选项B同

选项D,首先计算11.0/3,其计算过程、结果与选项B同,得到3.666666;再计算3.666666+0.5=4.166666,最后将4.166666强制类型转换为整型,即将其小数部分全部舍掉,结果为4

15.设整型变量a=2,则执行下列语句后,浮点型变量b的值不为0.5的是(B)

A.b=1.0/a B.b=(float)(1/a)

C.b=1/(float)a D.b=1/(a*1.0)

16. 若“int n; float f=13.8;”,则执行“n=(int)f%3”后,n的值是(A)

A.1 B.4 C.4.333333 D.4.6

“(int)f“表示将f中的值强制类型转换为整型,即将13.8的小数部分舍掉,转换为13;然后计算13%3,结果为1,再将结果赋给变量n,因此n的值为1

17. 以下对一维数组a的正确说明是:D

char a(10); B) int a[];

C)int k=5,a[k];D)char a[3]={‘a’,’b’,’c’};

详见教材P143~144,一维数组的定义、初始化

类型符数组名[常量表达式]

类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;常量表达式是指数组的长度(数组中包含元素的个数),其值只能是整数,不可以是变量,而且从1开始计数。

选项A,常量表达式只能放在中括号[ ]中

选项B,只有在对数组初始化(即赋值)的时候才可以省略数组的长度,B中并未对a进行初始化。

选项C,常量表达式不能为变量。

18.以下能对一维数组a进行初始化的语句是: ( C)

A. int a[5]=(0,1,2,3,4,) B. int a(5)={}

C. int a[3]={0,1,2} D. int a{5}={10*1}

详见教材P145,一维数组的定义、初始化

选项B,D,常量表达式只能放在中括号[ ]中

选项A,数组可以看做是若干个相同数据类型元素的有序集合,因此以集合的形式对其初始化,使用{ }对其初始化,选项A用了().

19.在C语言中对一维整型数组的正确定义为D。

A)int a(10); B)int n=10,a[n];

C)int n;a[n]; D)#define N 10

int a[N];

20、已知:int a[10]; 则对a数组元素的正确引用是(D )。

A、a[10] B、a[3.5] C、a(5) D、a[0]

详见教材P144,数组元素的引用

数组名[下标]

引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数

int a[10]表示定义了一个包含10个整型数据的数组a,数组元素的逻辑地址下标范围为0~9,即a[0] 表示组中第1个元素; a[1] 表示组中第2个元素; a[2] 表示组中第3个元素; ......;a[9] 表示组中第10个元素.

选项A,超过了数组a的逻辑地址下标范围;

选项B,逻辑地址下标只能为整数

选项C,逻辑地址下标只能放在[ ]中

21.若有以下数组说明,则i=10;a[a[i]]元素数值是(C)。

int a[12]={1,4,7,10,2,5,8,11,3,6,9,12};

A.10 B.9 C.6 D.5

先算a[a[i]]内层的a[i],由于i=10,因此a[i]即a[10].

a[10]对应下面数组中的元素为9. 因此a[a[i]]即为a[9]

a[9]对应下面数组中的元素为6. 因此a[9]即为6

22.若有说明:int a[][3]={{1,2,3},{4,5},{6,7}}; 则数组a的第一维的大小为: ( B)

A. 2 B. 3 C. 4 D.无确定值

5 7 D) 3 6 9

二维数组的一维大小,即指二维数组的行数,在本题中,按行对二维数组赋值,因此内层有几个大括号,数组就有几行

23.对二维数组的正确定义是(C)

详见教材P149~152,二维数组的定义、初始化

类型符数组名[常量表达式][常量表达式]

二维数组可以看做是矩阵

类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;第一个常量表达式是指数组的行数;第二个常量表达式是指数组的列数;常量表达式的值只能是整数,不可以是变量,而且从1开始计数。

一维数组初始化时可以省略数组长度

二维数组初始化时可以省略行数,但不能省略列数

选项A,B,都省略了列数

选项D,不符合二维数组定义的一般形式,行、列常量表达式应该放在不同的[]中

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};

24.已知int a[3][4];则对数组元素引用正确的是__C___

A)a[2][4] B)a[1,3] C)a[2][0] D)a(2)(1)

详见教材P150,数组元素的引用

数组名[下标] [下标]

引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数

第一个[下标]表示行逻辑地址下标,第二个[下标]表示列逻辑地址下标。

本题图示详见P149图6.7

因此a的行逻辑地址范围0~2;a的列逻辑地址范围0~3;

选项A,列逻辑地址下标超过范围

选项B,D,的引用形式不正确。

25.C语言中函数返回值的类型是由A决定的.

A)函数定义时指定的类型B) return语句中的表达式类型

C) 调用该函数时的实参的数据类型D) 形参的数据类型

26. 在C语言中,函数的数据类型是指( A)

A 函数返回值的数据类型B. 函数形参的数据类型

C 调用该函数时的实参的数据类型D.任意指定的数据类型

27. 在函数调用时,以下说法正确的是(B)

A.函数调用后必须带回返回值

B.实际参数和形式参数可以同名

C.函数间的数据传递不可以使用全局变量

D.主调函数和被调函数总是在同一个文件里

28. 在C语言中,表示静态存储类别的关键字是: (C)

A) auto B) register C) static D) extern

29.未指定存储类别的变量,其隐含的存储类别为(A)。

A)auto B)static C)extern D)register

30. 若有以下说明语句:

struct student

{ int num;

char name[ ];

float score;

}stu;

则下面的叙述不正确的是: ( D)

A. struct是结构体类型的关键字

B. struct student 是用户定义的结构体类型

C. num, score都是结构体成员名

D. stu是用户定义的结构体类型名

31.若有以下说明语句:

struct date

{ int year;

int month;

int day;

}brithday;

则下面的叙述不正确的是__C___.

A) struct是声明结构体类型时用的关键字

B) struct date 是用户定义的结构体类型名

C) brithday是用户定义的结构体类型名

D) year,day 都是结构体成员名

32. 以下对结构变量stul中成员age的非法引用是B

struct student

{ int age;

int num;

}stu1,*p;

p=&stu1;

A) stu1.age B) student.age C) p->age D) (*p).age

33.设有如下定义:

struck sk

{ int a;

float b;

}data;

int *p;

若要使P指向data中的a域,正确的赋值语句是C

A) p=&a; B) p=data.a; C) p=&data.a; D)*p=data.a;

34.设有以下说明语句:

typedef struct stu

{ int a;

float b;

} stutype;

则下面叙述中错误的是(D)。

A、struct是结构类型的关键字

B、struct stu是用户定义的结构类型

C、a和b都是结构成员名

D、stutype是用户定义的结构体变量名

35.语句int *p;说明了C。

A)p是指向一维数组的指针

B)p是指向函数的指针,该函数返回一int型数据

C)p是指向int型数据的指针// 指针的定义教材P223

D)p是函数名,该函数返回一指向int型数据的指针

36.下列不正确的定义是(A)。

int *p=&i,i; B.int *p,i;

C.int i,*p=&i; D.int i,*p;

选项A先定义一个整型指针变量p,然后将变量i的地址赋给p。然而此时还未定义变量i因此编译器无法获得变量i的地址。(A与C对比,选项C先定义变量i,则在内存中为i分配空间,因此i在内存空间的地址就可以确定了;然后再定义p,此时可以为p赋i的地址,C正确)

37. 若有说明:int n=2,*p=&n,*q=p,则以下非法的赋值语句是: ( D)

A)p=q B)*p=*q C)n=*q D)p=n

p,q同为整型指针变量,二者里面仅能存放整型变量的地址。

选项A,q中为地址,因此可将此地址赋给p

选项B,*p表示p所指向对象n的内容,即一个整数;*q表示q所指向对象的内容,由于在定义q时为其初始化,将p中n的地址给q,因此p中存放n的地址,*q表示q所指向对象n的内容.因此*p=*q 相当于n=n;

选项C,n=*q 等价于n=n;

选项D,p中只能存放地址,不能将n中的整数值赋给p

38.有语句:int a[10],;则B是对指针变量p的正确定义和初始化。

A)int p=*a; B)int *p=a; C)int p=&a; D)int *p=&a;

选项A,a是数组名,不是指针变量名,因此不可用*标注数组名a

选项C,a是数组名,数组名就是地址,无需再用地址符号。而且在定义指针变量p时,应在变量名前加*,标明p是指针变量

选项D,a是数组名,数组名就是地址,无需再用地址符号。

39.若有说明语句“int a[5],*p=a;”,则对数组元素的正确引用是( C)。

A.a[p] B.p[a] C.*(p+2) D.p+2

首先定义一个整型数组a,a的长度为5,然后定义一个指针变量p,并同时对p进行初始化,将数组a的地址赋给p。因此此时p中存放的数组a的首地址,即数组中第一个元素a[0]的地址。

对于数组元素下标的引用(详见p144), 一般形式数组名[下标] 其中下标为逻辑地址下标,从0开始计数,方括号中的下标可以是变量,可以是表达式,但结果一定要是整数。

选项A,p中存放的是地址,不是整数,不能做数组元素的下标

选项B,a是数组名,数组名就是地址,不是整数,不能做数组元素的下标

选项C,(重点!!!详见p231~234) p+2表示指向同一数组中的下两个元素的地址,当前p指向a[0],则p+2表示a[2]的地址,因此*(p+2)表示a[2]的内容

40. 有如下程序

int a[10]={1,2,3,4,5,6,7,8,9,10},*P=a;

则数值为9的表达式是B

A) *P+9 B) *(P+8) C) *P+=9 D) P+8

(重点!!!详见p231~234)

首先定义一个整型数组a,a的长度为5,然后定义一个指针变量P,并同时对P进行初始化,将数组a的地址赋给P。因此此时P中存放的数组a的首地址,即数组中第一个元素a[0]的地址。

数组中9对应的是a[8], 选项B,P+8表示数组中后8个元素的地址,即a[8]的地址。*(P+8)则表示该地址内所存放的内容,即a[8]的值。

选项A,*P表示P所指向对象的内容,此时P指向a[0], *P即a[0]的值1. *P+9=1+9=10

选项C,*P表示P所指向对象的内容,此时P指向a[0], *P即a[0]的值。因此*P+=9 即*P =*P+9, 等价于a[0]=a[0]+9.

选项D,P+8表示数组中后8个元素的地址,即a[8]的地址,而非a[8]中的值。

41. 在C语言中,以D作为字符串结束标志

A)’\n’ B)’ ’ C) ’0’ D)’\0’

42.下列数据中属于“字符串常量”的是( A)。

A.“a” B.{ABC} C.‘abc\0’ D.‘a’

若干个字符构成字符串

在C语言中,用单引号标识字符;用双引号标识字符串

选项B,C,分别用{}和’’标识字符串

选项D,标识字符。

43.已知char x[]="hello", y[]={'h','e','a','b','e'};, 则关于两个数组长度的正确描述是B.

A)相同B)x大于y C)x小于y D)以上答案都不对

C语言中,字符串后面需要一个结束标志位'\0',通常系统会自动添加。

对一维数组初始化时可采用字符串的形式(例如本题数组x),也可采用字符集合的形式(例如本题数组y)。在以字符串形式初始化时,数组x不尽要存储字符串中的字符,还要存储字符串后的结束标志位,因此数组x的长度为6;在以字符集合形式初始化时,数组y,仅存储集合中的元素,因此数组y长度为5

读程序

基本输入输出及流程控制

1.

#include <stdio.h>

main()

{ int a=1,b=3,c=5;

if (c==a+b)

printf("yes\n");

else

printf("no\n");

}

运行结果为:no

详见教材p89选择结构

详见教材p91关系符号

详见附录D p378符号的优先级

==表示判断符号两边的值是否相等;=表示将符号右边的值赋给左边的变量

本题考点是选择结构3种基本形式的第二种

选择结构三种一般形式中的“语句”皆为复合语句,复合语句要用{ }括起来,只有当复合语句中只包括一条语句时可以省略{ },此题即如此,因此两个printf操作没有加{ }

若c==a+b成立,则执行printf("yes\n");

否则(即c==a+b不成立),执行printf("no\n");

+的优先级高于==,因此先算a+b,值为4,表达式5==4不成立,因此执行printf("no\n");即输出字符串no

2.

#include <stdio.h>

main()

{ int a=12, b= -34, c=56, min=0;

min=a;

if(min>b)

min=b;

if(min>c)

min=c;

printf("min=%d", min);

}

运行结果为min=-34

详见教材p89选择结构

本题考点是选择结构3种基本形式的第一种

一共包含了两个选择结构(两个if语句)

定义变量,并赋值此时a=12, b= -34, c=56, min=0

a中值拷贝,赋给min,覆盖了min中的0,此时min中的值被更新为12

min>b成立,则执行min=b;

min>c成立,则执行min=c;

输出min中的值

12大于-34,第一个if语句的表达式成立,因此执行min=b;执行后min中的值被更新为-34.

-34小于56,第二个if语句的表达式不成立,因此不执行min=c;

最后输出min中的值,为-34.

3.

#include <stdio.h>

main()

{ int x=2,y= -1,z=5;

if(x<y)

if(y<0)

z=0;

else

z=z+1;

printf(“%d\n”,z);

}

运行结果为5

遇到选择结构,首先要明确条件表达式成立时执行哪些操作。本题中,第一个if语句,其后的复合语句没有大括号{ },说明复合语句中只包含一条语句,进而省略了{ }。内层的if...else...是选择结构的第二种基本形式,在结构上视为一条语句。因此内层的if...else...作为第一个if语句的复合语句。

若表达式x<y成立,则继续判断

y<0,则执行z=0;

否则(即y>=0,执行z=z+1;

输出z

2>-1,表达式x<y不成立,因此不执行内层的if…else….进而z中的值没有被改变。

输出z中的值为5

4.

#include <stdio.h>

main()

{ float a,b,c,t;

a=3;

b=7;

c=1;

if(a>b)

{t=a;a=b;b=t;}

if(a>c)

{t=a;a=c;c=t;}

if(b>c)

{t=b;b=c;c=t;}

printf("%5.2f,%5.2f,%5.2f",a,b,c);

}

运行结果为:1.00, 2.00, 7.00

详见教材p72数据的输出形式

本题包含了3个if语句,每个if语句后的{ }都不可省略,因为每个{ }中都包含了多条语句

若表达式a>b成立,则执行{t=a;a=b;b=t;}

若表达式a>c成立,则执行{t=a;a=c;c=t;}

若表达式b>c成立,则执行{t=b;b=c;c=t;}

输出a,b,c中的值,要求输出的每个数据宽度为5个空格,小数部分保留2位,数据右对齐

3小于7,因此表达式a>b不成立,因此不执行{t=a;a=b;b=t;}

3大于1,因此表达式a>c成立,则执行{t=a;a=b;b=t;}。第一句,将a中的3拷贝,粘贴到t中;第二句,将c中的1拷贝,粘贴到a中,覆盖掉先前的3;第三句。将t中的3拷贝到c中,覆盖掉c中先前的1. 执行完复合语句后实现了a,c元素的值的互换,a为1,c为3,t为3,。

7大于c中的3,因此b>c成立,执行则执行{t=b;b=c;c=t;},过程同上,执行后b为3,c为7,t为7

此时输出a,b,c中的值为1.00, 2.00, 7.00

5

#include < stdio .h >

main ( )

{ float c=3.0 , d=4.0;

if ( c>d ) c=5.0;

else

if ( c==d ) c=6.0;

else c=7.0;

printf ( “%.1f\n”,c ) ;

}

运行结果为7.0

此题为if...else...语句的嵌套,第二if...else...作为第一个if...else...语句else部分的复合语句。

若表达式c>d成立,则执行c=5.0;

否则(表达式c>d不成立)

若表达式c==d成立,则执行c=6.0;

否则,执行c=7.0;

输出c中的值

3.0小于4.0,因此表达式c>d不成立,执行第二个if…else…。

3.0不等于4.0,因此表达式c==d不成立,执行c=7.0,将7.0赋给c, 覆盖掉c中的3.0,此时c中的值为7.0

输出此时的c中的值

6.

#include <stdio.h>

main()

{int m;

scanf("%d", &m);

if (m >= 0)

{if (m%2 == 0)printf("%d is a positive even\n", m);

elseprintf("%d is a positive odd\n", m);}

else

{if (m % 2 == 0) printf("%d is a negative even\n", m);

elseprintf("%d is a negative odd\n", m);}

}

若键入-9,则运行结果为:-9 is a negative odd

7.

#include <stdio.h>

main()

{ int num=0

while(num<=2){ num++printf("%d\n",num)}

}

运行结果为:

1

2

3

详见教材p115循环结构

当循环条件num<=2成立的时候,执行循环体{ num++;printf("%d\n",num);}中的语句。

循环初值num为0;

循环条件num<=2成立

第1次循环:执行num++;即将num中的值加1,执行后num为1;

执行printf("%d\n",num);在屏幕上输出num中的值,即输出1,之后换行

此时num中的值为1,循环条件num<=2成立

第2此循环:执行num++;即将num中的值加1,执行后num为2;

执行printf("%d\n",num);在屏幕上输出num中的值,即输出2,之后换行

此时num中的值为2,循环条件num<=2成立

第3此循环:执行num++;即将num中的值加1,执行后num为3;

执行printf("%d\n",num);在屏幕上输出num中的值,即输出3,之后换行

此时num中的值为3,循环条件num<=2不成立,结束循环。

8

#include <stdio.h>

main( )

{int sum=10,n=1;

while(n<3) {sum=sum-n; n++; }

printf(“%d,%d”,n,sum);

}

运行结果为:3,7

当循环条件n<3成立的时候,执行循环体{sum=sum-n; n++; }中的语句。

循环初值sum为10,n为1;

循环条件n<3成立

第1次循环:执行sum=sum-n=10-1=9;

执行n++,即将n中的值加1,执行后n为2;

此时n中的值为2,sum中的值为9,循环条件n<3成立,继续执行循环

第2次循环:执行sum=sum-n=9-2=7;

执行n++,即将n中的值加1,执行后n为3;

输出此时n,sum中的值,即为3,7。需要注意,在printf(“%d,%d”,n,sum); 中要求输出的数据彼此间用逗号间隔,因此结果的两个数据间一定要有逗号

9.

#include <stdio.h>

main()

{ int num,c;

scanf("%d",&num);

do {c=num%10; printf("%d",c); }while((num/=10)>0);

printf("\n");

}

从键盘输入23,则运行结果为:32

详见教材p117循环结构;p60复合的赋值运算符

do{ }while(表达式);

先无条件执行循环体,再判断循环条件。注意while(表达式)后有分号

定义整型变量num,c;

为num赋一个整型值;

执行{c=num%10; printf("%d",c); }直到循环条件(num/=10)>0不成立;

输出换行

已知为num赋值23

第1次执行循环体

执行c=num%10=23%10=3;

执行printf("%d",c);输出3

判断循环条件num/=10等价于num=num/10; 因此num=23/10=2, 2大于0,因此循环条件(num/=10)>0成立,继续执行循环体。执行完第1次循环时,num为2,c为3

第2次执行循环体

执行c=2%10=2;

执行printf("%d",c);再输出2

判断循环条件num=2/10=0,0等于0,因此循环条件(num/=10)>0不成立。结束循环

10

#include <stdio.h>

main()

{ int s=0,a=5,n;

scanf("%d",&n);

do { s+=1; a=a-2; }while(a!=n);

printf("%d%d\n",s,a);

}

若输入的值1,运行结果为:2,1

详见教材p117循环结构;p60复合的赋值运算符

执行{ s+=1; a=a-2; }直到循环条件a!=n不成立;

已知为n赋值1,s为0,a为5

第1次执行循环体

执行s+=1;等价于s=s+1=0+1

执行a=a-2; a=5-2=3

判断循环条件,3不等于1,因此循环条件a!=n成立,继续执行循环体。

执行完第1次循环时,s为1,a为3

第2次执行循环体

执行s+=1;等价于s=s+1=1+1=2

执行a=a-2; a=3-2=1

判断循环条件,1等于1,因此循环条件a!=n不成立,结束循环。

执行完第2次循环时,s为2,a为1

输出此时s,a中的值,结果为2,1

11

#include "stdio.h"

main()

{char c;

c=getchar();

while(c!='?') {putchar(c); c=getchar(); }

}

如果从键盘输入abcdefgh(回车)

运行结果为:abcde

12

#include <stdio.h>

main()

{ char c;

while((c=getchar())!=’$’)

{ if(‘A’<=c&&c<=‘Z’) putchar(c);

else if(‘a’<=c&&c<=‘z’) putchar(c-32); }

}

当输入为ab*AB%cd#CD$时,运行结果为:ABABCDCD

13.

#include <stdio.h>

main()

{ int x, y =0;

for(x=1;x<=10;x++)

{ if(y>=10)

break;

y=y+x;

}

printf(“%d %d”,y,x);

}

运行结果为10 5

详见教材p120 for语句

详见教材p126~128 breakcontinue语句

for(表达式1;表达式2;表达式3)

{

}

(1)先求解表达式1

(2)求解表达式2,若其值为真,执行循环体,然后执行(3).若为假,则结束循环,转到(5)

(3)求解表达式3

(4)转回上面(2)继续执行

(5)循环结束,执行for语句下面的一个语句

break,跳出循环体;continue,结束本次循环(第i次循环),继续执行下一次循环(i+1次循环)

此题表达式1为x=1,表达式2(循环条件)为x<=10,表达式3为x++

初值x为1,y为0,循环条件(即表达式2)x<=10成立,进入循环体

第1次循环

执行if语句。0小于10,if语句的条件表达式不成立,不执行break;

执行y=y+x; y=0+1=1

转向表达式3,执行x++, x=x+1=1+1=2。循环条件x<=10成立,进入第2次循环

第2次循环

执行if语句。1小于10,if语句的条件表达式不成立,不执行break;

执行y=y+x; y=1+2=3

转向表达式3,执行x++, x=x+1=2+1=3。循环条件x<=10成立,进入第3次循环

第3次循环

执行if语句。3小于10,if语句的条件表达式不成立,不执行break;

执行y=y+x; y=3+3=6

转向表达式3,执行x++, x=x+1=3+1=4。循环条件x<=10成立,进入第4次循环

第4次循环

执行if语句。6小于10,if语句的条件表达式不成立,不执行break;

执行y=y+x; y=6+4=10

转向表达式3,执行x++, x=x+1=4+1=5。循环条件x<=10成立,进入第5次循环

第5次循环

执行if语句。10等于10,if语句的条件表达式成立,执行break,跳出循环。

从break跳出至for语句的下一条语句。执行printf(“%d %d”,y,x);

输出当前的y与x.结果为10 5

14.

#include<stdio.h>

main( )

{ char ch;

ch=getchar( );

switch(ch)

{ case ‘A’ : printf(“%c”,’A’);

case ‘B’ : printf(“%c”,’B’); break;

default: printf(“%s\n”,”other”);

} }

当从键盘输入字母A时,运行结果为:AB

详见教材p103switch语句

switch(表达式)

{case常量1:语句1

case常量2:语句2

case常量n:语句n

default :语句n+1

}

其中表达式,常量1,常量n都为整型或字符型

case相当于给出执行程序的入口和起始位置,若找到匹配的常量,则从此处开始往下执行程序,不再匹配常量,直至遇到breakswitch结束

本题过程:

首先从键盘接收一个字符’A’并将其放在变量ch中。

执行switch语句。Switch后面的条件表达式为ch,因此表达式的值即为字符’A’. 用字符’A’依次与下面的case中的常量匹配。

与第1个case后的常量匹配,则从其后的语句开始往下执行程序(在执行过程中不再进行匹配。)因此先执行printf(“%c”,’A’),屏幕上输出A;再往下继续执行printf(“%c”,’B’),屏幕上输出B;再继续执行break,此时跳出switch语句。

15.

#include <stdio.h>

main( )

{ int a=1,b=0

scanf(“%d”,&a);

switch(a)

{ case 1: b=1break

case 2: b=2break

default : b=10}

printf("%d ", b)

}

若键盘输入5运行结果为:10

本题过程:

首先用scanf函数为变量a赋值为5。

执行switch语句。switch后面的条件表达式为a,因此表达式的值即为5. 用5依次与下面case中的常量匹配。没有找到匹配的常量,因此两个case后的语句都不执行。执行default后面的语句b=10;将10赋给变量b。

输出变量b,结果为10

16.

#include <stdio.h>

main()_

{ char grade=’C’;

switch(grade)

{

case ‘A’: printf(“90-100\n”);

case ‘B’: printf(“80-90\n”);

case ‘C’: printf(“70-80\n”);

case ‘D’: printf(“60-70\n”); break;

case ‘E’: printf(“<60\n”);

default : printf(“error!\n”);

}

}

运行结果为

70-80

60-70

本题过程:

首先从键盘接收一个字符’C’并将其放在变量grade中。

执行switch语句。switch后面的条件表达式为grade,因此表达式的值即为字符’C’. 用字符’C’依次与下面的case中的常量匹配。

与第3个case后的常量匹配,则从其后的语句开始往下执行程序(在执行过程中不再进行匹配。)因此先执行printf(“70-80\n”);,屏幕上输出70-80,并换行;再往下继续执行printf(“60-70\n”),屏幕上输出60-70,并换行;再继续执行break,此时跳出switch语句。

17.

#include <stdio.h>

main()

{ int y=9;

for(;y>0;y- -)

if(y%3==0)

{ printf(%d”,- -y);

}

}

运行结果为

852

详见教材p53,自增自减符号

此题表达式1被省略,表达式2(循环条件)为y>0,表达式3为y--

初值y为9,循环条件(即表达式2)y>0成立,进入循环体

第1次循环

执行if语句。9%3==0,if语句的条件表达式成立,执行printf(%d”,- -y),即y先自减1变为8,然后在输出,因此屏幕上输出8

转向表达式3,执行y--, y=y-1=8-1=7。循环条件y>0成立,进入第2次循环

第2次循环

执行if语句。7%3不为0,if语句的条件表达式不成立,不执行printf(%d”,- -y)

转向表达式3,执行y--, y=y-1=7-1=6。循环条件y>0成立,进入第3次循环

第3次循环

执行if语句。6%3==0,if语句的条件表达式成立,执行printf(%d”,- -y),即y先自减1变为5,然后在输出,因此屏幕上输出5

转向表达式3,执行y--, y=y-1=5-1=4。循环条件y>0成立,进入第4次循环

第4次循环

执行if语句。4%3不为0,if语句的条件表达式不成立,不执行printf(%d”,- -y)

转向表达式3,执行y--, y=4-1=3。循环条件y>0成立,进入第5次循环

第5次循环

执行if语句。3%3==0,if语句的条件表达式成立,执行printf(%d”,- -y),即y先自减1变为2,然后在输出,因此屏幕上输出2

转向表达式3,执行y--, y=y-1=2-1=1。循环条件y>0成立,进入第5次循环

第6次循环

执行if语句。1%3不为0,if语句的条件表达式不成立,不执行printf(%d”,- -y)

转向表达式3,执行y--, y=1-1=0。循环条件y>0不成立,循环结束。

18.

#include <stdio.h>

main()

{ int i,sum=0; i=1;

do{ sum=sum+i; i++; }while(i<=10);

printf(“%d”,sum);

}

运行结果为55

19.

#include <stdio.h>

#define N 4

main()

{ int i;

int x1=1,x2=2;

printf("\n");

for(i=1;i<=N;i++)

{ printf("%4d%4d",x1,x2);

if(i%2==0)

printf("\n");

x1=x1+x2;

x2=x2+x1;

}

}

运行结果为

1 2 3 5

8 13 21 34

此题首先为整型变量赋初值x1=1,x2=2

表达式1为i=1,表达式2(循环条件)为i<=N即i<=4,表达式3为i++

循环变量初值i为1,循环条件(即表达式2)i<=4成立,进入第1次循环

第1次循环

执行printf("%4d%4d",x1,x2);因此屏幕上输出1 2

执行if语句。1%2不为0,if语句的条件表达式不成立,不执行printf("\n");

执行x1=x1+x2=1+2=3;此时x1中的值已变为3

执行x2=x2+x1=2+3=5。

转向表达式3,执行i++, i为2。循环条件i<=4成立,进入第2次循环

第2次循环

执行printf("%4d%4d",x1,x2);因此屏幕上输出3 5

执行if语句。2%2==0,if语句的条件表达式成立,执行printf("\n");换行

执行x1=x1+x2=3+5=8;此时x1中的值已变为8

执行x2=x2+x1=5+8=13。

转向表达式3,执行i++, i为3。循环条件i<=4成立,进入第3次循环

第3次循环

执行printf("%4d%4d",x1,x2);因此屏幕上输出8 13

执行if语句。3%2不为0,if语句的条件表达式不成立,不执行printf("\n");

执行x1=x1+x2=8+13=21;此时x1中的值已变为21

执行x2=x2+x1=21+13=34。

转向表达式3,执行i++, i为4。循环条件i<=4成立,进入第4次循环

第2次循环

执行printf("%4d%4d",x1,x2);因此屏幕上输出21 34

执行if语句。4%2==0,if语句的条件表达式成立,执行printf("\n");换行

执行x1=x1+x2=21+34=55;此时x1中的值已变为55

执行x2=x2+x1=34+55=89。

转向表达式3,执行i++, i为5。循环条件i<=4不成立,结束循环

20

#include <stdio.h>

main( )

{ int x, y;

for(x=30, y=0; x>=10, y<10; x--, y++)

x/=2, y+=2;

printf(“x=%d,y=%d\n”,x,y);

}

运行结果为

x=0,y=12

21.

#include <stdio.h>

#define N 4

main( )

{ int i,j;

for(i=1;i<=N;i++)

{ for(j=1;j<i;j++)

printf(" ");

printf("*");

printf("\n");

}}

运行结果为:

*

*

*

*

详见教材P41符号常量

用宏处理指令定义符号常量N为4,在编译过程中,遇到N即视为整数4。

外层for循环,表达式1为i=1,表达式2(循环条件)为i<=N,表达式3为i++

内层for循环,表达式1为j=1,表达式2(循环条件)为j<i,表达式3为j++

首先计算外层循环的表达式1,i为1,使得循环条件i<=4成立,进入外层for循环体

外层for循环第1次此时i为1

内层循环j=1,使得循环条件j<i不成立,因此不执行内层循环体(不输出空格)

执行printf("*");

执行printf("\n");换行

至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为2. 使得循环条件i<=4

成立,再次进入外层for循环体

外层for循环第2次此时i为2

内层循环j=1,使得循环条件j<i成立

第1次执行内层循环体printf(" ");

执行内层循环表达式3,j++为2,j<i不成立,跳出内层循环

执行printf("*");

执行printf("\n");换行

至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为3. 使得循环条件i<=4

成立,进入外层for循环体

外层for循环第3次此时i为3

内层循环j=1,使得循环条件j<i成立

第1次执行内层循环体printf(" ");

执行内层循环表达式3,j++为2,j<i成立,再次执行内层循环

第2次执行内层循环体printf(" ");

执行内层循环表达式3,j++为3,j<i不成立,跳出内层循环

执行printf("*");

执行printf("\n");换行

至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为4. 使得循环条件i<=4

成立,进入外层for循环体

外层for循环第4次此时i为4

内层循环j=1,使得循环条件j<i成立

第1次执行内层循环体printf(" ");

执行内层循环表达式3,j++为2,j<i成立,再次执行内层循环

第2次执行内层循环体printf(" ");

执行内层循环表达式3,j++为3,j<i成立,再次执行内层循环

第3次执行内层循环体printf(" ");

执行内层循环表达式3,j++为4,j<i不成立,跳出内层循环

执行printf("*");

执行printf("\n");换行

至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为5. 使得循环条件i<=4

不成立,跳出外层for循环体

数组

1.

#include <stdio.h>

main()

{ int i, a[10];

for(i=9;i>=0;i--)

a[i]=10-i;

printf(“%d%d%d”,a[2],a[5],a[8]);

}

运行结果为:

852

详见p143-146.例题6.1一定看懂!

首先定义整型变量i,整型数组a, a的长度为10,即a中包含10个整型元素(整型变量)

执行for循环语句

初值i=9, 使得循环条件i>=0成立,执行循环体

第1次循环

执行a[i]=10-i等价于a[9]=10-9=1

计算表达式3,即i--,i为8,使得循环条件i>=0成立,继续执行循环体

第2次循环

执行a[i]=10-i等价于a[8]=10-8=2

计算表达式3,即i--,i为7,使得循环条件i>=0成立,继续执行循环体

第3次循环

执行a[i]=10-i等价于a[7]=10-7=3

计算表达式3,即i--,i为6,使得循环条件i>=0成立,继续执行循环体

第4次循环

执行a[i]=10-i等价于a[6]=10-6=4

计算表达式3,即i--,i为5,使得循环条件i>=0成立,继续执行循环体

第5次循环

执行a[i]=10-i等价于a[5]=10-5=5

计算表达式3,即i--,i为4,使得循环条件i>=0成立,继续执行循环体

第6次循环

执行a[i]=10-i等价于a[4]=10-4=6

计算表达式3,即i--,i为3,使得循环条件i>=0成立,继续执行循环体

第7次循环

执行a[i]=10-i等价于a[3]=10-3=7

计算表达式3,即i--,i为2,使得循环条件i>=0成立,继续执行循环体

第8次循环

执行a[i]=10-i等价于a[2]=10-2=8

计算表达式3,即i--,i为1,使得循环条件i>=0成立,继续执行循环体

第9次循环

执行a[i]=10-i等价于a[1]=10-1=9

计算表达式3,即i--,i为0,使得循环条件i>=0成立,继续执行循环体

第10次循环

执行a[i]=10-i等价于a[0]=10-0=10

计算表达式3,即i--,i为-1,使得循环条件i>=0不成立,跳出循环体

2.

#include <stdio.h>

main()

{ int i,a[6];

for (i=0; i<6; i++)

a[i]=i;

for (i=5; i>=0 ; i--)

printf("%3d",a[i]);

}

运行结果为:

5 4 3 2 1 0

首先定义整型变量i,整型数组a, a的长度为6,即a中包含6个整型元素(整型变量)

执行第一个for循环语句

初值i=0, 使得循环条件i<6成立,执行循环体

第1次循环

执行a[i]= i等价于a[0]=0

计算表达式3,即i++,i为1,使得循环条件i<6成立,继续执行循环体

第2次循环

执行a[i]= i等价于a[1]=1

计算表达式3,即i++,i为2,使得循环条件i<6成立,继续执行循环体

第3次循环

执行a[i]= i等价于a[2]=2

计算表达式3,即i++,i为3,使得循环条件i<6成立,继续执行循环体

第4次循环

执行a[i]= i等价于a[3]=3

计算表达式3,即i++,i为4,使得循环条件i<6成立,继续执行循环体

第5次循环

执行a[i]= i等价于a[4]=4

计算表达式3,即i++,i为5,使得循环条件i<6成立,继续执行循环体

第6次循环

执行a[i]= i等价于a[5]=5

计算表达式3,即i++,i为6,使得循环条件i<6不成立,结束循环

执行第二个for循环语句

初值i=5, 使得循环条件i>=0成立,执行循环体

第1次循环

执行printf("%3d",a[i]); 即输出a[5]的值

计算表达式3,即i--,i为4,使得循环条件i>=0成立,继续执行循环体

第2次循环

执行printf("%3d",a[i]); 即输出a[4]的值

计算表达式3,即i--,i为3,使得循环条件i>=0成立,继续执行循环体

第3次循环

执行printf("%3d",a[i]); 即输出a[3]的值

计算表达式3,即i--,i为2,使得循环条件i>=0成立,继续执行循环体

第4次循环

执行printf("%3d",a[i]); 即输出a[2]的值

计算表达式3,即i--,i为1,使得循环条件i>=0成立,继续执行循环体

第5次循环

执行printf("%3d",a[i]); 即输出a[1]的值

计算表达式3,即i--,i为0,使得循环条件i>=0成立,继续执行循环体

第6次循环

执行printf("%3d",a[i]); 即输出a[0]的值

计算表达式3,即i--,i为6,使得循环条件i>=0不成立,结束循环

3.

#include <stdio.h>

main( )

{ int i,k,a[10],p[3]

k=5

for(i=0i<10i++)

a[i]=i

for(i=0i<3i++)

p[i]=a[i*(i+1)]

for(i=0i<3i++)

k+=p[i]*2

printf("%d\n",k)

}

运行结果为21

首先定义整型变量i,k,整型数组a, a的长度为10,整型数组p, p的长度为3

k初值为5

第一个for循环语句为数组a进行初始化

执行完第一个for语句后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9 (循环过程略)

第二个for循环语句为数组p进行初始化

初值i=0, 使得循环条件i<3成立,执行循环体

第1次循环

执行p[i]=a[i*(i+1)]; 即p[0]=a[0*(0+1)]=a[0]=0

计算表达式3,即i++,i为1,使得循环条件i<3成立,继续执行循环体

第2次循环

执行p[i]=a[i*(i+1)]; 即p[1]=a[1*(1+1)]=a[2]=2

计算表达式3,即i++,i为2,使得循环条件i<3成立,继续执行循环体

第3次循环

执行p[i]=a[i*(i+1)]; 即p[2]=a[2*(2+1)]=a[6]=6

计算表达式3,即i++,i为3,使得循环条件i<3不成立,结束循环

第三个for循环语句

初值i=0, 使得循环条件i<3成立,执行循环体

第1次循环

执行k+=p[i]*2; 即k=5+p[0]*2=5+0=5

计算表达式3,即i++,i为1,使得循环条件i<3成立,继续执行循环体

第2次循环

执行k+=p[i]*2; 即k=5+p[1]*2=5+2*2=9

计算表达式3,即i++,i为2,使得循环条件i<3成立,继续执行循环体

第1次循环

执行k+=p[i]*2; 即k=9+p[2]*2=9+6*2=21

计算表达式3,即i++,i为3,使得循环条件i<3不成立,结束循环

4.

#include <stdio.h>

int m[3][3]={{1},{2},{3}};

int n[3][3]={1,2 ,3};

main( )

{ printf(“%d,”, m[1][0]+n[0][0]);

printf(“%d\n”,m[0][1]+n[1][0]);

}

运行结果为

3,0

详见教材P149~152,图6.7看懂!

首先定义整型二维数组m,m为3行,3列的二维矩阵,并对其以行的形式初始化

m[0][0]=1 m[0][1]=0 m[1][2]=0

m[1][0]=2 m[1][1]=0 m[2][2]=0

m[2][0]=3 m[2][1]=0 m[2][2]=0

定义整型二维数组n,m为3行,3列的二维矩阵

n[0][0]=1 n[0][1]=2 n[1][2]=3

n[1][0]=0 n[1][1]=0 n[2][2]=0

n[2][0]=0 n[2][1]=0 n[2][2]=0

因此 m[1][0]+n[0][0]=2+1=3

m[0][1]+n[1][0]=0+0=0

5.

#include <stdio.h>

main()

{ int i;

int x[3][3]={1,2,3,4,5,6,7,8,9};

for (i=1; i<3; i++)

printf("%d ",x[i][3-i]);

}

运行结果为

6 8

首先按存储顺序为数组x初始化

x[0][0]=1 x[0][1]=2 x[0][2]=3

x[1][0]=4 x[1][1]=5 x[1][2]=6

x[2][0]=7 x[2][1]=8 x[2][2]=9

初值i=1, 使得循环条件i<3成立,执行循环体

第1次循环

执行printf("%d ",x[i][3-i]),打印出x[i][3-i],即x[1][2]的值

计算表达式3,即i++,i为2,使得循环条件i<3成立,继续执行循环体

第2次循环

执行printf("%d ",x[i][3-i]),打印出x[i][3-i],即x[2][1]的值

计算表达式3,即i++,i为3,使得循环条件i<3成立,结束循环

6.

#include <stdio.h>

main( )

{ int n[3][3], i, j

for(i=0i<3i++ )

{for(j=0j<3j++ )

{n[i][j]=i+j

printf(“%d ”, n[i][j])

}

}

}

运行结果为

0 1 2

1 2 3

2 3 4

循环变量i为0, 循环条件i<3成立,执行循环体

外层for第1次循环相当于输出第1行

内层for循环j初值为0,循环条件j<3成立,执行循环体

内层for第1次循环

执行n[i][j]=i+j;即n[0][0]=0+0=0;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为1,j<3成立,继续执行内层循环体

内层for第2次循环

执行n[i][j]=i+j;即n[0][1]=0+1=1;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为2,j<3成立,继续执行内层循环体

内层for第3次循环

执行n[i][j]=i+j;即n[0][2]=0+2=2;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为3,j<3不成立,结束内层循环

执行printf(“\n”);

执行外层for语句的表达式3,i++,i为,1,i<3成立,继续执行外层循环体

外层for第2次循环相当于输出第2行

内层for循环j初值为0,循环条件j<3成立,执行循环体

内层for第1次循环

执行n[i][j]=i+j;即n[1][0]=1+0=1;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为1,j<3成立,继续执行内层循环体

内层for第2次循环

执行n[i][j]=i+j;即n[1][1]=1+1=2;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为2,j<3成立,继续执行内层循环体

内层for第3次循环

执行n[i][j]=i+j;即n[1][2]=1+2=3;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为3,j<3不成立,结束内层循环

执行printf(“\n”);

执行外层for语句的表达式3,i++,i为,1,i<3成立,继续执行外层循环体

外层for第2次循环相当于输出第3行

内层for循环j初值为0,循环条件j<3成立,执行循环体

内层for第1次循环

执行n[i][j]=i+j;即n[2][0]=2+0=1;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为1,j<3成立,继续执行内层循环体

内层for第2次循环

执行n[i][j]=i+j;即n[2][1]=2+1=2;

执行printf(“%d ”, n[i][j]);

执行内层循环表达式3,j++,j为2,j<3成立,继续执行内层循环体

内层for第3次循环

执行n[i][j]=i+j;即n[2][2]=2+2=3;

执行内层循环表达式3,j++,j为3,j<3不成立,结束内层循环

执行printf(“\n”);

执行外层for语句的表达式3,i++,i为,3,i<3不成立,结束外层循环

7

#include <stdio.h>

main()

{

char diamond[][5]={{‘_’,’_’,’*’},{‘_‘,’*’,’_’,’*’},

{‘*’,’_’,’_‘,’_‘,’*’},{‘_’,’*’,’_’,’*’},{‘_’,’_’,’*’}};

int i,j;

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

printf(“%c”,diamond[i][j]);

printf(“\n”);

}

}注:“_”代表一个空格。

运行结果为:

*

* *

* *

* *

*

8.

#include <stdio.h>

main( )

{ int i, f[10];

f[0]=f[1]=1;

for(i=2;i<10;i++)

f[i]=f[i-2]+f[i-1];

for(i=0;i<10;i++)

{ if(i%4==0)

printf(“\n”);

printf(“%d ”,f[i]);

}

}

运行结果为

1 1 2 3

5 8 13 21

34 55

9

#include “stdio.h”

func(int b[ ])

{ int j;

for(j=0;j<4;j++)

b[j]=j;

}

main( )

{ int a[4], i;

func(a);

for(i=0; i<4; i++)

printf(“%2d”,a[i]);

}

运行结果为:

0 1 2 3

详见教材P194

定义函数func

函数头:未定义函数的类型,则系统默认为int型。函数func的形参为整型数组名,即只接收整型数组地址。

函数体:定义整型变量j

循环变量初值(表达式1)j=0, 使得循环条件(表达式2)j<4成立,执行循环体

第1次循环

执行b[j]=j; 即b[0]=0;

执行循环变量自增(及表达式3)j++,j为1,使得j<4成立,继续执行循环体

第2次循环

b[1]=1;

j++,j为2,使得j<4成立,继续执行循环体

第3次循环

b[2]=2;

j++,j为3,使得j<4成立,继续执行循环体

第4次循环

b[3]=3;

j++,j为4,使得j<4不成立,结束循环

main函数:

定义整型变量i和数组a,其长度为4,

func(a);表示调用函数func,并以数组名a作为调用的实参(数组名在C语言中表示数组所在内存空间的首地址,在以数组名作为实参时,形参与实参公用存储空间,因此对数组b的操作,即对数组a的操作。)

10.

#include <stdio.h>

main()

{float fun(float x[])

float ave,a[3]={4.524}

ave=funa;

printf(“ave=%7.2f”,ave);

}

float funfloat x[]

{int j;

float aver=1

for (j=0;j<3;j++)

aver=x[j]*aver;

returnaver);

}

运行结果为:

ave= 36.00

11.

#include <stdio.h>

main()

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

int b[3][2],i,j;

for(i=0;i<=1;i++)

{for(j=0;j<=2;j++)

b[j][i]=a[i][j];

}

for(i=0;i<=2;i++)

{for(j=0;j<=1;j++)

printf("%5d",b[i][j]);

}

}

运行结果为

1 4 2 5 3 6

12

#include <stdio.h>

f(int b[],int n)

{int i,r;

r=1;

for (i=0;i<=n;i++)

r=r*b[i];

return (r);

}

main()

{int x,a[]={1,2,3,4,5,6,7,8,9};

x=f(a,3);

printf(“%d\n”,x);

}

运行结果为

24

13.

#include"stdio.h"

main()

{int j,k;

static int x[4][4],y[4][4];

for(j=0;j<4;j++)

for(k=j;k<4;k++)

x[j][k]=j+k;

for(j=0;j<4;j++)

for(k=j;k<4;k++)

y[k][j]=x[j][k];

for(j=0;j<4;j++)

for(k=0;k<4;k++)

printf("%d,",y[j][k]);

}

运行结果为

0,0,0,0,1,2,0,0,2,3,4,0,3,4,5,6

函数

1.

#include <stdio.h>

int Sub(int a, int b)

{return (a- b);}

main()

{int x, y, result = 0;

scanf("%d,%d", &x,&y );

result = Sub(x,y ) ;

printf("result = %d\n",result);

}

当从键盘输入:6,3运行结果为

result =3

2.

#include <stdio.h>

int min( int x, int y )

{ int m

if ( x> y ) m = x

elsem = y

return(m)

main() {

int a=3,b=5,abmin

abmin = min(a,b)

printf(“min is %d”abmin)

}

运行结果为:

min is 5

3.

#include<stdio.h>

func(int x) {

x=10;

printf(“%d, ”,x);

}

main( )

{ int x=20;

func(x);

printf(“%d”, x);

}

运行结果为:

10, 20

在main函数中调用函数func,main函数将20作为实参穿给func,并转向开始执行func.

main()对应的内存func()对应的内

20 x 20 x

func()执行x=10;,其内存中x变为10.

10 x

func()执行printf(“%d, ”,x); 即输出func函数对应内存中x的值,输出的是10. 至此,func函数执行结束,返回main函数。

main函数执行printf(“%d”, x);此时输出main函数对应内存中的x,即20

4.

#include <stdio.h>

int m=4;

int func(int x,int y)

{ int m=1;

return(x*y-m);

}

main()

{int a=2,b=3;

printf("%d\n",m);

printf("%d\n",func(a,b)/m);

}

运行结果为

4

1

整型变量m在函数外定义,因此m为全局变量,其作用于范围为其定义位置开始,一直到整个程序结束。因此func与main函数都可以访问m

程序首先执行main函数

执行printf("%d\n",m); 即输出m中的值4,并换行。

执行printf("%d\n",func(a,b)/m);即输出表达式func(a,b)/m的值,为了计算该表达式,

需要调用函数func。此时main将a,b中的2和3值作为实参传递给func的x和y

程序开始转向执行func函数,此时func中的x为2,y为3

执行int m=1; 此句定义了一个局部变量m并赋值为1 。m的作用域为其所在的复合

语句,即func的函数体,因此在func的函数体重,有限访问局部变量m。

执行return(x*y-m); 即return(2*3-1);返回的是整数5.

func函数返回至main函数中的被调用处

main函数中func(a,b)的值为5,func(a,b)/m=5/4=1,注意,在main函数中访问的m为全局变量m,此时main函数无法访问func中的m,因为不在func中m的作用域。

5.

#include <stdio.h>

int fun(int a, int b)

{ if(a>b) return(a);

else return(b);

}

main()

{ int x=15, y=8, r;

r= fun(x,y);

printf("r=%d\n", r);

}

运行结果为r=15

程序首先执行main函数

执行r= fun(x,y);即将func(x,y)的值赋给r,为了计算该表达式,需要调用函数func。此时main将x,y中的15和8值作为实参传递给func的a和b

程序开始转向执行func函数,此时func中的a为15,b为8

执行if语句;判断if后面的表达式,a>b成立,因此执行相应的操作return(a);即返回

a的值。

func函数返回至main函数中的被调用处

main函数中func(x,y)的值为15,即将15赋给r。

执行printf("r=%d\n", r); 即输出r=15

6.

#include <stdio.h>

int fac(int n)

{ int f=1,i;

for(i=1;i<=n;i++)

f=f * i;

return(f);

}

main()

{ int j,s;

scanf(“%d”,&j);

s=fac(j);

printf("%d!=%d\n",j,s);

}

如果从键盘输入3运行结果为:3!=6

程序首先执行main函数

执行r= fun(x,y);即将func(x,y)的值赋给r,为了计算该表达式,需要调用函数func。此时main将x,y中的15和8值作为实参传递给func的a和b

程序开始转向执行func函数,此时func中的a为15,b为8

执行if语句;判断if后面的表达式,a>b成立,因此执行相应的操作return(a);即返回

a的值。

func函数返回至main函数中的被调用处

main函数中func(x,y)的值为15,即将15赋给r。

执行printf("r=%d\n", r); 即输出r=15

7.

#include <stdio.h>

unsigned fun6(unsigned num)

{ unsigned k=1;

do

{ k*=num%10;

num/=10;

}while(num);

return k;

}

main()

{ unsigned n=26;

printf(“%d\n”,fun6(n));

}

运行结果为12

程序首先执行main函数

执行printf(“%d\n”,fun6(n)); 即输出表达式func(6)的值,为了计算该表达式,需要调用

函数func。此时main将n中的26作为实参传递给func的num

程序开始转向执行func函数,此时func中的num为26

执行do-while语句

第1次循环

执行k*=num%10,即k=k*(num%10)=1*(26%10)=6

执行num/=10;即num=num/10=26/10=2

while后面循环条件为num,此时num为2,是非0值,即表示循环条件成立,

继续执行循环体。此时k为6

第2次循环

执行k*=num%10,即k=k*(num%10)=6*(2%10)=12

执行num/=10;即num=num/10=2/10=0

while后面循环条件为num,此时num为0,表示循环条件不成立,

结束循环

执行return k; 即返回至main函数中的被调用处

执行main函数

继续执行printf(“%d\n”,fun6(n)); 即输出12

8.

#include <stdio.h>

int max(int x, int y);

main()

{ int a,b,c;

a=7;b=8;

c=max(a,b);

printf("Max is %d",c);

}

max(int x, int y)

{ int z;

z=x>y? x : y;

return(z) ;

}

运行结果为:

Max is 8

指针

1.

# include < stdio .h >

main ( )

{ int x[ ] = {10, 20, 30, 40, 50 };

int *p ;

p=x;

printf ( “%d”, *(p+2 ) );

}

运行结果为

30

首先定义一个整型数组x,x的长度为5;然后定义一个指针变量p;对p进行初始化,将数组x的地址赋给p。因此此时p中存放的数组x的首地址,即数组中第一个元素x[0]的地址。

然后执行printf语句,输出表达式*(p+2)的值。p+2表示以p当前指向的位置起始,之后第2个元素的地址,即a[2]的地址。*(p+2)则表示该地址内所存放的内容,即a[2]的值30,因此输出30

2.

#include <stdio.h>

main( )

{ char s[]=”abcdefg”;

char *p;

p=s;

printf(“ch=%c\n”,*(p+5));

}

运行结果为

ch=f

首先定义一个字符型数组s,并用字符串abcdefg对s进行初始化; 然后定义一个字符型指针变量p; 对p进行初始化,将数组s的地址赋给p。因此此时p中存放的数组s的首地址,即数组中第一个元素s[0]的地址。

然后执行printf语句,输出表达式*(p+5)的值。p+5表示以p当前指向的位置起始,之后第5个元素的地址,即a[5]的地址。*(p+5)则表示该地址内所存放的内容,即a[5]的值f, 因此输出ch=f

3.

#include<stdio.h>

main ( )

{ int a[]={1, 2, 3, 4, 5}

int x, y, *p

p=a

x=*(p+2)

printf("%d%d \n", *p, x)

}

运行结果为:

1:3

首先定义一个整型数组a,并对a进行初始化; 然后定义整型变量x,y,整型指针变量p; 再将数组a的地址赋给p。因此此时p中存放的数组a的首地址,即数组中第一个元素a[0]的地址。执行x=*(p+2)p+2表示以p当前所指向的位置起始,之后第2个元素的地址,即a[2]的地址。*(p+2)则表示该地址内所存放的内容,即a[2]的值3,然后再把3赋给x

然后执行printf语句,先输出表达式*p的值。此时*p表示的是p所指向变量的内容,即a[0]的值1。再输出一个冒号。然后再输出x中的值3。

4.

#include<stdio.h>

main()

{ int arr[ ]={30,25,20,15,10,5}, *p=arr;

p++;

printf(“%d\n”,*(p+3));

}

运行结果为10

首先定义一个整型数组arr,并对arr进行初始化; 然后定义整型指针变量p; 再将数组arr的地址赋给p。因此此时p中存放的数组arr的首地址,即数组中第一个元素a[0]的地址。

执行p++,即p=p+1。p+1表示以p当前所指向的位置起始,之后第1个元素的地址,即arr[1]的地址,然后再将arr[1]的地址赋给p,执行完此语句后,p不再指向arr[0],而是指向arr[1]。

然后执行printf语句,输出表达式*(p+3)的值。p+3表示以p当前指向的位置起始(此时p指向arr[1]),之后第3个元素的地址,即arr[4]的地址。*(p+3)则表示该地址内所存放的内容,即arr[4]的值10, 因此输出10

5.

#include <stdio.h>

main( )

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

int x, y, *p;

p = &a[0];

x = *(p+2);

y = *(p+4);

printf(“*p=%d, x=%d, y=%d\n”, *p, x, y);

}

运行结果为

*p=1, x=3, y=5

首先定义一个整型数组a,并对a进行初始化; 然后定义整型变量x,y,整型指针变量p; 再将数组元素a[0]的地址赋给p。

执行x=*(p+2);p+2表示以p当前所指向的位置起始,之后第2个元素的地址,即a[2]的地址。*(p+2)则表示该地址内所存放的内容,即a[2]的值3,然后再把3赋给x

执行y = *(p+4); p+4表示以p当前所指向的位置起始,之后第4个元素的地址,即a[4]的地址。*(p+4)则表示该地址内所存放的内容,即a[4]的值5,然后再把5赋给y

执行printf语句,先输出表达式*p的值。此时*p表示的是p所指向变量的内容,即a[0]的值1。再输x的值3。再输出y的值5。

6.

#include<stdio.h>

main( )

{ static char a[ ]=”Program”, *ptr;

for(ptr=a, ptr<a+7; ptr+=2)

putchar(*ptr);

}

运行结果为

Porm

首先定义一个字符型数组a,并对a进行初始化; 然后定义字符型指针变量p;

执行for语句ptr=a为表达式1,将数字a的地址赋给ptr;表达式2(循环条件)ptr<a+7;表达式3为ptr+=2,即ptr= ptr+2;

第1次执行循环体

执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第1个元素,即

a[0],因此*ptr表示a[0]中的值,即’P’.

执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位

置起始,之后第2个元素的地址,即a[2]的地址,然后将a[2]的地址赋给ptr。a[2]的地

址等价于a+2,因此循环条件ptr<a+7成立,继续执行循环体

第2次执行循环体

执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第3个元素,即

a[2],因此*ptr表示a[2]中的值,即’o’.

执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位

置起始,之后第2个元素的地址,即a[4]的地址,然后将a[4]的地址赋给ptr。a[4]的地

址等价于a+4,因此循环条件ptr<a+7即a+4<a+7成立,继续执行循环体

第3次执行循环体

执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第5个元素,即

a[4],因此*ptr表示a[4]中的值,即’r’.

执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位

置起始,之后第2个元素的地址,即a[6]的地址,然后将a[6]的地址赋给ptr。a[6]的地址等价于a+6,因此循环条件ptr<a+7即a+6<a+7成立,继续执行循环体

第4次执行循环体

执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第7个元素,即

a[6],因此*ptr表示a[6]中的值,即’m’.

执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位

置起始,之后第2个元素的地址,即a[8]的地址,然后将a[8]的地址赋给ptr。a[6]的地址等价于a+8,因此循环条件ptr<a+7即a+8<a+7不成立,结束循环。

7.

#include <stdio.h>

char s[]=”ABCD”;

main()

{ char *p;

for(p=s;p<s+4;p++)

printf(“%c %s\n”,*p,p);

}

运行结果为

A ABCD

B BCD

C CD

D D

首先定义一个字符型数组s,并对s进行初始化; 数组s是全局变量,其有效范围从其定义开始至整个程序结束。

执行main函数

定义一个字符型指针p。

执行for语句p=s为表达式1,将数字s的首地址赋给p;表达式2(循环条件)p<s+4;表达式3为p++,即p= p+1;

第1次执行循环体

执行printf(“%c %s\n”,*p,p);即以字符%c形式输出*p所对应的字符。此时p指

向数组中的第1个元素,即s[0],因此*p表示a[0]中的值,即’A’. 然后再以字

符串%s的形式输出以p中地址为首地址的整个字符串,即输出ABCD

执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的

位置起始,之后1个元素的地址,即s[1]的地址,然后将a[1]的地址赋给p。

s[1]的地址等价于s+1,因此循环条件p<s+4成立,继续执行循环体

第2次执行循环体

执行printf(“%c %s\n”,*p,p);即以字符%c形式输出*p所对应的字符。此时p指

向数组中的第2个元素,即s[1],因此*p表示s[1]中的值,即’B’. 然后再以字

符串%s的形式输出以p中地址为首地址的整个字符串,此时p指向s[1],即

从s[1]开始,依次输出后面的字符串,因此又输出BCD

执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的

位置起始,之后1个元素的地址,即s[2]的地址,然后将a[2]的地址赋给p。

s[2]的地址等价于s+2,因此循环条件p<s+4成立,继续执行循环体

第3次执行循环体

执行printf(“%c %s\n”,*p,p);即以字符%c形式输出*p所对应的字符。此时p指

向数组中的第3个元素,即s[2],因此*p表示s[2]中的值,即’C’. 然后再以字

符串%s的形式输出以p中地址为首地址的整个字符串,此时p指向s[2],即

从s[2]开始,依次输出后面的字符串,因此又输出CD

执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的

位置起始,之后1个元素的地址,即s[2]的地址,然后将s[2]的地址赋给p。

s[2]的地址等价于s+3,因此循环条件p<s+4成立,继续执行循环体

第4次执行循环体

执行printf(“%c %s\n”,*p,p);即以字符%c形式输出*p所对应的字符。此时p指

向数组中的第4个元素,即s[3],因此*p表示s[3]中的值,即’D’. 然后再以字

符串%s的形式输出以p中地址为首地址的整个字符串,即输出D

执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的

位置起始,之后1个元素的地址,即s[3]的地址,然后将s[3]的地址赋给p。

s[3]的地址等价于s+4,因此循环条件p<s+4不成立,结束循环

结构体

1.

#include<stdio.h>

struct st

{ int x;

int y;

} a[2]={5, 7, 2, 9} ;

main()

{

printf("%d\n",a[0].y*a [1].x);

}

运行结果是

14

首先是定义结构体st,st中共有两个整型成员x,y。

然后定义一个st类型的数组a,a的长度为2,即数组中含有两个st类型的元素,分别是a[0]和a[1]. 对a进行初始化,此题是按照储存顺序进行初始化,即将5赋给a[0]中的x(即a[0].x=5); 将7赋给a[0]中的y(即a[0].y=7); 将2赋给a[1]中的x(即a[1].x=2); 将9赋给a[1]中的y(即a[1].y=9);

执行main函数,输出表达式a[0].y*a [1].x的值,即7*2的值

5 a[0].x a[0]

7 a[0].y

2 a[1].x a[1]

9 a[1].y

2.

#include<stdio.h>

main( )

{struct stu

{int num;

char a[5];

float score;

}m={1234,”wang”,89.5};

printf(“%d,%s,%f”,m.num,m.a,m.score);

}

运行结果是

1234,wang,89.5

3.

#include<stdio.h>

struct cmplx

{ int x;

int y;

} cnum[2]={1, 3, 2, 7};

main( )

{

printf(“%d\n”, cnum[0].y * cnum[1].x );

}

运行结果是:6

与第一题解法同

4.

#include <stdio.h>

struct abc

{ int a, b, c; };

main()

{ struct abc s[2]={{1,2,3},{4,5,6}};

int t;

t=s[0].a+s[1].b;

printf("%d \n",t);

}

运行结果是:6

与第一题解法同

程序填空

1.输入一个字符,判断该字符是数字、字母、空格还是其他字符。

main( )

{ char ch;

ch=getchar();

if(ch>=’a’&&ch<=’z’|| ch>=’A’&&ch<=’Z’)

printf("It is an English character\n");

else if(ch>=’0’&&ch<=’9’)

printf("It is a digit character\n");

else if(ch== ‘ ’)

printf("It is a space character\n");

else

printf("It is other character\n"); }

第1空:字符在计算机中以ASCII码的形式存储。所以当输入的字符,即ch中字符所对应的ASCII码的范围在英文字母的ASCII码的范围内即可,参照p377。由于英文字母又分为大写字母和小写字母,因此此处用一个逻辑或表达式,表示ch中是小写字母或者大写字母,都能使得表达式成立。ch>=97&&ch<=122|| ch>=65&&ch<=90

需要注意的是,对于本题区间所对应的表达式,不可写作97<=ch<=122,也不可写作’A’<=ch <=’Z’. 对于97<=ch<=122因为在计算此表达式时的顺序是从左向右,因此先计算97<=ch。无论ch中的取值如何,表达式97<=ch的值只有两种情况:0或1.所以无论是0还是1,都小于122,因此97<=ch<=122恒成立。

第3空,判断ch中是否为空格,也是通过ch中字符与空格字符的ASCII码来判断。在判断表达式的值是否相等时,用关系符号==;不要用赋值符号=。

2.下列程序的功能是从输入的整数中,统计大于零的整数个数和小于零的整数个数。用输入0来结束输入,用i,j来放统计数,请填空完成程序。

void main()

{intn,i=0,j=0;

printf(“input a integer,0 for end\n”);

scanf(“%d”,&n);

while (n或n!=0) {

if(n>0) i=i+1;

else j=j+1;

}

printf(“i=%4d,j=%4d\n”,i,j);

}

此题用i来记录大于零的整数,用j记录小于零的整数。所以循环条件是n(或者n!=0)即当n不为0时执行循环体。在循环体中是一个选择语句。如果n>0,则令i加1,相当于令正整数的个数加1;否则(即n<0),令j加1,相当于令负整数的个数加1。

3.编程计算1+3+5+……+101的值

#include <stdio.h>

void main()

{ int i, sum = 0;

for (i = 1;i<=101;i=i+2;)

sum = sum + i;

printf("sum=%d\n", sum); }

for语句的一般形式详见p120.

表达式1为i = 1,为循环变量赋初值,即循环从1开始,本题从1到101,因此终值是101,表达式2是循环条件,用来控制循环的结束,因此循环条件为i<=101;表达式3为循环变量的自增,本题是

4.编程计算1+3+5…+99的值

main()

{ int i, sum = 0;

i=1;

while (i<100)

{ sum = sum + i;

I=i+2; }

printf("sum=%d\n", sum);

}

5.从键盘输入一个字符,判断它是否是英文字母。

#include <stdio.h>

void main()

{char c;

printf("input a character:");

c=getchar();

if(c>=‘A’&&c<=‘Z’|| c>=‘a’ &&c<= ‘z’) printf("Yes\n");

else printf("No");

}

6. 下面程序的功能是在a数组中查找与x值相同的元素所在位置,请填空。

#include <stdio.h>

void main()

{ int a[10],i,x;

printf(“input 10 integers:”);

for(i=0;i<10;i++)

scanf(“%d”,&a[i]);

printf(“input the number you want to find x:”);

scanf(“%d”,&x);

for(i=0;i<10;i++)

if(x==a[i])

break;

if(i<10)

printf(“the pos of x is:%d\n”,i);

else printf(“can not find x!\n”);

}

7.程序读入20个整数,统计非负数个数,并计算非负数之和。

#include <stdio.h>

main( )

{ int i, a[20], s, count;

s=count=0;

for(i=0;i<20; i++)

scanf(“%d”, &a[i] );

for(i=0; i<20; i++)

{ if( a[i]<0 ) continue ;

s+=a[i];

count++;

}

printf(“s=%d\t count=%d\n”, s, count”);

}

8.输入一个正整数n (1<n≤10),再输入n个整数,用选择法将它们从小到大排序后输出。

#include <stdio.h>

int main(void){

int i, index, k, n, temp;

/* 定义1个数组a,它有10个整型元素*/

printf(“Enter n: ");

printf(“Enter %d integers: ", n);

for(i = 0; i < n; i++)

scanf("%d", &a[i]);

for(k = 0; k < n-1; k++){ /* 对n个数排序*/

index = k;

for()

if() index = i;

}

printf("After sorted: ");

for(i = 0; i < n; i++) /* 输出n个数组元素的值*/

return 0;}

程序改错

一、下面每个程序的划线处有语法或逻辑错误,请找出并改正,使其得到符合题意的执行结果。

1.求1234n

main()

{ long int sum;/ /若定义变量的语句有错误,常见考点有两个:(1)变量的类型,(2)在定义用于存放运算结果的变量时,一定要赋初值。一般赋值0或者循环初值。

int n,i=1;

scanf("%d",n);//若scanf语句有错误,常见考点有两个:(1)格式声明符号要与后面欲赋值的变量的类型一致,此题%d与n的类型int一致(详见p69-78);(2)变量的前面要有地址符号&

printf(“\n”);

while(i<n)// 循环条件用于控制循环的次数,若以i<n 为循环条件,则意味着i的终值为n-1, 由于且i初值为1,因此一共能够循环n-1次。比要求少了1次,因此应改为i<=n 或者i<n+1

{ sum=sum*i;// 若不为sum赋初值,则此处无法计算sum*i。

i++;

}

printf("sum=%d",sum);//若printf语句有错误,常见考点有1个:格式声明符号要与后面欲输出的变量的类型一致,此题%d与sum的类型long int不一致,应改为%ld(详见p69-78);

}

sum应初始化即加入sum=1

第四行改为:scanf(“%d”,&n);

第六行改为:while(i<=n)或者while(i<n+1)

第十行改为:printf("sum=%ld",sum);

2.求一个数组中最大值及其下标。

main( )

{ int max,j,m;

int a[5];

for(j=1;j<=5;j++)// j=1为循环变量j赋初值为1,同时用j作为数字元素的逻辑地址下标。因此输出的时候只能从a[1]开始输出,无法输出a[0].因此应将j赋初值0,相应的循环条件改为j<5或者j<=4用于控制循环执行5次

scanf(“%d”,a);//若scanf语句有错误,常见考点有两个:(1)格式声明符号要与后面欲赋值的变量的类型一致,此题%d与a的类型int一致(详见p69-78);(2)变量的前面要有地址符号&

max=a[0];

for(j=1;j<=5;j++)//修改思路与上一个for语句同

if(max>a[j])

{ max=a[j];

m=j;

}

printf(“下标:%d\n最大值:%d”, j, max)//j为for语句的循环变量,当for语句执行完之后,j中的值为6,并非最大值下标,在执行某一次循环的比较过程中,将当时最大值的下标存在了m里

}

第四行改为:for(j=0;j<5;j++)

第五行改为:scanf(“%d”,&a[j]);

第七行改为:for(j=1;j<5;j++)

第八行改为:if(max<a[j])

第十三行改为:printf(“下标:%d\n最大值:%d”, m,max)

3.用一个函数求两个数之和。

sum(x,y)//函数定义的一般形式p173-174

{ float z;

z=x+y;

return;//return语句后面可以返回0、常量、变量和表达式的值。

}

main()

{ float a,b;

int c;/ /若定义变量的语句有错误,常见考点有两个:(1)变量的类型,(2)在定义用于存放运算结果的变量时,一定要赋初值。一般赋值0或者循环初值。

scanf("%f,%f",&a,&b);

c=sum(a,b);

printf("\nSum is %f",sum);

}

第一行改为:float sum(float x, float y );

第四行改为:return(z);或者return z;

第八行:float c;

第十一行:printf("\nSum is %f",c);

4程序读入20个整数,统计非负数个数,并计算非负数之和.

#include “stdio.h”

main()

{

int i, s , count ,n=20;

int a[n];//数组定义的一般形式,详见p143, 其中的常量表达式不能为变量

s=count=1;

for( i=1, i<20, i- -)// for语句的格式,三个表达式之间用分号,且分号不可省略

scanf(“%d”, a[i] );//若scanf语句有错误,常见考点有两个:(1)格式声明符号要与后面欲赋值的变量的类型一致,此题%d与n的类型int一致(详见p69-78);(2)变量的前面要有地址符号&

for(i=0;i<20;i++)

{

if(a[i]<0)

break;// break与continue的区别p128. 在改错题中若错误出现在break语句,则通常是将break换为continue;反之,若错误出现在continue,通常是将其换为break

s +=a[i];

count++;

}

printf(“s=%f count=%f\n”, s, count);//若printf语句有错误,常见考点有1个:格式声明符号要与后面欲输出的变量的类型一致

}

答案:int a[20]

s=count=0;

for(i=0;i<20;i--)

scanf(“%d”,&a[i]);

continue;

printf(“s=%d count=%d\n”,s,count);

5.从键盘输入整数x的值,并输出y的值.

main()

{float x,y;

scanf(“%d”,&x);

y=3.5+x;

printf(“y=%d”);

}

正确的: int x; float y;

printf(“y=%f”,y);

6编程计算下面分段函数,输入x,输出y

main()

{ int x,y;

printf(“\n Input x:\n”);

scanf(“%d”, x);// 错误同上题scanf

if(x<0)

y=x-1;

else if(x>=0||x<=10)// ||表示逻辑或,当左边表达式成立或者右边表达式成立时,整个表达式成立。&&表示逻辑与,当左边表达式和右边表达式同时成立时,整个表达式成立。此处用逻辑表达式来表示x的区间[0,10], 因此应改用逻辑与符号

y=2x-1;// C语言中乘号不能省略,且用*表示乘法运算

else

y=3x-1;// C语言中乘号不能省略,且用*表示乘法运算

printf(“y=%d”,&y);//printf与scanf不用,printf后面给出的是变量名列表或表达式列表,无需地址符号

}

第一处改为:scanf(“%d”,& x);

第二处改为:x>=0&&x<=10

第三处改为:y=2*x-1;

第四处改为:y=3*x-1;

第五处改为:printf(“y=%d”,y);

7.100~300间能被3整除的数的和。

main()

{ int n;

long sum;/ /若定义变量的语句有错误,常见考点有两个:(1)变量的类型,(2)在定义用于存放运算结果的变量时,一定要赋初值, 一般赋值0或者循环初值。

for(n=100,n<=300,n++)// for语句的格式,三个表达式之间用分号,且分号不可省略

{

if(n%3=0)// = 是赋值符号,用于将右边的值赋给左边的变量;== 是关系符号,用来判断两个值是否相等。改错中if后面表达式中的赋值符号是常见的考点。

sum=sum*n;

}

printf(“%ld ”,sum);

}

第一处改为:long sum=0;

第二处改为:for(n=100;n<=300;n++)

第三处改为:if(n%3==0)

第四处改为:sum=sum+n;

8.求表达式的值

#include <stdio.h>

#include <math.h>

int fun(int x, int y);

main()

{int a,b; float f;

scanf(“%d,%d”,a,b);//与改错第1题中的scanf错误相同

if(ab>0){// C语言中乘号不能省略,且用*表示乘法运算

fun(a,b);// 调用带有返回值的函数,应将函数的返回值保存在变量里

printf("The result is:%d\n", &f)//与第6题中printf错误相同

}

else printf(“error!”);}

fun(x, y)// 定义函数的一般形式p173-174

{float result;

result = sqrt(a+b);

return;//return语句后面可以返回0、常量、变量和表达式的值。

}

第一处改为:if(a*b>0)

第二处改为:f= fun(a,b);

第三处改为:printf("The result is:%d\n",f);

第四处改为:float fun(int x, int y)

第五处改为:f= fun(a,b);

第六处改为:result = sqrt(a*b);

第七处改为:return result;

编程题

1.输入2个整数,求两数的平方和并输出。

#include <stdio.h>

int main(void)

{ intt a ,b,s;

printf("please input a,b:\n");

scanf("%d%d”,&a,&b);

s=a*a+b*b;

printf("the result is %d\n",s);

return 0;

}

2.输入一个圆半径r,当r>0时,计算并输出圆的面积和周长,否则,输出提示信息。

#include <stdio.h>

#define PI 3.14

int main(void)

{ double r ,area , girth;

printf("please input r:\n");

scanf("%lf",&r);

if (r>=0)

{ area =PI*r*r;

girth =2*PI*r ;

printf("the area is %.2f\n", area);

printf("the girth is %.2f\n", girth);}

else

printf("Input error!\n");

return 0;

}

3、已知函数y=f(x)编程实现输入一个x值,输出y值。

2x+1 (x<0)

y= 0 (x=0)

2x-1 (x>0)

#include <stdio.h>

void main()

{ int x,y;

scanf(“%d”,&x);

if(x<0) y=2*x+1;

else if(x>0) y=2*x-1;

else y=0;

printf(“%d”,y);

}

4.从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A80≤score<90,等级为B70≤score<80,等级为C60≤score<70,等级为Dscore<60,等级为E

#include <stdio.h>

void main(){

int data;

char grade;

printf("Please enter the score:");

scanf("%d”, &data);

switch(data/10)

{ case 10:

case 9 : grade=’A’; break;

case 8: grade=’B’; break;

case 7: grade=’C’; break;

case 6: grade=’D’; break;

default: grade=’E’;

}

printf("the grade is %c”,grade);

}

5.编一程序每个月根据每个月上网时间计算上网费用,计算方法如下:

要求当输入每月上网小时数,显示该月总的上网费用(6)

#include <stdio.h>

void main()

{ int hour;

float fee;

printf(“please input hour:\n”);

scanf(“%d”,&hour);

if(hour<=10)

fee=30;

else if(hour>=10&&hour<=50)

fee=3*hour;

else fee=hour*2.5;

printf(“The total fee is %f”,fee);

}

6.从键盘输入10个整数,统计其中正数、负数和零的个数,并在屏幕上输出。

#include <stdio.h>

void main( ) {

int a, i,p=0,n=0,z=0;

printf("please input number");

for(i=0;i<10;i++){

scanf("%d,",&a);

if (a>0) p++;

else if (a<0) n++;

else z++;

}

printf("正数:%5d, 负数:%5d,零:%5d\n",p,n,z);

}

7、编程序实现求1-10之间的所有数的乘积并输出。

#include <stdio.h>

void main( )

{ int i;

long sum=1;

for(i=1; i<=10; i=i+1)

sum=sum*i;

printf(“the sum of odd is :%ld”,sum);

}

8.从键盘上输入10个数,求其平均值。

#include <stdio.h>

void main(){

int a,i,sum=0;

float ave;;

for(i=0;i<10;i++){

scanf("%d",&a);

sum+=a;

}

ave=(float)sum/10;

printf("ave = %f\n", ave);

}

9、编程序实现求1-1000之间的所有奇数的和并输出。

#include <stdio.h>

void main( )

{ int i, sum=0;

for(i=1; i<1000; i=i+2)

sum=sum+i;

printf(“the sum of odd is :%d”,sum);

}

10.有一个分数序列:2/13/25/38/513/8……编程求这个序列的前20项之和。

#include <stdio.h>

void main(){

int i,t,n=20;

float a=2,b=1,s=0;

for(i=1;i<=n;i++)

{s=s+a/b;

t=a;

a=a+b;

b=t;

}

printf("sum=%6.2f",s);

}

11.从键盘输入两个数,求出其最大值(要求使用函数完成求最大值,并在主函数中调用该函数)

#include <stdio.h>

float max(float x,float y);

void main()

{ float a,b,m;

scanf("%f,%f",&a,&b);

m=max(a,b);

printf("Max is %f\n",m);

}

float max(float x,float y)

{

if (x>=y)

return x;

else

return y;

}

12.编写程序,其中自定义一函数,用来判断一个整数是否为素数,主函数输入一个数,输出是否为素数。

#include <math.h>

#include <stdio.h>

int IsPrimeNumber(int number)

{ int i;

if (number <= 1)

return 0;

for (i=2; i<sqrt(number); i++)

{ if ((number % i) == 0)

return 0; }

return 1;}

void main()

{ int n;

printf(“Please input n:”);

scanf(“%d”,&n);

if(IsPrimeNumber(n))

printf(“\n%d is a Prime Number”,n);

else printf(“\n%d is not a Prime Number”,n);}

13、从键盘输入n个数存放在数组中,将最小值与第一个数交换,输出交换后的n个数。

#include <stdio.h>

int main(void){

int i,n,iIndex,temp;

int a[10];

printf("Enter n: ");

scanf("%d", &n);

printf("Enter %d integers:\n ");

for(i=0;i<n;i++)

scanf("%d", &a[i]);

iIndex=0;

for(i=1;i<n;i++){

if(a[i]<a[iIndex]) iIndex=i;

}

temp=a[0];a[0]=a[iIndex];a[iIndex]=temp;

for(i=0;i<n;i++)

printf("%5d", a[i]);

printf("\n");

return 0;

}

第二种解法利用函数

#include<stdio.h>

int comp(int arry[], int n)

{

int i,index,temp;

printf("为数组赋值:\n");

for(i=0;i<n;i++)

{scanf("%d",&arry[i]);

}

for(i=1,index=0;i<=n-1;i++)

{if(arry[i]<arry[index])

{index=i;

}

}

temp=arry[0];arry[0]=arry[index];arry[index]=temp;

for(i=0;i<n;i++)

{printf("%d ",arry[i]);

}

return 0;

}

main()

{int n;

int a[10];

printf("为n赋值:\n");

scanf("%d",&n);

comp(a,n);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。