单片机C语言作业及上机习题及答案 - 图文

更新时间:2024-03-27 17:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一次课

熟悉win-TC编译环境、熟悉C语言程序结构

1.使用C 语言编译环境,输入下面的源程序。将你的程序命名为hello.c,然后编译运 行它。

/* program writes the words \*File : Hello.c * By : NJCIT

* Date : 07-03-09 */#include main() {

printf(\return(0); } 2.

main() /*求两数之和*/ {

int a,b,sum; /* 这是变量定义*/ a=123;b=456; sum=a+b;

printf(“sum is %d\\n”,sum); }

回答下列问题:

1. C语言中的标识由 字母 、 数字 和 下划线 组成,以 字母 和 下划线 开头,不可使用 关键字 。

2. C语言源程序从 main 开始执行?每个C语言程序必须有一个且只能有一个主函数,主函数的名字为 main 。 C程序的函数由 函数头 和 函数体 两部分构成,函数头包括 函数属性 、 函数类型 、 函数名 和 形参表 ;函数体由一系列的语句组成,语句由 分 号结束,函数休包含在一对 花 括号中。程序中的注释内容是用符号 /* */ 界定。

2. 计算机上实现C语言程序要经过 编辑 (产生*. C 文件)、 编译 (产生*. OBJ 文

件)、 链接 (产生*. EXE 文件)和 调试 四个阶段。

第二次课

熟悉printf()函数、常见转义字符及各种数据类型的输出格式 1.

#include main() { printf(\printf(\printf(\printf(\printf(\printf(\printf(\return (0); } (1) printf()函数的功能是什么?按指定的格式在屏幕上显示指定的内容 (2) 在 printf()函数中’\\n’的起什么作用?回车换行 (3) 在 printf()函数中’\\t’的起什么作用?水平跳格 (4) 在 printf()函数中’\\a’的起什么作用?蜂呜器响 2. main() {

int a=5,b=7,c=-1;

float x=67.8564,y=-789.124; char c=‘A’; long n=1234567; unsigned u=65535;

printf(“%d%d\\n”,a,b); /*57 */ printf(“==\\n”,a,b); /* 5 7 */ printf(“%f,%f\\n”,x,y); /*67.856400,-789.124000*/ printf(“%-10f%-10f\\n”,x,y); /*67.856400 ,-789.124000*/ printf(“%8.2f,%8.2f,%.4f,%.4f,?,?\\n”,x,y,x,y,x,y);

/* 67.85, -789.12,67.8564,-789.1240,67.856400,-789.124000*/

printf(“%e,.2e\\n”,x,y); /*6.78564e+01, -7.9e+02*/ printf(“%c,%d,%o,%x\\n”,c,c,c,c); /*A,65,101,41*/ printf(“%ld,%lo,%x\\n”,n,n,n); /*1234567,4553207,d687*/ printf(“%u,%o,%x,%d\\n”,u,u,u,u); /*65535,177777,ffff,-1*/

printf(“%s,%5.3s\\n”,”COMPUTER”,”COMPUTER”);/*COMPUTER, COM*/ }

3. 假设下面的例子都是完整程序的一部分,那么他们每一个将会输出什么?

a. printf(\b. printf(\c. printf(\d. printf(\e. int num;num = 2; f. printf(\ 4.加载,编译并运行下面的程序。显示输出界面然后回答下面的问题。

#include main() { char ch; int x; float y; double z; ch = ‘A’; printf(\= %c and its ascii value is %d. What is ASCII I wonder?\\n\ ch, ch); x = 10; printf(\ y = 3.1415926; printf(\ z = 4.75E5; printf(\ return(0); } 1. 字符的A的ASCII码是多少? 65 2. “%f”默认情况下小数点后面有几位数字? 6位 3. 程序中的字符被指定的值为’A’,为什么不是“A”?'A'为字常量,\为字符串常量 4. 改变程序使它以10个字符位宽度和2位小数的形式输出浮点型数据。%f改为.2f %d改为-6d% 5. 改变程序使它以6个字符位宽度输出整型数,左对齐。 3.问答题

(1)C语言的基本数据类型有几种,分别是什么,并指出各种数据类型的关键字? (2)描述C语言中标识符的组成

(3)常量和变量的区别是什么? (4)在程序中如何使用变量?

(5)从下面列出标识符中选出哪些可以用作合法的C用户定义标识符,哪些不能使用。为什么?

(1) a3_b3 (2)void (3) _123 (4)123_ (5) IF (6) INT (7) For (8) printf (9) WORD (10) define (11) _abc (12) sizeof (13) answer (14) to (15)signed (16) Case (17)_if (18) extern (19) putchar (20) _double

(6)请选出正确的数值和字符常量,说明类型;对于不正确的数,说明原因

(1) 0.0 (2) 5L (3) o13 (4) 0Xff (5) oxaa (6) 018 (7) 9861 (8) 011

(9) 3.987E-2 (10) .987 (11) ‘\\0xab? (12) 50. (13) 8.9e1.2 (15)0xFF00 (16) 0.825e2 (17)473 (18) OX4 (19) “c” (20)‘t’ (21) ‘\\?” (22)?0? (23)?\\0? (24) ?A?

4.选择题

(1)合法的字符常量是 。

A) ‘\\t’ B) “A” C) ‘a’ D)’\\x32’

(2) 合法的字符常量是 。

A) ‘\\084’ B) ‘\\84’ C) ‘ab’ D)’\\x43’

(3)是C语言提供的合法的数据类型关键字。

A) Float B) signed C) integer D)Char

(4)在以下各组标识符中,合法的标识符是。

A) A)B01 B)table_1 C) 0_t D) k% B) A)Fast_ B) void C)pbl D) C) A)xy_ B)longdouble C)*p D)CHAR D) A) sj B)Int C)_xy D)w_y23

(5)属于合法的C语言长整型常量的是 。

A)5876273 B)0L C)2E10 D)(long)5876273

(6)下面选项中,不是合法整型常量的是

A)160 B)-0xcdg C)-01 D)-0x48a

1e1 (14) 第三次课

熟悉scanf()函数的使用:

1. 用下面的scanf()函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’;

main() {

int a,b; float x,y; char c1,c2;

scanf(“a=%d b=%d”,&a,&b); scanf(“ x=%f y=%e”,&x,&y);

scanf(“ c1=%c c2=%c”,&c1,&c2); printf(“a=%d b=%d”,a,b); printf(“ x=%f y=%e”,x,y);

printf(“ c1=%c c2=%c”,c1,c2); }

2.加载,编译并运行下面的程序然后回答下面的问题。

2. 改写这个程序使他可以用一个单独的变量以天的形式存储用户的年龄。

#include main() { int user_age; char user_name[51]; /* Get the users name */ printf(\ scanf(\ /* Get the users age */ printf(\ scanf(\ /* Print out their name and age in days */ printf(\’day %s, you are %d days old\\n\ user_age*365); return(0); } 存储用户名的变量名是什么? 1.

3.使用 scanf() 读取多行输入 #include main() { int user_age; char user_name[51]; /* Get the users name and age*/ printf(\ scanf(\ /* Print out their name and age in days */

printf(\’day %s, you are %d days old\\n\return(0); } 1. 当你在回答问题时颠倒了年龄和姓名会出现什么情况? 2. 当你在代码中省去了&时会出现什么情况? 4.编程题

(1) 已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序来。

(2)若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。

a= 3 b= 4 c= 5

x=1.200000,y=2.400000,z=-3.600000 x+y= 3.60 y+z=-1.20 z+x=-2.40 u= 51274 n= 128765 c1=’a’ or 97(ASCII) c2=’b’ or 98(ASCII)

5(3)输入一个华氏温度,要求输出摄氏温度,公式为:C?(F?32),取两位小数。

95.请判断以下表达式是否正确,若正确,写出表达式的值;若不正确,写出出错原因。 各变量的类型说明如下:

int i=8, j=3, k, a, b; unsigned long w=5, u; double x=1.42 , y=5.2 , t ;

(1) k=i++ 8 (2) (int)x+0.4 1.4 (3) w+=-2 3 (4) y+=x++ ? (5) i/=j+12 0 (6) k=--i 7 (7) f=3/2*(t=30.0-10.0) 30.0 (8) k=(a=2,b=3,a+b) 5 (9) a+=a-=(b=4)*(a=3) -18 (10) a=2*a=3 ?

(11) u=65535, j=-1,u=u+j (12) ++(i+j) ? (13) 2%(-3) 2 (14) -2%(-3) 2

6. 求以下表达式的值,假设所有变量都为整型。 (1) (a=b=4,a+1,b+1,a+b) (2) (a=2,b=5,a>b?a++:b++,a+b) (3) (x=8,x%=x+5) (4) 30 % 6 / 2

7.写出下面各逻辑表达式的值。设:a=3,b=4,c=5. (1)a+b>c&&b==c (2)a ||b+c&&b-c (3)!(a>b) && !c || 1 (4)!(x=a)&&(y==b)&&0 (5)!(a+b) + c –1 && b + c/2 第四次课

1. if语句应用

(1)加载,编译并运行下面的程序,先使用一个正整数,然后再使用一个负数。有什么不同?

#include main() { int x; printf(\ scanf(\ if (x > 0) { printf(\ } return(0); }

(2)使用 if语句避免除0 #include main() { float x, y; printf(\ scanf(\ y = 1/x; printf(\ return(0); } 1. 当你输入数字0时结果为多少? 2. 增加一个if语句使它只有当if x不等于0时进行计算。 3. 现在你输入0会出现什么情况? 4. 改进程序使之可以当输入数字0时打印出警告信息。 (3)编写 if语句

写一个程序用来计算电阻上的功率。功率大小等于电阻上的电压值乘以流过电阻的电流 值。

完成计算后,使用一个if 语句判断功率是否低于0.5 瓦特。如果低于0.5 瓦特则输 出“Okey to use half watt resistor”,否则输出“haff watt registor will not be okey”。

下面是程序的开始部分,请添加完成if语句。 #include main() { float power, voltage, current; printf(\ scanf(\ printf(\ scanf(\ /* Calculation here */ /* if check here */ /* else here */ return(0); } 如果功率小于0.5 瓦特,屏幕输出应该如下所示:

Enter the voltage : 5 Enter the current : 0.002 okay to use half watt resistor. 如果功率大于0.5瓦特:

Enter the voltage : 5 Enter the current : 200 half watt resisitor will not be okay.

2. 编程练习:

(1) 有三个整数a,b,c,由键盘输入,输出其中最大的数。

(2) 编程输入整数a和b,若 大于100,则输出 百位以上的数字,否则输出两数之和。 (3) 有一函数:

写一个程序,输入x的值,输出y值。

(4)写一段程序计算两个并联电阻的阻值,使你的程序检查是有短路的(0欧姆)将导致0 作为被除数,使用一个if语句或者三目运算避免这种情况(使用三目运算计算及检查是否 除0)。提示: Rt = 1 / (1/R1 + 1/R2); 你的输出应该如下所示:

Enter the value of resistor 1 : 45 Enter the value of resistor 2 : 56 45.0 ohms in parallel with 56.0 ohms gives 24.95 ohms 假如有一个电阻阻值为0的话,结果将如下所示:

Enter the value of resistor 1 : 0 Enter the value of resistor 2 : 45 0.0 ohms in parallel with 45.0 ohms gives 0.00 ohms 第5次课

1. switch语句应用

(1)加载,编译并运行下面的程序,并回答问题。

2. 加载,编译并运行下面的程序,将文件保存为switch-01.c #include main() {int num1, num2, ans; char arithOp; ans=0; printf(\ scanf(\printf(\scanf(\printf(\fflush(stdin); scanf(\switch (arithOp) { case ‘+’:ans = num1 + num2; break; case ‘-’:ans = num1 - num2; break; case ‘*’:ans = num1 * num2; break; } printf(\fflush(stdin); getchar(); return(0); } 1. 尝试输入一个不匹配case语句的操作符,会发生什么? 2. 将程序保存为switch-02.c并为“ans”添加乘(*)和除(/)的算法。 3. 添加一个default语句来处理输入的运算符不符合case情况。 4. 添加程序处理除数为零的情况。

(2)加载,编译并运行下面的程序。

1. 打印 9颗星和8颗星是不同的。描述这两种方法。 2. 编辑这段程序,使之工作在没有break语句的情况下。

#include main() {int choice; printf(\scanf(\switch (choice) { case 10: printf(\ case 9: printf(\break; case 8: printf(\case 7: printf(\case 6: printf(\case 5: printf(\break; case 4: printf(\case 3: printf(\case 2: printf(\case 1: printf(\break; default: printf(\} return(0); } (3)任务1:完成下面的程序,使用if/else语句,判断输入的数是正数还是负数

任务2:完成下面的程序,使用switch语句,判断输入的数是正数还是负数,并且要处理输入的数越界的情况。

#include main() { int num; printf(\ printf(\ scanf(\ /* 添加语句 */ return(0); } (4)本程序是从键盘输入一个10进制数,根据用户要求输出这个数对应的16进制、8进制或者10进制数。

例:若用户输入“H”,则输出这个数的16进制数。 任务1:添加if语句完成程序功能

任务2:添加switch语句完成程序功能,注意对输入无效数制的处理。比如输入:X时,作何处理。

#include main() { int num; char choice; printf(\al or hex equivalent of numbers entered\\n\printf(\scanf(\printf(\fflush(stdin); choice = getchar(); /* 添加程序 */ return(0); }

(5) 给出一百分制成绩,要求输出成绩等级’A’,’B’,’C’,’D’,’E’。90分以上

为’A’,80-89分为’B’,70-79分为’C’,60-69分为’D’,60分以下为’E’。 (6) 从键盘输入三个数,判断这三个数是否能构成三角形,如果是,输出“the three numbers could be the sides of a triangle”,如果不是输出“the three numbers could’t the sides of a triangle”;并判断这个三角形是不是直角三角形,如果是,输出“the numbers could be the sides of a right angle triangle”,如果不是,输出“the numbers could’t the sides of a right angle triangle”。 第6次课 循环

1. 写一个程序让用户输入一个1~12之间的数,程序将会输出这个数的乘法表。 使用一个循环进行计算并输出一行,屏幕输出应该如下所示:

Enter a number between 1 and 12: 5 5 times multiplication table 1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25 6 x 5 = 30 7 x 5 = 35 8 x 5 = 40 9 x 5 = 45 10 x 5 = 50 11 x 5 = 55 12 x 5 = 60

2. 添加循环语句,计算并输出1~20之间的偶数的和。 #include main() { int i, result; /* 添加语句 */ return(0); } 3. Break 语句的使用

为程序添加语句,使得输入的数据在1~10之间时,退出循环,否则输出“the number is out of range”

#include main() { int num; while (1) { printf(\scanf(\/* if ( <-- Complete here) */ } printf(\return(0); } 任务1:添加程序,使得其在从注释A开始到注释C之间循环,并提示用户输入“0”退出循环;任务2:添加程序,使得注释B到注释C之间的语句在一个循环之内,从而判断从num开始到1之间所有的素数。

#include main() { int i, num; char isPrime; printf(\printf(\/* A */ scanf(\isPrime = 1; /* B */ for (i = num - 1; i > 1; i--) { if (num % i == 0) { isPrime = 0; printf(\prime\\n\i); break; } } if (isPrime) printf(\return(0); 5.求爱因斯坦数学题。有一条长阶,若每步跨2阶,则最后剩余1阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨6阶,则最后剩5阶;若每步跨7步,最后正好一阶不剩。

6.计算斐波那契分数序列前n项之和(n是某个常数).( 2/1,3/2,5/3,8/5,13/8,21/13,...... 前一项的分子作为后一项的分母。前一项的分子、分母之和作为后一项的分子。)。 7.问答题

(1) 下面循环错在哪里?

for (i = 1; i > 5; i++) { x /=2; } (2)下面循环错在哪里?

for (i = 10; i > 2; i++) { x *=2; } (3) 这个for循环的输出结果是多少?

for (i = 3; i > -2; i--) { printf(\} (4) 这个while循环的输出结果是多少?

i = 0;

while (i < 5) { i++;

printf(\} (5)while循环错在哪里?

i = 0;

while (i = 10) { i++; x *= 2; }

(6) 完成下面的代码使之可以输出你的名字28次.

for (i = 3; i > ; i--) { printf(\

综合练习一:打印ASC码表

在这个项目中,我们想去打印所有的ASCII码字符及相关联的十进制和二进制值。 关于ASCII

ASCII表示美国信息交换标准码,正如它的名字所暗示的, 它是由美国的一个代码指定的 数字每个信息存储或传输计算机来完成。这里是关于ASCII码的重点:

??每个键盘字符都可以映射到数字从32~127;

??数字从0 到31用于特殊字符,如制表符、铃、换行符等;

??扩展ASCII范围从128 至255,含有专门128 个字符,如边框线等;

??扩展的ASCII字符是非标准化,可能会从一个操作系统类型到另一个(如PC和MAC 与Linux);

??标准的 ASCII是标准化的,同样都可以跨越不同的操作系统类型。

第一步写出程序的基本框架

任何C程序都具有以下的基本框架

/* * Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : Some Student * Version : 1.0 */ #include main() { } 第二步添加一个具有一个变量的循环语句

我们想去打印所有的标准和扩展ASCII码的值,这就意味着循环从0至255

/* * Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : NJCIT * Version : 1.0 */ #include main() { int i; for (i=1; i<=255; i++) { } return(0); } 第三步不同数据格式打印变量值 我们现在想使用十进制和十六进制和ASCII字符打印每个字符。

/* * Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : NJCIT * Version : 1.0 - Initial release */ #include main() 第四步打印标题并将每列对齐

现在,我们将每一个字符打印出来,使它变得整洁些并给每一栏加一个标题,注意如何 选择适当的宽度打印每一栏。

我们也会修改一些在我们试图打印一些如“n/a”的控制符代替一些ASCLL码字符(这些 字符是一些不可打印的字符)出现的问题。

/** Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : NJCIT * Version : 1.1 */ #include main() {int i; printf(\for (i=1; i<=255; i++) { if (i < 32) printf(\else printf(\} return(0); } 第五步使它更适应屏幕 现在你可能注意到,没有太多的屏幕是被用来横跨宽.不仅如此, 你必须退回通过输出 缓冲区以便看到更低的数字. 这样效率更高, 如何255行被分割成5栏52行的话就更容易 阅读。

/* * Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : NJCIT * Version : 2.0 */ #include main() { int i; printf(\printf(\for (i=1; i<=51; i++) { if (i < 32) printf(\else printf(\printf(\, i+51, i+51, i+51, i+102, i+102, i+102); printf(\, i+153, i+153, i+153, i+204, i+204, i+204); } return(0); } 第六步打印一些边框

现在,假如需要的话,我们有一个可以在一张A4纸上合理的打印ASCII的图表,我们 现在需要做的是给一张表格用一个扩展ASCII特殊字符制作一个边框。 /* * Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : NJCIT * Version : 2.1 */ #include main() { int i, a; for (a=0; a<71; a++) printf(\ printf(\printf(\printf(\for (a=0; a<71; a++) printf(\printf(\

第七步 将一些通用的功能转换成函数(进阶)

最后的阶段是介绍一个简单函数的概念,一个方法一个C源程序的一个模块,这个模块可以在项目的任何地方被调用(包括函数的内部)。

我们从最后一步了解到,一段代码被重复使用了三次,这将是一个方法的理想条件。 /* Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : NJCIT * Version : 2.2 */ #include void pretty_line() {int a; for (a=0; a<71; a++) { printf(\ } printf(\ return; } main() {int i; /* Print the top border line */ pretty_line(); /* Print the heading */ printf(\ printf(\ /* Print the middle border line */ pretty_line(); for (i=1; i<=51; i++) { if (i < 32) printf(\ else printf(\= %3x < | = %3x < \i+51, i+51, i+51, i+102, i+102, i+102); printf(\ printf(\= %3x < | = %3x < |\\n\i+153, i+153, i+153, i+204, i+204, i+204); } /* Print the bottom border line */ pretty_line(); return(0); }

第八步 扩展打印函数的边界 (进阶)

这一点它看起来不错,为了使用合适的拐角和分隔栏获得一个专业的边框,我们必须去 使用一些扩展字符中的特殊字符。 以下是三种类型的线条是必要的: ??顶线

??标题下的线条 (中间线条) ??底线

一个方法可以有一个通过调用时传入的参数,参数可以是任何类型的(在topic2中讨 论),我们就指派一个整数类型作为第一个参数,调用的线条类型如下: ??0 是顶线 ??1 是中线 ??2 是底线

现在,我们观察每一个线条,除了第一个、最后一个和和分栏符,它们基本相同。 我们将使用一个例子去选择线条的样式,通过一个变量来改变调用的左右中的符号。 最后,我们可以使用嵌套的三个操作打印线条,实际打印的符号是否是根据第一条 (a=0)、是否是最后一条(a=70)或者是否是栏分割位置(a % 14 == 0)。 /* * Title : Print Standard and Extended ASCII chart * Source : print_ascii.c * Author : NJCIT * Version : 3.0 */ #include /* * This function prints a line accros the screen. * The line can be one of the following types: * line_type = 0 - The top line * line_type = 1 - The middle line * line_type = 2 - the bottom line */ void pretty_line(int line_type) { char left_char, right_char, mid_char; char ext_char; int a; /* Set left, right and mid characters depending on line type */ switch (line_type) { case 0: /* Top line */ left_char = 213; right_char = 184; mid_char = 209; break; case 1: /* Middle line */

left_char = 198; right_char = 181; mid_char = 216; break; case 2: /* Bottom line */ left_char = 212; right_char = 190; mid_char = 207; break; default: /* Invalid argument passed to us. */ left_char = ‘-’; right_char = ‘-’; mid_char = ‘+’; } for (a=0; a<71; a++) { (a==0)? left_char:(a==70)?right_char:(a % 14== 0) ? mid_char : 205; ext_char= printf(\ } printf(\ return; } main() {int i; /* Print the top border line */ pretty_line(0); /* Print the heading */ printf(\ printf(\ /* Print the middle border line */ pretty_line(1); /* Print the ASCII table */ for (i=1; i<=51; i++) { if (i < 32) printf(\ else printf(\= %3x < | = %3x < \i+51, i+51, i+51, i+102, i+102, i+102); printf(\ printf(\= %3x < | = %3x < |\\n\, i+153, i+153, i+153, i+204, i+204, i+204); } /* Print the bottom border line */ pretty_line(2); return(0); }

最终结果

第8次课 1.编程题

(1)将输入数组a[n]中的n个元素,再输入另一个数x,查看a中是否有值为x的元素,若有,则输出其下标,若没有,则输出-1。 #include \#define N 10 int main(void) {

int a[N],x,i,k;

printf(\for(i=0;i

scanf(\printf(\scanf(\k=-1;

for(i=0;i

printf(\ }

if(k==-1)printf(\getch(); }

(2) 输入10个互不相同的数,将10个整数按升序排列输出,并且奇数在前,偶数在后。如果输入的10个数是:10 9 8 7 6 5 4 3 2 1 ,则输出:1 3 5 7 8 2 4 6 8 10。(编程提示:可利用2个数组变量,一个用来存放输入的整数,输入后,对这个数组进行排序,然后将数据复制到另一个数组中,先复制奇数再复制偶数)。 #include \#define N 10 main( ) {

int f[10],a[10]; int i,j,k;

printf(\for(i=0;i

scanf(\for(i=0;i<=8;i++) {

for(j=i+1;j<10;j++) if(f[i]>f[j])

{ k=f[i]; f[i]=f[j]; f[j]=k;} }

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

printf(\for(i=0,j=0;i<=9;i++)

if(f[i]%2==1)a[j++]=f[i]; for(i=0;i<=9;i++)

if(f[i]%2==0)a[j++]=f[i]; for(i=0;i<=9;i++)

printf(\getch(); }

(3)求数组int a[n]中奇数的个数和平均值,以及偶数个数和平均值。

#include \#define N 10 int main(void) {

int a[N],i,num_o=0,num_e=0,sum_o=0,sum_e=0;; printf(\for(i=0;i

scanf(\for(i=0;i

num_e++;

sum_e+=a[i]; } else {

num_o++;

sum_o+=a[i]; }

printf(\)sum_o/num_o); getch(); }

(4)编写一个程序,其功能是给一维数组a输入任意6个整数,假设为:5 7 4 8 9 1,然后建立一个具有以下内容的方陈,并打印出来(屏幕输出)。

5 7 4 8 9 1 1 5 7 4 8 9 9 1 5 7 4 8 8 9 1 5 7 4 4 8 9 1 5 7 7 4 8 9 1 5

#include \#define N 6 int main(void) {

int a[N],i,j;

printf(\for(i=0;i

scanf(\for(i=0;i

for(j=0;j

printf(\ printf(\ } getch(); }

(5) 找出一个二位数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。 #include \#define M 5 #define N 5

int main(void) {

int a[M][N],i,j,k,line,colum; for(i=0;i

for(j=0;j

printf(\ scanf(\ }

for(i=0;i

colum=0;

for(j=1;j

if(a[i][j]>a[i][colum])colum=j;

line=i;

for(k=0;k

if(a[k][colum]

if(line==i) printf(\ } getch(); 2.选择题

(1) 在C语言中,引用数组元素时,其数组下标的数据类型允许是 。

A)整型常量 B)整型表达式

C)整形常量或整形表达式 C)任何类型的表达式

(2) 以下对一维整型数组a的正确说明是 。

A)int a(10) ; B)int n=10,a[n]; C)int n; D)#define SIZE 10 scanf(“%d”,&n); int a*SIZE+; int a[n];

( 3) 若有定义:int a[10],则对数组a元素的正确引用是 。

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

(4) 以下能对一维数组a进行正确初始化的语句是 。

A)int a[10]={0,0,0,0,0}; B)int a[10]={} ; C)int a[ ] = {0} ; D)int a[10]={10*1} ;

(5) 若有定义:int a[3][4],则对数组a元素的正确引用是 。无

A)a[2][4] B)a[1,3] C)a(5) D)a[10-10]

(6) 以下能对二维数组a进行正确初始化的语句是 。

A)int a[2][]={{1,0,1},{5,2,3}} ; B)int a[][3]={{1,2,3},{4,5,6}} ; C)int a[2][4]={{1,2,3},{4,5},{6}} ; D)int a[][3]={{1,0,1},{},{1,1}} ;

(7) 若有说明:int a[3][4]={0};则下面正确的叙述是 。

A)只有元素a[0][0]可得到初值0 B)此说明语句不正确

C)数组a中各元素都可得到初值,但其值不一定为0 D)数组a中每个元素均可得到初值0

(8) 若有说明:int a[][4]={0,0};则下面不正确的叙述是 。

A)数组a的每个元素都可得到初值0 B)二维数组a的第一维大小为1

C)因为二维数组a中第二维大小的值除以初值个数的商为1,故数组a的行数为1 D)只有元素a[0][0]和a[0][1]可得到初值0,其余元素均得不到初值0

(9) 若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为 。(设a[0][0]位于数组的第一个位置上)

A)i*m+j B)j*m+i C)i*m+j-1 D)i*m+j+1

(10) 若有说明:int a[][3]={1,2,3,4,5,6,7};则数组a第一维大小是 。

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

(11) 下面程序段的输出结果是 。

int k,a[3][3]={1,2,3,4,5,6,7,8,9}; for (k=0;k<3;k++) printf(“%d”,a*k+*2-k]);

A)3 5 7 B)3 6 9 C)1 5 9 D)1 4 7

第9次课 1.编程题

(1)统计输入的一串字符(“假设以‘\\n’结束”)中,大写字母A,B,...,Z各出现的次数。(提示,用一个数组count[26]计数各个字母出现的次数,count[0]表示A出现的次数,count[1]表示B出现的次数,...,count[25]表示字母Z出现的次数。初始时count的各元素值为0。以后,每读入一个字符ch ,若它是一个大写字母,就让相应计数单元count[ch-'A']加1。)

#include \int main(void) {

int count[26],i;

char s[100];

for(i=0;i<26;i++) count[i]=0; printf(\scanf(\

for(i=0;s[i]!=0;i++) {

if(s[i]>='A' && s[i]<='Z'); count[s[i]-'A']++; }

for(i=0;i<26;i++) {

printf(\ } getch(); }

(2)编写一个程序将两个字符串连接起来,不要用strcat函数。 #include \#define str1_long 10 #define str2_long 10 int main(void) {

int i,j;

char str1[str1_long]=\printf(\for(i=0;str1[i]!=0;i++) ;

for(j=0;str2[j]!=0;j++,i++)str1[i]=str2[j]; printf(\getch(); } 2.选择题

(1)下面是对s的初始化,其中不正确的是 。

A)char s*5+=,“abc”-; B)char s*5+=,‘a’,’b’,’c’-; C)char s*5+=” ”; D)char s*5+=”abcdef”;

(2)下面程序段的输出结果是 。

char c*5+=,‘a’,’b’,’\\0’,’c’,’\\0’}

printf(“%s”,c);

A)’a’’b’ B)ab C)ab c D)abc

(3)若有程序段:

int k,a[3][3]={1,2,3,4,5,6,7,8,9}; for (k=0;k<3;k++) printf(“%d”,a*k+*2-k]); 则以下叙述正确的是 。

A)a与b数组完全相同 B)a与b长度相同 C)a和b中都存放字符串 D)a数组比b数组长度长

(4)有两个字符数组a,b,则以下正确的输入语句是 。

A)gets(a,b); B)scanf(“%s%s”,a,b); C)scanf(“%s%s”,&a,&b); D)gets(“a”),gets(“b”);

(5)下面程序段的输出结果是 。

char a*7+=”abcdef”; char b*4+=”ABC”; strcpy(a,b); printf(“%c”,a*5+);

A) B)\\0 C)e D)f

(6)下面程序段的输出结果是 。

char c* +=”\\t\\v\\\\\\0will\\n”; printf(“%d”,strlen(c));

A)14 B)3 C) 9 D)6

(7)判断字符串a和b是否相等,应当使用 。D

A)if (a==b) B)if (a=b) C)if (strcpy(a,b)) D) if (strcmp(a,b))

(8)判断字符串a是否大于b,应当使用 。D

A)if (a>b) B)if (strcmp(a,b)) C)if (strcmp(b,a)>0) D)if (strcmp(a,b)>0)

(9)下面叙述正确的是 。D

A)两个字符串所包含的字符个数相同时,才能比较字符串

B)字符个数多的字符串比字符个数少的字符串大 C)字符串”STOP ”与”STOP”相等 D)字符串”That”小于字符串”The”

(10)下面有关字符数组的描述中错误的是 。C

A)字符数组可以存放字符串 B)字符串可以整体输入,输出

C)可以在赋值语句中通过赋值运算对字符数组整体赋值 D)不可以用关系运算符对字符数组中的字符串进行比较

(11)下面程序的输出结果是 。A

main ( )

, char ch*7+=”12ab56”; int i,s=0;

for (i=0;ch*i+>’0’&&ch*i+<=’9’;i+=2) s=10*s+ch[i]-‘0’; printf(“%d\\n”,s); }

A)1 B)1256 C)12ab56 D)ab

(12)下面程序的输出结果是 。

main ( ) {

char str* +=”SSWLIA” , C; int k;

for (k=2;(c=str*k+)!=’\\0’;k++) , switch (c) {

case ‘I’ : ++k; break ; case ‘L’: continue;

default : putchar(c) ; continue ; }

putchar(‘*’); }

}

A)SSW B)SW* C)SW*A D)SW

第10、11次课

无,应为W*

1.编程题

(1)编写一个判断一个数是否是素数的函数,若是返回1,否则返回0。 int pn( int n)

{int i; int flag; /*素数标志*/ flag=1;

for(i=2; i<=n/2; i++)

if (n%i==0){flag=0; break; } return(flag); }

(2)编写一个函数,计算下面算式前100项之和,并将计算结果返回到主调函数。 1+1/3+1/5+1/7+...... #include \float seri_sum(int a) {

int i; float f=0;

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

f=f+1.0/(i*2.0-1); return(f); }

main() {

int i=100; float sum;

sum=seri_sum(i);

printf(\getch(); }

(3)编写一个函数,找出数组a[n]中最大元素和最小元素所在的下标,并返回给主调函数。 #include \#define N 10

void find(int b[N],int *maxip,int *minip) {

int max_i,min_i,k,max,min; max_i=0; max_i=0;

max=min=b[0]; for(k=1;k

if (b[k]>max){max=b[k];max_i=k;} if (b[k]

*maxip=max_i; *minip=min_i; return; }

main() {

int a[N]={23,5,6,33,71,4,76,122,54,24},maxi,mini; find(a,&maxi,&mini);

printf(\getch(); }

(4)有一个数组,内放10个学生的成绩,写一个函数,求出平均分,并且打印出高于平均分的成绩。

#include \#define N 10

float avr(int b[N]) {

int k,sum=0; for(k=1;k

return((float)sum/N); }

main() {

int a[N]={89,65,46,33,71,84,76,82,74,64},i; float av; av=avr(a);

printf(\for(i=0;i

if(a[i]>av)printf(\getch(); }

2.填空、选择题

(1)C语言函数返回类型的默认定义类型是 整型 。 (2)函数的实参传递到形参有两种方式: 数值 和 地址 。

(3)在一个函数内部调用另一个函数的调用方式称为 函数嵌套 。在一个函数内部直接或

间接调用该函数成为函数 递归 的调用方式。

(4)以下正确的函数定义是。D

A)double fun(int x, int y) B)double fun(int x,y) { z=x+y ; return z ; } { int z ; return z ;} C)fun (x,y) D)double fun (int x, int y) { int x, y ; double z ; { double z ; z=x+y ; return z ; } return z ; }

(5)以下正确的说法是。A

A)实参和与其对应的形参各占用独立的存储单元 B)实参和与其对应的形参共占用一个存储单元

C)只有当实参和与其对应的形参同名时才共占用相同的存储单元 D)形参时虚拟的,不占用存储单元

(6)以下正确的函数定义是 。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)

(7)若调用一个函数,且此函数中没有return语句,则正确的说法是 。A

A)该函数没有返回值

B)该函数返回若干个系统默认值 C)能返回一个用户所希望的函数值 D)返回一个不确定的值

(8)以下不正确的说法是。B

A)实参可以是常量,变量或表达式 B)形参可以是常量,变量或表达式 C)实参可以为任意类型

D)如果形参和实参的类型不一致,以形参类型为准

(9)以下程序由语法错误,有关错误原因的正确说法是。C

A)语句void prt_char( );有错,它是函数调用语句,不能用void说明 B)变量名不能使用大写字母

C)函数说明和函数调用语句之间有矛盾 D)函数名不能使用下划线

(10)C语言规定,函数返回值的类型是由 决定的。D

A)return语句中的表达式类型 B)调用该函数时的主调函数类型 C)调用该函数时由系统临时 D)在定义函数时所指定的函数类型

(11)以下正确的描述是。 B

A)函数的定义可以嵌套,但函数的调用不可以嵌套 B)函数的定义不可以嵌套,但函数的调用可以嵌套 C)函数的定义和函数的调用均不可以嵌套 D)函数的定义和函数的调用均可以嵌套

(12)若用数组名作为函数调用的实参,传递给形参的是。A

A)数组的首地址 B)数组中第一个元素的值 C)数组中的全部元素的值 D)数组元素的个数

(13) 假设调用函数有以下定义和函数f调用,则函数f中对形参数组错误定义的是。B

char c*5+=,‘a’,’b’,’\\0’,’c’,’\\0’-; printf(“%s”,c);

A)f(int array[][6]) B)f(int array[3][]) C)f(itn array[][4]) D)f(int array[2][5])

(14)下面程序的输出是。A

int i=2 ;

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

A) 8,4,2 B)8,4,3 C)4,4,5 D)4,5,6 (15) 已知一个函数的定义如下:D

double fun(int x, double y) , …… -

则该函数正确的函数原型声明为:

A)double fun (int x,double y) B)fun (int x,double y) C)double fun (int ,double ); D)fun(x,y) ;

(16) 关于函数声明,以下不正确的说法是。C

A)如果函数定义出现在函数调用之前,可以不必加函数原型声明

B)如果在所有函数定义之前,在函数外部已做了声明,则各个主调函数不必再做函数原型声明 C)函数再调用之前,一定要声明函数原型,保证编译系统进行全面的调用检查 D)标准库不需要函数原型声明

第12、13次课

1.选择、填空题

(1)以下不正确的说法是 。D

A)全局变量,静态变量的初值是在编译时指定的 B)静态变量如果没有指定初值,则其初值为0 C)局部变量如果没有指定初值,则其初值不确定

D)函数中的静态变量在函数每次调用时,都会重新设置初值

(2)以下不正确的说法是。C

A)register变量可以提高变量使用的执行效率

B)register变量由于使用的是CPU的寄存器,其数目是有限制的 C)extern变量定义的存储空间按变量类型分配

D)全局变量使得函数之间的“耦合性”更加紧密,不利于模块化的要求

(3)变量的指针,其含义是指该变量的__B____.

a)值 b)地址 c)名 d)一个标志 2.若有

(4)若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是__D___.

a)a,point,*&a b)&*a,&a,*point c)*&point,*point,&a d)&a,&*point ,point

(5)若有说明;int *p,m=5,n;以下正确的程序段的是__C、D__.

a)p=&n; b)p=&n;

scanf(\scanf(\ c)scanf(\d)p=&n; *p=n; *p=m;

(6)若有以下定义,则对a数组元素的正确引用是___D_____.

int a[5],*p=a;

a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)

(7)若有以下定义,则p+5表示__A___.

int a[10],*p=a;

a)元素a[5]的地址 b)元素a[5]的值 c)元素a[6]的地址 d)元素a[6]的值

(8)C语言变量按其作用域分为全局变量和 局部变量。按其生存期分为 静态 和 动态 。 (9)C语言变量的存储类别有 auto , register , static 和 extern 。 (10)凡在函数中未指定存储类别的局部变量,其默认的存储类别为 auto 。

(11)在一个C程序中,若要定义一个只允许本源程序文件中所有函数使用的全局变量,则该变量需要定义的存储类别为 static 。

(12)变量被赋初值可以分为两个阶段:即 和 。 (13)以下程序的输出结果是(x= 93)

#define A 3 #define B(a) ((A+1)*a) Main() { int x; x=3*(A+B(7)); printf(“x=M\\n”,x) }

(14)以下程序的输出结果是(212)

#define power(x) ((x)*(x)) main() { int i=1; while(i<=4)

printf(“%d”,power(i++)); }

(16)若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是__2___. __12_____.

*(a+5)的值是

a)元素a[5]的地址 b)元素a[5]的值 c)元素a[6]的地址 d)元素a[6]的值

(8)C语言变量按其作用域分为全局变量和 局部变量。按其生存期分为 静态 和 动态 。 (9)C语言变量的存储类别有 auto , register , static 和 extern 。 (10)凡在函数中未指定存储类别的局部变量,其默认的存储类别为 auto 。

(11)在一个C程序中,若要定义一个只允许本源程序文件中所有函数使用的全局变量,则该变量需要定义的存储类别为 static 。

(12)变量被赋初值可以分为两个阶段:即 和 。 (13)以下程序的输出结果是(x= 93)

#define A 3 #define B(a) ((A+1)*a) Main() { int x; x=3*(A+B(7)); printf(“x=M\\n”,x) }

(14)以下程序的输出结果是(212)

#define power(x) ((x)*(x)) main() { int i=1; while(i<=4)

printf(“%d”,power(i++)); }

(16)若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是__2___. __12_____.

*(a+5)的值是

本文来源:https://www.bwwdw.com/article/47zr.html

Top