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小的方法。0else 是与最接近的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:cint 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;psprintf(\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