Presentation is loading. Please wait.

Presentation is loading. Please wait.

C语言实验 第二课.

Similar presentations


Presentation on theme: "C语言实验 第二课."— Presentation transcript:

1 C语言实验 第二课

2 作业1 按“体指数BMI值”对身材进行划分: 体指数t = w / h2 (体重w单位为公斤,身高h单位为米)
编程从键盘输入你的身高h和体重w,根据给定公式计算体指数t,然后判断你的身材属于何种类型。 可用3种方法编程: 算法1:用在if子句中嵌入if 语句的形式编程 算法2:用在else子句中嵌入if 语句的形式编程 算法3:用switch语句的形式编程

3 作业2 打印九九乘法表

4 作业3 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。如,按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第四个字母,W变成A,X变成B,Y变成C,Z变成D。非字母不变。 提示:首先提供两个选择编码还是解码。然后从键盘读取需加密或解密的文字,直到遇到回车为止 B C D Z Y W E F A X China! 转变为: Glmre!

5 需提交的作业 猜数字的小游戏!!!

6 猜数游戏 需求分析 电脑随机想一个数,四位 用户从键盘输入一个数,系统进行判断 允许用户多次输入,直至猜对或大于十次为止
每一位的取值均在0-9之间。 要求首位可以是0。 要求四位数各不相同。 用户从键盘输入一个数,系统进行判断 用户输入的数可以直接连写0863,也可用空格分隔 如果输入的数数字正确,位置也正确,则记为A。 如果输入的数数字正确,位置不正确,则记为B。 判断的结果以*A*B显示。 允许用户多次输入,直至猜对或大于十次为止

7 电脑来想 电脑生成随机数的函数 为了每次运行生成不同的随机数序列,使用 每一位取值都在0-9之间 首位可以为0 四个数各不相同
#include <stdlib.h>中的rand( )函数 为了每次运行生成不同的随机数序列,使用 srand(time(NULL))设置随机数种子 每一位取值都在0-9之间 a=rand()%10; 首位可以为0 不能用一个四位的十进制整数来表示。只能用四个一位的十进制数的来表示。 四个数各不相同 b=rand()%10; while(b==a) do {b=rand()%10;} while(b==a); 这里不能有;

8 我们来猜 用户输入的数可以连写,也可用空格回车或Tab分隔 例如0836或者0 8 6 3均可
例如0836或者 均可 最好不要强迫用户每次只输入 1个数字 ,或者强迫用户以逗号分隔输入。 必须的情况下也应在scanf前使用printf语句给出足够的提示信息。 常见的 scanf("%d%d%d%d",&guess1,&guess2,&guess3,&guess4); scanf("%d,%d,%d,%d",&guess1,&guess2,&guess3,&guess4); scanf("%d%1s%d%1s%d%1s%d%1s",&e,&f,&g,&h); 实际上我们只需要使用下面这条语句即可 scanf("%1d%1d%1d%1d",&guess1,&guess2,&guess3,&guess4);

9 电脑判断 如果输入的数数字正确,位置也正确,则记为A。 如果输入的数数字正确,位置不正确,则记为B。 判断的结果以*A*B显示。
if(num1==a) num_of_A++; if(num1==b) num_of_B++; if(num1==c) if(num1==d) if(num1==a) num_of_A++; else if(num1==b) num_of_B++; else if(num1==c) else if(num1==d) if (num1==a) num_of_A++; else if(num1== b|| num1== c||num1== d) num_of_B ++; else if (num1=b||c||d) num_of_B++;

10 多次猜测 允许用户多次输入,直至猜对或大于十次为止 当跳出循环时,需要判断是由于何种原因跳出
使用循环 num_of_A!=4 count<10 while(count<10)&&(num_of_A!=4) while((count<10)&&(num_of_A!=4)) 当跳出循环时,需要判断是由于何种原因跳出 这仅仅是一种解决方案。 while(count<10)循环中,如果猜正确了就使用break提前跳出循环也可以达到一样的效果。

11 其他问题 1.良好的代码可读性,注释和缩进 2.变量的命名规则 3.调试 4.测试 阅读编译错误提示 双击可对编译错误进行定位
使用printf语句增加额外的输出,便于查找错误 大家一起来抓虫! 4.测试

12 密码机 选择加密或解密 从键盘读取明文(用于加密)或密文(用于解密) 判断是否字母,是则进行转换 输出加密或解密后的结果 是否继续工作?
使用变量flag 1表示加密,2表示解密 从键盘读入flag的值 从键盘读取明文(用于加密)或密文(用于解密) 一串字符进行转换 字符数组或getchar( )函数 判断是否字母,是则进行转换 (c>='a'&&c<='z')||(c>='A'&&c<='Z') 注意加密时w,x,y,z转换成a,b,c,d;解密时也有类似问题 输出加密或解密后的结果 putchar( ) 是否继续工作?

13 密码机程序的注意问题 选择加密或解密时,如果用户输入的值既不是1也不是2的处理
getchar( )函数的特殊性:会把输入结束后的回车当成getchar()的输入。 scanf("%d",&flag); putchar(getchar( )+4); 如何解决?

14 程序示例 if (flag==1) /*用于加密*/ { printf("please enter your plaintext and end with enter:\n"); c=getchar(); while (c!='\n') if((c>='a'&&c<'w') ||(c>='A'&&c<'w')) putchar(c+4); else if ((c>='w'&&c<='z')||(c>='W'&&c<='Z')) putchar(c+4-26); else putchar(c); /*非字符直接输出*/ } putchar('\n');

15 程序实例 else if (flag==2) { printf("please enter your crypttext and end with enter:\n"); for (c=getchar();c!='\n';c=getchar()) if((c>='e'&&c<'z')||(c>='E'&&c<'Z')) putchar(c-4); else if ((c>='a'&&c<'e')||(c>='a'&&c<'E')) putchar(c-4+26); else putchar(c); putchar('\n'); }

16 关于代码风格问题 缩进(indent)—保证代码整洁、层次清晰的主要手段 #include<math.h> main()
{int i; for (i=2;i<100;i++) {if(isprime(i)) printf("%d\t",i); } } int isprime(int n) {int k,i; k=sqrt((double)n); for (i=2;i<=k;i++) {if(n%i==0) return 0;} return 1; }

17 关于代码风格问题 良好风格的程序应严格采用梯形层次对应好各层次 #include <math.h> main() {
int i; for (i=2; i<100; i++) if (isprime(i)) printf("%d\t",i); } int isprime(int n) { int k, i; k = sqrt((double)n); for (i=2; i<=k; i++) if (n % i == 0) return 0; } return 1;

18 程序调试

19 程序中常见的出错原因 编译错误 指在编译过程中发现的错误,通常属于语法错误,即编写的语句不符合C语言的语法规则。
Undefined symbol ‘xxx’ 标识符xxx未定义 Expression syntax error 表达式语法错误 Too few parameter in call 函数调用时的实参少于函数的形参

20 程序中常见的出错原因 运行错误 指在程序运行时发生的错误
往往是由于语义上的错误造成的,即语句虽然合乎语法,但要求计算机去做不该做或做不到的事情。 例如当用0做除数时

21 程序中常见的出错原因 逻辑错误 程序中有逻辑错时,不影响程序运行并得到运行结果,只是运行结果不正确。比较隐蔽,出错后不易查找。
累加求和运算时,累加和变量忘记了赋初值; 累乘运算时,累乘变量初值赋值为0; 函数声明时的返回值数据类型与实际返回的数据类型不一致,导致自动类型转换 数组下标越界(即超出了定义的范围); 程序中存在死循环;

22 调试的基本方法 细心+耐心 注释掉一些代码 利用printf语句 利用调试工具
减少有关的代码区域,调试无误后再将它们取消注释,即采用分而治之的策略将问题局部化 利用printf语句 观看屏幕输出结果 利用调试工具 逐条语句跟踪

23 常见错误 关系运算符== 错写成赋值运算符= if (a = b) printf("yes"); /*运行结果错误*/
Warning:Possibly incorrect assignment in function main if (a == b) printf("yes"); /*正确*/ = 表示赋值操作 == 表示比较是否相等的操作

24 常见错误 while后面有分号 for后的表达式2省略 while (n < 100); { …… n++; }
循环体为空语句,导致死循环 for后的表达式2省略 for (n=1; ;n++) /*死循环*/

25 常见错误 判断字符是大写字符或者小写字符 判断字符是数字字符
('a' <= ch <= 'z') || ('A' <= ch <= 'Z') (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z') /*正确*/ 判断字符是数字字符 ‘0’ <= ch <= ‘9’ ch >= '0' && ch <= '9' /*正确*/

26 常见错误 数据类型由高向低赋值时,进行类型转换后导致信息丢失 double a, b; int sum; sum = a + b;
warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data


Download ppt "C语言实验 第二课."

Similar presentations


Ads by Google