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