第5章 循环结构程序设计 5.1 为什么需要循环控制 5.2 用while语句实现循环 5.3 用do---while语句实现循环

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
10.2.switch语句.
《C语言程序设计》复习
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
循环模式 流程图的画法: 条件 y 循环体 伪代码: n Do while 条件 循环体 loop 每个循环模式的结构都是一个入口,一个出口.
第六章 循环控制.
C语言实验 第二课.
C语言实验 第一课 标题:学号+姓名.
数学建模与MATLAB 第五讲:循环结构(1) 2017/9/12.
第3章 While循环程序设计.
第4章 循环结构 程序设计 本章主讲 李俊萩 计算机编程导论.
C语言程序设计教程 (第4版) 第5章 循环结构 李丽娟 2013年2月.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
C语言程序设计 第八章 函数.
C#程序设计基础 $5 流程控制.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
C程序设计.
第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar()
C++程序设计 第二讲 清华大学软件学院.
第 四 章 循环结构 while语句 do {} while 语句 break和continue语句
循环结构 NEAU ACM-ICPC TEAM 主讲人:NEAU_ACM_Team.
第3章 C语言的基本语句 和程序结构设计.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
走进编程 程序的顺序结构(二).
Introduction to the C Programming Language
第六章 循环结构程序设计 概述 while 语句 do-while 语句 for 语句 循环的嵌套 几种循环的比较
C语言 程序设计基础与试验 刘新国、2012年秋.
第3章 程序设计初步 第4章 函数与预处理 第5章 数组 第6章 指针 第7章 自定义数据类型
第五章 循环结构的C程序设计 5.1 while循环语句 5.2 do-while循环语句 5.3 for循环语句 5.4 多重循环
第二章 Java语言基础.
計數式重複敘述 for 迴圈 P
第六章 循环控制.
第3章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 3.1 格式化输出——printf()函数 3.2 格式化输入——scanf()函数.
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4章 PHP流程控制语句.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言概述 第一章.
程式結構&語法.
第 二 章 数据类型、运算符与表达式.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
C语言程序设计.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
目录 5.1循环结构程序设计的概述 5.2 用while语句实现循环结构程序设计 5.3 用do-while语句实现循环结构程序设计
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
《计算机应用基础》 第9章 程序设计基础(二).
第4章 Excel电子表格制作软件 4.4 函数(一).
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
第九节 赋值运算符和赋值表达式.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
College of Computer Science & Technology
第4课时 绝对值.
1.2基本算法语句 1.2.3循环语句.
输入语句 输出语句 赋值语句 条件语句 循环语句
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
程序设计基础.
第4章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 4.1 格式化输出——printf()函数 4.2 格式化输入——scanf()函数.
本节内容 指针类型.
第七章  数 组.
五 循环结构程序设计 厦大附中信息技术.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
函式庫補充資料 1.
C语言基础学习 从外行到入门.
Presentation transcript:

第5章 循环结构程序设计 5.1 为什么需要循环控制 5.2 用while语句实现循环 5.3 用do---while语句实现循环 5.4 用for 语句实现循环 5.5 循环的嵌套 5.6 几种循环的比较 5.7 改变循环执行的状态 5.8 循环程序举例

5.1为什么需要循环控制 在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题 要向计算机输入全班50个学生的成绩 分别统计全班50个学生的平均成绩 求30个整数之和 教师检查30个学生的成绩是否及格

5.1为什么需要循环控制 例如:全班有50个学生,统计各学生三门课的平均成绩。

重复50次 输入学生1的三门课成绩,并计算平均值后输出 scanf(“%f,%f,%f”,&s1,&s2,&s3); aver=(s1+s2+s3)/3; printf(“aver=%7.2f”,aver); 输入学生2的三门课成绩,并计算平均值后输出 scanf(“%f,%f,%f”,&s1,&s2,&s3); aver=(s1+s2+s3)/3; printf(“aver=%7.2f”,aver); 要对50个学生进行相同操作 重复50次

大多数的应用程序都会包含循环结构 循环结构和顺序结构、选择结构是结构化程序设计的三种基本结构,它们是各种复杂程序的基本构造单元

5.2用while语句实现循环 全班有50个学生,统计各学生三门课的平均成绩。

用while循环结构实现 i=1 N i≤0 while(i<=50) { scanf…… ; Y aver=…… ; printf…… ; i++; } Y 输入一个学生成绩 求一个学生平均成绩 输出一个学生平均成绩 i增1

while语句的一般形式如下: while (表达式) 语句 循环体

while语句的一般形式如下: while (表达式) 语句 while循环的特点是: 先判断条件表达式,后执行循环体语句 循环条件表达式 “真”时执行循环体语句 “假”时不执行 while循环的特点是: 先判断条件表达式,后执行循环体语句

例5.1求1+2+3+…+100,即 解题思路: 这是累加问题,需要先后将100个数相加 要重复100次加法运算,可用循环实现 加完上一个数i后,使i加1可得到下一个数

#include <stdio.h> int main() { int i=1,sum=0; while (i<=100) { sum=sum+i; i++; } printf("sum=%d\n",sum); return 0; 不能少 复合语句

#include <stdio.h> int main() { int i=1,sum=0; while (i<=100) { sum=sum+i; i++; } printf("sum=%d\n",sum); return 0; 不能丢,否则循环永不结束

5.3用do---while语句实现循环 do---while语句的特点:先无条件地执行循环体,然后判断循环条件是否成立 循环体语句 Y 表达式 N

5.3用do---while语句实现循环 例5.2 用do…while语句求: 1+2+3+…+100,即

5.3用do---while语句实现循环 解题思路: i=1; sum=0; sum=0 do i=1 { sum=sum+i; i++; Y i ≤100 N

#include <stdio.h> int main() { int i=1,sum=0; do { sum=sum+i; i++; }while(i<=100); printf("sum=%d\n",sum); return 0; }

例5.3 while和do---while循环的比较。 int i,sum=0; printf(“i=?”); scanf(“%d”,&i); while(i<=10) { sum=sum+i; i++; } printf(“sum=%d\n",sum); int i,sum=0; printf(“i=?”); scanf(“%d”,&i); do { sum=sum+i; i++; }while(i<=10); printf(“sum=%d\n",sum);

5.4用for 语句实现循环 for语句不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况 for语句完全可以代替while语句

5.4用for 语句实现循环 i=1 N i ≤100 Y 输出i i=i+1 for (i=1;i<=100;i++) { printf("%d ", i ); } N i ≤100 Y 输出i i=i+1

5.4用for 语句实现循环 for语句的一般形式为 for(表达式1;表达式2;表达式3) 语句 设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值执行

5.4用for 语句实现循环 for语句的一般形式为 for(表达式1;表达式2;表达式3) 语句 循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环

5.4用for 语句实现循环 for语句的一般形式为 for(表达式1;表达式2;表达式3) 语句 作为循环的调整器,例如使循环变量增值,它是在执行完循环体后才进行的

5.4用for 语句实现循环 for语句的执行过程: (1) 先求解表达式1 (2) 求解表达式2,若其值为真,执行循环体,然后执行下面第(3)步。若为假,则结束循环,转到第(5)步 (3) 求解表达式3 (4) 转回上面步骤(2)继续执行 (5) 循环结束,执行for语句下面的一个语句

5.4用for 语句实现循环 for(i=1;i<=100;i++) sum=sum+i; 等价于 i=1; while(i<=100) { i++; } 用for语句更简单、方便

5.4用for 语句实现循环 for(表达式1;表达式2;表达式3) 语句 一个或两个或三个表达式均可以省略

5.4用for 语句实现循环 for (sum=0 ; i<=100; i++) sum=sum+i; 与循环变量无关 合法

5.4用for 语句实现循环 for(sum=0,i=1 ; i<=100; i++) sum=sum+i; for(i=0,j=100 ; i<=j; i++,j-- ) k=i+j; 逗号表达式 合法

5.4用for 语句实现循环 合法 for(i=0; (c=getchar())!=’\n′; i+=c) ; for( ; (c=getchar())!=’\n’; ) printf(″%c″,c); 合法

5.5循环的嵌套 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套 内嵌的循环中还可以嵌套循环,这就是多层循环 3种循环(while循环、do…while循环和for循环)可以互相嵌套

5.6几种循环的比较 (1)一般情况下,3种循环可以互相代替 (2) 在while和do---while循环中,循环体应包含使循环趋于结束的语句。 (3) 用while和do---while循环时,循环变量初始化的操作应在while和do---while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。

5.7 改变循环执行的状态 5.7.1 用break语句提前终止循环 5.7.2 用continue语句提前结束本次循环

5.7.1 用break语句提前终止循环 break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句

5.7.1 用break语句提前终止循环 例5.4 在全系1000学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目。

5.7.1 用break语句提前终止循环 编程思路: 循环次数不确定,但最多循环1000次 在循环体中累计捐款总数 用if语句检查是否达到10万元 如果达到就不再继续执行循环,终止累加 计算人均捐款数

5.7.1 用break语句提前终止循环 编程思路: 变量amount,用来存放捐款数 变量total,用来存放累加后的总捐款数 变量aver,用来存放人均捐款数 定义符号常量SUM代表100000

#include <stdio.h> #define SUM 100000 int main() { float amount,aver,total; int i; for (i=1,total=0;i<=1000;i++) { printf("please enter amount:"); scanf("%f",&amount); total= total+amount; if (total>=SUM) break; } aver=total / i ; printf(“num=%d\naver=%10.2f\n“ ,i,aver); return 0; 指定符号常量SUM代表100000

#include <stdio.h> #define SUM 100000 int main() { float amount,aver,total; int i; for (i=1,total=0;i<=1000;i++) { printf("please enter amount:"); scanf("%f",&amount); total= total+amount; if (total>=SUM) break; } aver=total / i ; printf(“num=%d\naver=%10.2f\n“ ,i,aver); return 0; 应该执行1000次

#include <stdio.h> #define SUM 100000 int main() { float amount,aver,total; int i; for (i=1,total=0;i<=1000;i++) { printf("please enter amount:"); scanf("%f",&amount); total= total+amount; if (total>=SUM) break; } aver=total / i ; printf(“num=%d\naver=%10.2f\n“ ,i,aver); return 0; 达到10万,提前结束循环

#include <stdio.h> #define SUM 100000 int main() { float amount,aver,total; int i; for (i=1,total=0;i<=1000;i++) { printf("please enter amount:"); scanf("%f",&amount); total= total+amount; if (total>=SUM) break; } aver=total / i ; printf(“num=%d\naver=%10.2f\n“ ,i,aver); return 0; 实际捐款人数

#include <stdio.h> #define SUM 100000 int main() { float amount,aver,total; int i; for (i=1,total=0;i<=1000;i++) { printf("please enter amount:"); scanf("%f",&amount); total= total+amount; if (total>=SUM) break; } aver=total / i ; printf(“num=%d\naver=%10.2f\n“ ,i,aver); return 0; 只能用于循环语句和switch语句之中,而不能单独使用

5.7.2 用continue语句提前结束本次循环 有时并不希望终止整个循环的操作,而只希望提前结束本次循环,而接着执行下次循环。这时可以用continue语句

5.7.2 用continue语句提前结束本次循环 例5.5 要求输出100~200之间的不能被3整除的数。 编程思路: 对100到200之间的每一个整数进行检查 如果不能被3整除,输出,否则不输出 无论是否输出此数,都要接着检查下一个数(直到200为止)。

for(n=100;n<=200;n++) { if (n%3==0) continue; printf("%d ",n); } n=100 n≤200 N Y Y n能被3整除 N 输出n n=n+1

5.7.3 break语句和continue语句的区别

break语句 continue语句 N N 表达式1 表达式1 Y Y …… …… Y Y 表达式2 表达式2 N N …… …… …… 强行退出循环 只结束本次循环

例5.6 输出以下4*5的矩阵。 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20

解题思路: 可以用循环的嵌套来处理此问题 用外循环来输出一行数据 用内循环来输出一列数据 按矩阵的格式(每行5个数据)输出

#include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; 累计输出数据的个数 控制一行内输出5个数据

#include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; 双重循环

#include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; 控制输出4行

#include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; 控制每行中输出5个数据

#include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; i=1时 j由1变到5 i*j的值是1,2,3,4,5

#include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; 如何修改程序,不输出第一行的空行? i=2时 j也由1变到5 i*j的值是2,4,6,8,10

if (i==3 && j==1) break; #include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; if (i==3 && j==1) break; 遇到第3行第1列,终止内循环

if (i==3 && j==1) continue; #include <stdio.h> int main() { int i,j,n=0; for (i=1;i<=4;i++) for (j=1;j<=5;j++,n++) { if (n%5==0) printf (“\n”); printf ("%d\t",i*j); } printf("\n"); return 0; 原来第3行第1个数据3没有输出 if (i==3 && j==1) continue;

5.8循环程序举例 例5.7用 公式求 的近似值,直到发现某一项的绝对值小于10-6 为止(该项不累计加)。

5.8循环程序举例 解题思路: 求 近似值的方法很多,本题是一种 其他方法:

5.8循环程序举例 每项的分子都是1 后一项的分母是前一项的分母加2 第1项的符号为正,从第2项起,每一项的符号与前一项的符号相反

5.8循环程序举例 sign=1,pi=0,n=1,term=1 当term ≥10-6 pi=pi+term n=n+1 sing=-sign term=sign/n pi=pi*4 输出pi

#include <stdio.h> #include <math.h> int main() { int sign=1; double pi=0,n=1,term=1; while(fabs(term)>=1e-6) { pi=pi+term; n=n+2; sign=-sign; term=sign/n; } pi=pi*4; printf("pi=%10.8f\n",pi); return 0; 求绝对值的函数 只保证前5位小数是准确的

改为1e-8 #include <stdio.h> #include <math.h> int main() { int sign=1; double pi=0,n=1,term=1; while(fabs(term)>=1e-6) { pi=pi+term; n=n+2; sign=-sign; term=sign/n; } pi=pi*4; printf("pi=%10.8f\n",pi); return 0; 改为1e-8

例5.8 求费波那西(Fibonacci)数列的前40个数。这个数列有如下特点:第1、2两个数为1、1。从第3个数开始,该数是其前面两个数之和。即:

这是一个有趣的古典数学问题: 有一对兔子,从出生后第3个月起每个月都生一对兔子。 小兔子长到第3个月后每个月又生一对兔子。 假设所有兔子都不死,问每个月的兔子总数为多少?

第几个月 小兔子对数 中兔子对数 老兔子对数 兔子总数 1 2 3 4 5 6 8 7 13 ┇

输出f1,f2 For i=1 to 38 f3=f1+f2 输出f3 f1=f2 f2=f3 f1=1,f2=1

… #include <stdio.h> int main() { int f1=1,f2=1,f3; int i; printf("%12d\n%12d\n",f1,f2); for(i=1; i<=38; i++) { f3=f1+f2; printf("%12d\n",f3); f1=f2; f2=f3; } return 0; … 代码可改进

#include <stdio.h> int main() { int f1=1,f2=1; int i; for(i=1; i<=20; i++) { printf("%12d %12d ",f1,f2); if(i%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; } return 0;

例5.9输入一个大于3的整数n,判定它是否素数(prime,又称质数)。 解题思路: 让n被i整除(i的值从2变到n-1) 如果n能被2~(n-1)之中任何一个整数整除,则表示n肯定不是素数,不必再继续被后面的整数除,因此,可以提前结束循环 注意:此时i的值必然小于n

输入n i=2 N i ≤n-1 Y Y n被i整除 N i=i+1 Y N i <n 输出不是素数 输出是素数

#include <stdio.h> int main() { int n,i; printf(“n=?"); scanf("%d",&n); for (i=2;i<=n-1;i++) if(n%i==0) break; if(i<n) printf("%d is not\n",n); else printf("%d is\n",n); return 0; }

#include <stdio.h> int main() { int n,i; printf(“n=?"); scanf("%d",&n); for (i=2;i<=n-1;i++) if(n%i==0) break; if(i<n) printf("%d is not\n",n); else printf("%d is\n",n); return 0; } k=sqrt(n);

#include <stdio.h> int main() { int n,i,k; printf(“n=?"); scanf("%d",&n); for (i=2; i<=k; i++) if(n%i==0) break; if(i<n) printf("%d is not\n",n); else printf("%d is\n",n); return 0; } #include <math.h> k=sqrt(n);

#include <stdio.h> int main() { int n,i,k; printf(“n=?"); scanf("%d",&n); for (i=2; i<=k; i++) if(n%i==0) break; if(i<=k) printf("%d is not\n",n); else printf("%d is\n",n); return 0; } #include <math.h> k=sqrt(n);

例5.10 求100~200间的全部素数。 解题思路: 使用例5.9的算法 在例5.9程序中只要增加一个外循环,先后对100~200间的全部整数一一进行判定即可

…… for(n=101;n<=200;n=n+2) { k=sqrt(n); for (i=2;i<=k;i++) if (n%i==0) break; if (i>=k+1) { printf("%d ",n); m=m+1; } if(m%10==0) printf(“\n”); 只对奇数进行检查 控制每行输出10个数据

例5.11 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。 A B C D E F G …… W X Y Z 非字母字符保持原状不变 输入一行字符,要求输出其相应的密码

解题思路:问题的关键有两个: c=getchar(); (1) 决定哪些字符不需要改变,哪些字符需要改变,如果需要改变,应改为哪个字符 处理的方法是:输入一个字符给字符变量c,先判定它是否字母(包括大小写),若不是字母,不改变c的值;若是字母,则还要检查它是否’W’到’Z’的范围内(包括大小写字母)。如不在此范围内,则使变量c的值改变为其后第4个字母。如果在’W’到’Z’的范围内,则应将它转换为A~D(或a~d)之一的字母。 c=getchar();

if((c>='a' && c<='z') || (c>='A' && c<='Z')) 解题思路:问题的关键有两个: (1) 决定哪些字符不需要改变,哪些字符需要改变,如果需要改变,应改为哪个字符 处理的方法是:输入一个字符给字符变量c,先判定它是否字母(包括大小写),若不是字母,不改变c的值;若是字母,则还要检查它是否’W’到’Z’的范围内(包括大小写字母)。如不在此范围内,则使变量c的值改变为其后第4个字母。如果在’W’到’Z’的范围内,则应将它转换为A~D(或a~d)之一的字母。 if((c>='a' && c<='z') || (c>='A' && c<='Z'))

if(c>='W' && c<='Z' || c>='w' && c<='z') c=c+4-26; 解题思路:问题的关键有两个: (1) 决定哪些字符不需要改变,哪些字符需要改变,如果需要改变,应改为哪个字符 处理的方法是:输入一个字符给字符变量c,先判定它是否字母(包括大小写),若不是字母,不改变c的值;若是字母,则还要检查它是否’W’到’Z’的范围内(包括大小写字母)。如不在此范围内,则使变量c的值改变为其后第4个字母。如果在’W’到’Z’的范围内,则应将它转换为A~D(或a~d)之一的字母。 if(c>='W' && c<='Z' || c>='w' && c<='z') c=c+4-26; else c=c+4;

解题思路:问题的关键有两个: (2) 怎样使c改变为所指定的字母? 办法是改变它的ASCII值 例如字符变量c的原值是大写字母’A’,想使c的值改变为’E’,只需执行“c=c+4”即可,因为’A’的ASCII值为65,而’E’ 的ASCII值为69,二者相差4

可以改进程序 char c; c=getchar(); while(c!=‘\n’) { if((c>=‘a’ && c<=‘z’) || (c>=‘A’ &&c<=‘Z’)) { if(c>='W' && c<='Z' || c>='w' &&c<='z') c=c-22; else c=c+4; } printf("%c",c); 可以改进程序

不能少 char c; while((c=getchar())!=‘\n’) { if((c>=‘A’ && c<=‘Z’) || (c>=‘a’ &&c<=‘z’)) { c=c+4; if(c>=‘Z’ && c<=‘Z’+4 || c>‘z’) c=c-26; } printf("%c",c); 不能少