版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
"CaseTutorialsofCLanguageProgramming"isbasedondataprocessing《C语言程序设计案例教程》
----基于数据处理目录02第2章简单的数值运算程序设计03第3章逻辑运算与选择结构程序设计01第1章C语言概述及程序设计基础04第4章重复运算与循环结构程序设计目录06第6章指针与字符串数据处理07第7章函数与程序结构优化05第5章数组与批量数据处理08第8章结构体与复杂数据处理目录10第10章文件与大批量数据处理09第9章链表与非连续存储数据处理3.1
选择结构的必要性01023.2关系运算符和关系表达式033.3
逻辑运算符和逻辑表达式3.4
条件运算符和条件表达式043.5if语句05第3章逻辑运算与选择结构程序设计060701023.6switch语句3.7应用举例3.1选择结构的必要性在实际应用中,会出现许多需要根据具体数值进行判断而做出不同的选择以执行不同的计算功能等现象1.三角形面积程序存在的问题分析设三角形三边的长度为a、b、c,令,
则其面积s=由于负数不能开根号,因此在输入数据后,必须对输入的a、b、c能不能构成一个三角形进行判断。其条件可以描述为:a+b>c并且b+c>a并且a+c>b3.1选择结构的必要性2.鸡免同笼程序存在问题分析设鸡和兔子共有heads个,它们共有feet条脚,求鸡的数量(用chicken表示),兔的数量(用rabbit表示);则chicken+rabbit=heads,2chicken+4rabbit=feet解上述一元二次方程得到:chicken=(4heads-feet)/2,rabbit=(feet-2heads)/2
条件一:chicken≥0并且rabbit≥0;条件二:chicken与rabbit均必须是整数且chicken+rabbit=heads。3.方程求解程序存在的问题分析一个一元二次方程ax2+bx+c=0
的求解问题
完整的解如右图:它与系数、判别式有关!3.2关系运算符和关系表达式3.2.1关系运算符及其优先级名称关系运算符号等同数学符号运算结果优先级结合律优先级比较大于>>0(假)1(真)同级左结合低于算术运算
高于逻辑运算大于或等于>=≥0(假)1(真)小于<<0(假)1(真)小于或等于<=≤0(假)1(真)等于===0(假)1(真)低于上面运算符不等于!=≠0(假)1(真)3.2关系运算符和关系表达式3.2.2关系表达式将常量、变量、函数等通过关系运算符连接起来组成的表达式称为关系表达式,关系表达式的一般形式为:表达式1
关系运算符
表达式2运算结果:0(假)、1(真)int
main(){
int
a=3,b=4,c=8;
char
d='k';
int
e; e=a+b>c; printf("%d,%d\n",a<5,2*b>=c+1);
//输出结果为:1,0 printf("%d,%d\n",b>10,c-a!=b); //输出结果为:0,1 printf("%d,%d\n",a+b+c==2*a,e);
//输出结果为:0,0 printf("%d,%d\n",d<'K',d>='k');
//输出结果为:0,1
return
0;}3.3逻辑运算符和逻辑表达式3.3.1逻辑运算符及其优先级AB!AA&&BA||B0(假)0(假)1(真)0(假)0(假)0(假)1(真)1(真)0(假)1(真)1(真)0(假)0(假)0(假)1(真)1(真)1(真)0(假)1(真)1(真)逻辑运算符主要有三种:与(&&)、或(||)、非(!)运算规则:运算对象:0(假)、非0(真)运算结果:0(假)、1(真)A为假,忽略BA为真,忽略B3.3逻辑运算符和逻辑表达式3.3.2逻辑表达式将常量、变量、函数等通过逻辑运算符连接起来组成的表达式称为逻辑表达式,逻辑表达式的一般形式为:!表达式表达式1&&表达式2表达式1||表达式2
优先级依次降低①x是5的倍数,表达式为:x%5==0;②x是奇数,表达式为:x%2==1或x%2!=0;③’A’<=x<=’Z’,表达式为:x>=’A’&&x<=’Z’;④x能同时被5和7整除,表达式为:x%5==0&&x%7==0;⑤x取3和5以外的数时,表达式为:!(x==3||x==5)。
示例3.3逻辑运算符和逻辑表达式示例#include
<stdio.h>int
main(){
int
a=3,b=4,c=99,d,e; d=(a<b)&&(c=5);
//a<b为真,c=5继续执行,则变量c的值还是5 printf("c=%d,d=%d\n",c,d); e=(a>b)&&(c=10);
//a>b为假,c=10不执行(忽略),变量c的值还是5 printf("c=%d,e=%d\n",c,e);}#include
<stdio.h>int
main(){
int
a=3,b=4,c=99,d,e; d=(a<b)||(c=5); //a<b为真,c=5不执行,c变量的值还是99 printf("c=%d,d=%d\n",c,d); e=(a>b)||(c=10);
//a>b为假,c=10继续执行,c变量的值被重新赋值为10 printf("c=%d,e=%d\n",c,e);}3.4条件运算符和条件表达式条件运算符的表示为
?:将常量、变量、函数等通过条件运算符连接起来组成的表达式称为条件表达式,逻辑表达式的一般形式为:表达式1?表达式2:表达式3结果:如果表达式1的值为真(非0),则将表达式2的值做为条件表达式的结果值,如果表达式1的值为假(0),则将表达式3的值做为条件表达式的结果。
三目运算符①x=(3>5)?3:5;②x=(3<5)?3:5;③ma=(a>b)?a:b;④max=(a>b)?((a>c)?a:c):((b>c)?b:c)
示例3.5if语句3.5.1单分支if语句一般形式为:if(表达式)
语句;if(表达式){
语句1;
语句2;
...
语句n;}复合语句
执行3.5if语句示例:最大数
奇偶数判定#include
<stdio.h>int
main(){
int
x,y,max;
printf("inputtwodata:");
scanf("%d%d",&x,&y);
max=x;
//首先假设最大值为其中的x
if
(max<y)
max=y;
//原假设的最大值比y还小,重新赋值y
printf("max=%d\n",max);}#include
<stdio.h>int
main(){
int
x; scanf("%d",&x);
if
(x%2)
//余数非0,此处条件也可以用x*2!=0代替
printf("%disoddnumber\n",x);
//x是奇数
if
(x%2==0)
//余数为0 printf("%disevennumber\n",x);
//x是偶数}3.5if语句3.5.2双分支if语句if(表达式){
语句组1;}else{
语句组2;}复合语句
执行:
特点:语句组1和语句组2不能同时执行!3.5if语句示例:求三角形面积
(先判断三边abc是否能构成1个三角形,再做出选择)#include
<stdio.h>#include
<math.h>
//数学函数库int
main(){
double
a,b,c,p,area; printf("输入三角形的三边:"); scanf("%lf%lf%lf",&a,&b,&c);
//double类型必须使用%lf格式
if
(a+b>c&&a+c>b&&b+c>a) { p=(a+b+c)/2; area=sqrt(p*(p-a)*(p-b)*(p-c)); printf("三边为a=%lfb=%lfc=%lf的三角形\n其面积为%lf\n",a,b,c,area); }
else printf("输入数据不能构成一个三角形!\n");}注意输出语句的写法提示输入信息条件3.5if语句示例:被3整除
闰年判定#include
<stdio.h>int
main(){
int
x; printf("输入1个整数:"); scanf("%d",&x);
if
(x%3==0)
//余数为0,能被3整除
printf("%d能被3整除\n",x);
else
//否则,不能被3整除
printf("%d不能被3整除\n",x);}#include
<stdio.h>int
main(){
int
year; scanf("%d",&year);
if
((year%4==0&&year%100!=0)||(year%400==0)) printf("%dyearisaleapyear\n",year);
else printf("%dyearisnotaleapyear\n",year);}3.5.3if语句的嵌套1.单分支嵌套代码段条件成立时嵌套3.5.3if语句的嵌套1.单分支嵌套代码段条件不成立时嵌套3.5.3if语句的嵌套2.双分支嵌套代码段条件成立时嵌套3.5.3if语句的嵌套2.双分支嵌套条件成立与不成立均嵌套代码段特点:1.可以任意嵌套、无层数限制2.嵌套的完整性3.程序的写法:加{}3.5.3if语句的嵌套编程计算#include
<stdio.h>int
main(){
int
x,y; printf("inputx="); scanf("%d",&x);
if
(x!=0)
//以x!=0作为第一个判断条件
if
(x>0)
y=1;
else y=-1;
else y=0; printf("x=%d,y=%d\n",x,y);
}#include
<stdio.h>int
main(){
int
x,y; printf("inputx="); scanf("%d",&x);
if
(x==0)
//以x==0作为第一个判断条件
y=0;
else
if
(x>0)
y=1;
else y=-1; printf("x=%d,y=%d\n",x,y);
}此程序还可以写出多种方案!核心:考虑各种可能的方案3.5.3if语句的嵌套编程实现右表分数转换为等级。此程序还可以写出多种方案!核心:考虑各种可能的方案分数区间90-10080-8960-790-59等级ABCD#include
<stdio.h>int
main(){
int
score;
char
grade; printf("inputscore="); scanf("%d",&score);
if
(score<0||score>100)
//输入错误的分数,提示出错信息后结束运行
{ printf("Inputscoreerror!\n");
return
0; }
if
(score>=80)
//从区间中间80进行分段
if
(score>=90) grade='A';
//90以上
else grade='B';
//80-89
else
if
(score>=60)
//60-79 grade='C';
else grade='D';
//<60 printf("score=%d,grade=%c\n",score,grade);
}4多重嵌套分析总结本程序:(1)嵌套特点(2)程序的运行情况3.6switch语句3.6.1switch语句的一般格式switch(表达式){
case常量1:
语句1;[break;]
//[]表示其中的内容可以省略
case常量2:
语句2;[break;]
case常量3:
语句3;[break;]
…
case常量n:
语句n;[break;]
[default:
语句n+1;]
}执行方式:先计算switch中表达式的值,然后直接跳转到case后对应常量处开始执行,直到break语句或语句结束处结束执行;
如表达式的值与所有case后的常量均不相同时,则执行default后的语句。语句中break可以省略,default部分也可以省略。3.6switch语句3.6.1switch语句的执行跳
转非比较原因是如没有break;会一直执行!3.6switch语句3.6.1switch语句示例#include<stdio.h>int
main(){
int
a; printf("输入0-6,输出对应的星期名称:"); scanf("%d",&a);
switch
(a) {
case
0:
printf("星期日\n");break;
case
1: printf("星期1\n");break;
case
2: printf("星期2\n");break;
case
3: printf("星期3\n");break;
case
4: printf("星期4\n");break;
case
5: printf("星期5\n");break;
case
6: printf("星期6\n");break;
default: printf("Inputerror!\n"); }
return
0;}输入数字0~6,输出其对应的星期几,其中0对应星期天。比较:可用if实现,但程序结构复杂;switch写的程序很规整。注意:程序的每一处执行事均有break;为什么?3.6switch语句3.6.1switch语句示例百分制转等级制:分数区间90-10080-8970-7960-690-59等级ABCDE#include
<stdio.h>int
main(){
int
score; printf("输入1个百分制的分数:"); scanf("%d",&score);
switch
(score/10) {
case
0:
case
1:
case
2:
case
3:
case
4:
case
5: printf("E\n");break;
case
6: printf("D\n");break;
case
7: printf("C\n");break;
case
8: printf("B\n");break;
case
9:
case
10:printf("A\n");break;
default:printf("ERROR\n"); }}核心思路:分数/10得到0-10共11种可能值,对每种情况处理。共用:共同点可共用同一处理语句,这就是程序中某些case没有语句的原因。3.6switch语句3.6.1switch语句示例输入一个年份和月份,输出该月有多少天?核心思路:根据月份的实际情况,将其天数赋值给对应的变量即可。共用:相同天数的月分可共用同一处理语句,这就是程序中某些case没有语句的原因。#include
<stdio.h>int
main(){
int
year,month,days;
//定义年、月、日3个变量
printf("输入年份与月份:"); scanf("%d%d",&year,&month);
switch
(month) {
case
1:
//case135781012共用同
days=31;语句
case
3:
case
5:
case
7:
case
8:
case
10:
case
12: days=31;break;
case
4:
//case45911共用同
days=30;语句
case
6:
case
9:
case
11: days=30;break;
case
2: if
((year%4==0&&year%100!=0)||(year%400==0)) {
//闰年2月有29天
days=29;break;
}
else
{
//非闰年2月有28天
days=30;break;
}
default:printf("输入的月份数据有错。\n"); } printf("%d年%d月有%d天\n",year,month,days);}3.6switch语句3.6.1switch语句示例补充:输入某天(年、月、日),计算这天是当年的第多少天?核心思路:月份越大,需要计算的月分数越多,巧妙利用了switch语句的特点实现循环功能。为什么要从大到小写case常量?#include
<stdio.h>int
main(){
int
year,month,day,days=0;
//定义年月日和天数
printf("输入年月日:"); scanf("%d%d%d",&year,&month,&day);
switch
(month-1) {
case
11:days+=30;
case
10:days+=31;
case
9:days+=30;
case
8:days+=31;
case
7:days+=31;
case
6:days+=30;
case
5:days+=31;
case
4:days+=30;
case
3:days+=31;
case
2: days+=((year%4==0&&year%100!=0)||(year%400==0))?29:28;
case
1:days+=31;
case
0:break;
default:printf("输入的月份数据有错。\n");return0; } printf("%d年%d月%d日是当年的第%d天\n",year,month,day,days+day);}3.7应用举例【例3.17】输入一个三位数,判断其是否为水仙花数。所谓水仙花数是指该三位数的各位数字立方和等于该数本身,如:153=1×1×1+5×5×5+3×3×3核心思路:①输入一个数x,判断它是否为一个合法的3位数,即100≤x<1000;如果成立,则转②继续,否则给出“输入数据出错”提示信息;②求出该数的个位、十位、百位,分别存入三个变量g、s、b中;③判断个位、十位、百位数字的立方和是否等于该数本身,即g3+s3+b3==n。3.7应用举例-1-水仙花数#include
<stdio.h>int
main(){
int
n,g,s,b; printf("Inputathree-digitinteger:"); scanf("%d",&n);
//输入一个三位数
if
(n>=100&&n<1000)
//输入数据合法性判断
{ g=n%10;
//求个位
s=n/10%10; //求十位
b=n/100;
//求百位
if
(g*g*g+s*s*s+b*b*b==n)
//各位数字的立方和是否与n相等到
printf("%disanarcissisticnumber\n",n);
else printf("%disnotanarcissisticnumber\n",n); }
else printf("%disnotathree-digitinteger,INPUTERROR!\n",n);}3.7应用举例【例3.19】鸡免同笼问题的完整解决程序核心思路:解决结果合法性判断问题即可#include
<stdio.h>int
main(){
int
chicken,rabbit,heads,feet;
printf("Inputchicken&rabbitheads:");
scanf_s("%d",&heads);
//heads是头的总数
printf("Inputchicken&rabbitfeet:");
scanf("%d",&feet);
//mfeet是脚的总数
chicken=(4*heads-feet)/2;
//计算鸡的数量
rabbit=(feet-2*heads)/2;
//计算兔子的数量
if
(chicken>0&&rabbit>0&&chicken+rabbit==heads)
//合法性检查
printf("chicken=%d,rabbit=%d\n",chicken,rabbit);
else
printf("Inputdatahasnosolution!\n");
return
0;}3.7应用举例【例3.20】求解一元二次方程ax2+bx+c=0的根核心思路:分析方程系数所产生
各种可能的解的问题。3.7应用举例--方程的根(1)#include
<stdio.h>#include
<math.h>
//数学函数库文件int
main(){
double
a,b,c;
//一元二次方程的系数a,b,c
double
x1,x2;
//方程的根
double
delta;
//判别式
double
sb,xb;
//实部、虚部
printf("InputCoefficientsofquadraticequationswithonevariable:abc=");
scanf("%lf%lf%lf",&a,&b,&c);
//double类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机械制造工艺师产品加工精度控制绩效评定表
- 创意美术班:描绘美好世界小学主题班会课件
- 网络安全防护技术手册与漏洞扫描指南
- 警钟长鸣预防网络诈骗小学主题班会课件
- 关于2026年战略合作伙伴会议纪要的确认函(3篇)范文
- 危险化学品生产单位车工运行操作安全操作规程
- 2026执业医师技能考试真题+答案完整版
- 基于物联网技术的仓储管理系统升级改造计划
- 制造业工厂生产车间主任生产效率绩效评定表
- 2026年全国专利代理师资格考试专利代理实务历年参考题库含答案
- 肿瘤化疗药物外渗处理与预防
- 2025-2026学年部编版九年级数学上册第一单元《一元二次方程》测试卷(含试题及答案)
- 2026青岛能源集团有限公司招聘笔试参考题库及答案解析
- AI在工业设计中的应用【文档课件】
- 2026年国企信息化管理岗位考试题含答案
- 2025黑龙江大庆市人力资源和社会保障局所属事业单位选调1人考试历年真题汇编附答案解析
- 机电概念设计毕业论文
- 新疆94电力安全事故案例
- 社区卫生服务中心规章制度职责
- 《可转化科技成果评价规范》
- 肿瘤性心脏病指南解读
评论
0/150
提交评论