一个正方形面积周长公式的周长是c厘米,它的面积可以表示为c,÷4成sis判断

已选条件:
主屏尺寸:
外观颜色:
其他参数:
主屏分辨率
屏幕像素密度
后置摄像头
前置摄像头
更多选项(RAM容量,ROM容量)等
共 1659 款
参考价:¥4988
参考价:¥3598
参考价:¥3599
参考价:¥2999
参考价:¥2599
参考价:¥5799
参考价:¥2699
参考价:¥8388
参考价:¥1160
参考价:¥3499
参考价:¥3788
参考价:¥2898
参考价:¥5568
参考价:¥2499
参考价:¥1299
参考价:¥1699
参考价:¥4528
参考价:¥3688
参考价:¥1999
参考价:¥6699
参考价:¥3488
参考价:¥3499
参考价:¥2399
参考价:¥3459
参考价:¥9999
参考价:¥1599
参考价:¥1598
参考价:¥4658
参考价:¥4099
参考价:¥2499
参考价:¥2409
参考价:¥2099
参考价:¥1398
参考价:¥2598
参考价:¥3599
参考价:¥2999
参考价:¥3199
参考价:¥3050
参考价:¥2588
参考价:¥1599
参考价:¥2799
参考价:¥2599
参考价:¥1859
还有款手机&&C语言将输入日期以英文输出_百度知道
C语言将输入日期以英文输出
我自己编了一个能输出但感觉好复杂,想集思广益一下,谁有简单一些的方法?
这是我的方法
#include&stdio.h&
int main()
void Day(int x);
void Month(int y);
void Year(int z);
int a,b,c;
printf(&请输入日期:\n&);
scanf(&%d.%...
我有更好的答案
#include&stdio.h&int&f(int&a,int&b,int&c){ if (
(c&=28&&c&=1)&||&//&所有月份都有1-28&
((c&=31&&c&=1)&&&
(b==1||b==3||b==5||b==7||b==8||b==10||b==12))&||&&//&这些月份有1-31&
((c&=30&&c&=1)&&&
(b==4||b==6||b==9||b==11))&||&//&这些月份有1-30&
((c&=29&&c&=1)&&&
(b==2)&&(a%400==0||(a%4==0&&a%100!=0)))&//&闰年2月有1-29&
return&0; else&
return&1;}int&main(){ int&a,b,c,i,s=0; scanf(&%d&%d&%d&,&a,&b,&c); if(f(a,b,c))& {
printf(&日期不合法\n&);
return&0; } char&*str[]={&&&,&January&,&February&,&March&,&April&,&May&,&June&,&July&,&August&,&September&,&October&,&November&,&December&}; //&某些月份拼写错误& int&mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if&(a%4==0&&(a%400==0||a%100!=0))&mon[2]++;&//&如果闰年2月+1& for&(i=0;i&b;i++)
s+=mon[i]; printf(&%s&%d,%d\n%d&,str[b],c,a,s+c); return&0;}
采纳率:38%
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。c语言 判断三角形 周长 面积_百度知道
c语言 判断三角形 周长 面积
从键盘输入三角形的三条边长,判断是否构成三角形,如能则求出三角形的周长和面积并输入;如不能,输出不能构成三角形的信息。构成三角形的条件为:三角形任意两边的和大于第三边时,构成三角形。面积公式使用海伦公式。作业,求帮助,麻烦尽快,谢谢
边长分别为f1,f2,f3,面积为fArea
我有更好的答案
#include &stdio.h&#include &math.h&void main(){ unsigned char a,b,c, double s, puts(&请输入三条边长:&); scanf(&%d %d %d&,&a,&b,&c); //半段能否构成三角形 max=a; if(max&b)
max=b; if(max&c)
max=c; if((a+b+c)&=2*max) {
printf(&%d,%d,%d不能构成三角形\n&,a,b,c);
getchar(); } cosab=1.0*(a*a+b*b-c*c)/(2*a*b); s=0.5*a*b*sqrt(1-cosab*cosab); printf(&%d,%d,%d构成三角形的面积为%f\n&,a,b,c,s); getchar();}
采纳率:50%
从键盘输入三角形的三条边长,判断是否构成三角形,如能则求出三角形的周长和面积;如不能,则输出不能构成三角形的信息。从键盘输入三角形的三条边长,判断是否构成三角形,如能则求出三角形的周长和面积;如不能,则输出不能构成三角形的信息。构成三角形的条件是:三角形的任意两边之和大于第三边时,构成三角形。面积计算公式:其中,f1, f2, f3是三角形的三条边长,t=(f1+f2+f3)/2。计算一个数的平方根可用函数sqrt,该函数是数学库函数,需要在程序开头加上#include “math.h”#include&iostream&#include&cmath&int main(){
double a,b,c,s,perimeter,p;
//a,b,c是三边,s是面积,perimeter是周长;
cin&&a&&b&&c;
if(((a+b)&c) && ((b+c)&a )&& ((a+c)&b))
perimeter=a+b+c;
p=perimeter/2.0;
s=sqrt(p*(p-a)*(p-b)*(p-c));
cout&&&三角形的周长是: &&&perimeter&&
cout&&&三角形的面积是: &&&s&&
cout&&&不能构成三角形,回家玩吧。…………*_*&&&
return 0;}程序代码:#include&iostream&#include&cmath&void main(){double a,b,c,s,per,t;
//a,b,c是三边,s是面积,per是周长;
cin&&a&&b&&c;
if(((a+b)&c) && ((b+c)&a )&& ((a+c)&b))
per=a+b+c;
t=per/2.0;
s=sqrt(t*(t-a)*(t-b)*(t-c));
cout&&&三角形的周长是: &&&per&&
cout&&&三角形的面积是: &&&s&&
cerr&&&不能构成三角形&&&
为您推荐:
其他类似问题
您可能关注的内容
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。您现在的位置: >> 【工具向】【Alpha开源】比拟UE4的C/C++项.. >> c
来源: 时间:
【c】C语言程序设计绪论一、对象 计算机科学与技术系新生(第二学期) 二、教学目标 程序设计的重要性 程序设计的基本概念与基本方法 编程解题的思路与典型方法 数学模型简介 算法及算法步骤 程序结构与相应语 编码与上机调试 C语言程序设计绪论三、教学重点 1. 程序设计的基本概念,基本方法; 2.在 C语言的环境下,学会如何针对问题进行分析, 得出数学模型,理出算法并编程实现; 3.有条有理有根有据的编程实践; 4.养成良好的编程风格与习惯; 5.重在思维方法的学习,鼓励创新。 C语言程序设计绪论四、指导 1. 立足改革,以培养高素质有创造精神的人才为这门课 的教学目标。2. 以学生为中心,采用与现实生活贴切和具有趣味性的 实例进行讲解,有利于调动学生学习的积极性,引导学 生主动学习。3. 强化实践,这门课主张程序设计是高强度的脑力劳动, 不是听会的、也不是看会的,而是练会的。引导学生在 解题编程的实践中探索其中带规律性的认识。将感性认 识升华到理性高度。 C语言程序设计绪论五、学习方法 1.动手动脑,理论指导下的实践 有条有理的实践。2.在编写大量程序之后,才能感到运用自如。 C语言程序设计绪论六、教学内容安排 1. 简单C程序设计; 2. 分支结构程序设计; 3. 循环结构程序设计; 4. 数组; 5. 函数; 6. 递归及其实现方法 7. 指针; 8. 结构体与链表。 C语言程序设计第一讲 简单的C程序设计1.1 认识C语言程序 1.程序实例 #include &stdio.h&//预编译命令,将标准输入输出函数 //作为头文件包扩到用户源文件中 #include &math.h& //预编译命令,将系统提供的数学函数 //作为头文件包扩到用户源文件中 main( ) //主函数,名为main, { //函数体.开始 float a,b,c; //声明部分.定义变量类型 b=30.0; //执行部分.赋值语句 a=sin(b*3.); //执行部分.赋值语句 printf(“%f\n”,a); //执行部分.输出语句 } //函数体.结束 C语言程序设计第一讲 简单的C程序设计1.2 实例 1.C程序结构 预编译命令 主函数 main( ) { 函数体开始 声明部分 执行部分 } 函数体结束 C语言程序设计第一讲 简单的C程序设计2.变量的类型 整型:int 长整型:long 浮点型:float 双精度型:double 字符型:char 用户自定义类型 C语言程序设计第一讲 简单的C程序设计 3.声明的作用 为变量分配内存单元,变量名作为内存单元的符 号地址,这件事是在程序编译链接时完成的。4. 变量 其值可以改变的量,是内存单元的符号地址。通过符号b可以找到相应的存储单元地址,假设 为1000。语句 b=30.0; 是将值30.0存放在地址为1000的存储单元。 C语言程序设计第一讲 简单的C程序设计5.对变量的赋值 赋值符号“=” &变量&=&表达式& b = 30.0; // 读作将表达式的值30.0赋给变量b a=sin(b*3.); // 读作将表达式(正弦函数)的值赋给变量a C语言程序设计第一讲 简单的C程序设计6.变量赋值特点 (1)先定义,后使用 int d,e,f; 定义三个变量为整数类型 如未定义,则在编译时被查出,认为非法 (2)变量未被赋值前,值为未知 (3)对变量赋值过程是“覆盖”过程,用新值去替换旧 (4)读出变量的值,该变量保持不变 (5)参与表达式运算的所有变量都保持原来的值不变 C语言程序设计第一讲 简单的C程序设计变量赋值过程d-123497 未赋值前 7 执行d=7 7 执行 e=d 7 执行 f=d+e 执行 d=d+1 000 8e316 7 7 7f0 0 0 14 14 C语言程序设计第一讲 简单的C程序设计7. 输出语句 printf函数(格式输出函数) 一般形式为 printf(参数1,参数2,参数3,……,参数n) 其中参数1――格式控制 参数2,参数3,……,参数n――输出表列 举例 a = 85.56; b = 100; printf(&%f %d&, a, b); C语言程序设计第一讲 简单的C程序设计格式控制是用双引号括起来的字符串,称“转换控制字符 串” %f ―― 第一个输出表列的格式说明,以小数形式输出单、 双精度实数,隐含输出6位小数 %d ―― 第二个输出表列的格式说明,以带有符号的十 进制形式输出整数(正数不输出符号) 显然,%f是控制实数a的;%d是控制整数b的 C语言程序设计第一讲 简单的C程序设计为了醒目,格式控制项中除格式说明之外可以有 ? 普通字符 例printf(“a=%f b=%d&, a, b); 输出结果为a=85.560000 b=100 ? 换行符号 例printf(“a=%f\nb=%d”,a,b); 输出结果为a=85.560000 b=100 ? 域宽和精度 例:printf(”%5.3f”,a); C语言程序设计第一讲 简单的C程序设计8. 数学函数sin(x) x为弧度,double x,double sin(x) cos(x) cos(x) exp(x) ex log(x) logex log10(x) log10x fabs(x) x fmod(x,y) 整除x/y的余数 floor(x) 求不大于x的最大整数 pow(x, y) xy sqrt(x) x1/2 C语言程序设计第一讲 简单的C程序设计 9. 算术运算符+ - * / % 加 减 乘 除 模(取余数) C语言程序设计第一讲 简单的C程序设计 1.3 作业 C语言程序设计第二讲 分支结构我们在日常生活中经常需要处理具有两个分支的问题,例 如,如果明天下雨,则在教室内组织,否则去野游。在C语言中,这类问题需要使用if语句解决,而判断操 作通常使用关系运算符。关系运算符和关系表达式 & 大于 & 小于 &= 大于等于 &= 小于等于 == 等于 != 不等于 C语言程序设计第二讲 分支结构2.1 掌握if语句的使用方法 【实例】编写程序,判断输入的整数是否为6,若是,显示 “Right!”和“Great!”,否则显示“Wrong!”和 “Sorry!”。1.编程思路要显示“Right!”和“Great!”,应执行两条语句 “printf(”Right!\n“);”和“printf(”Great!\n“);”,要 显示“Wrong!”和“Sorry!”,执行两条语句 “printf(”Wrong! \n“);”和“printf(”Sorry!\n“);”。本 题需要根据所输入的值(假设赋给a)是否为6来选择执行相 应的两条语句。在C语言中判断a中的值是否为6,使用“if(a==6)”形式。 C语言程序设计第二讲 分支结构本实例的流程图如图所示开始输入a值 真 假a==6显 示 “ Right ! ” 显 示 “ Great ! ”显 示 “ Wrong ! ” 显 示 “ Sorry ! ”结束 C语言程序设计第二讲 分支结构本实例的N-S流程图如图所示 输入a的值 a==6 显示“Right!” 显示“Great!” 显示“Wrong!” 显示“Sorry! ” C语言程序设计第二讲 分支结构 2.程序代码:#include &stdio.h& main() { int a=0; printf(&Input a:&); scanf(&%d&,&a); printf(&a=%d\n&,a); if(a==6) /* if语句开始 */ {printf(&Right!\n&); printf(&Great!\n&); } else {printf(&Wrong!\n&); printf(&Sorry!\n&);} /* if语句结束 */ } C语言程序设计第二讲 分支结构3.运行结果第1次运行结果Input a:6&回车& a=6 Right! Great! 第2次运行结果Input a:5&回车& a=5 Wrong! Sorry! C语言程序设计第二讲 分支结构4.归纳分析(1)程序中的“a==6”是关系表达式。用关系运算符把两个C语言表达式连接起来的表达式称为关系 表达式。关系运算的判断结果只有“真”或“假”两种可 能,关系成立时为“真”,不成立时为“假”。关系表达式的值只能是1或0,当关系运算的判断结果为“真” 时,关系表达式的值为 1,否则,关系表达式的值为0。例 如,当a的值为6时,关系表达式“a==6”的值为1,当a的值 为5时,关系表达式“a==6”的值为0。 C语言程序设计第二讲 分支结构(2)程序中的“if(a==6)”是if语句的开始部分。本例题需要根据“a==6”是否为“真”来选择执行不同的 两个输出语句。处理两个分支的问题时常使用if语句。if语句 根据其后面括号中表达式的结果,选择执行某个分支程序。if语句的一般形式如下if(表达式) { 语句组1 } else { 语句组2 } “if”和“else”是关键字。当表达式结果为“真”(即不等于0) 时,执行语句组1,表达式结果为“假”(即等于0)时,执行 语句组2。在语句组1和语句组2中只能选择执行一组,而后执 行整个if语句后面的语句。 C语言程序设计第二讲 分支结构(3) C语言中允许程序中的if语句不带else部分。省略else的if语句一般形式如下if(表达式) {语句组} 此if语句的执行过程当表达式结果为“真”时,执行语句组,表达式结果为 “假”时,不处理。 C语言程序设计第二讲 分支结构2.2学会使用逻辑运算符 处理问题时经常需要同时判断多个条件。例如,在某 学生数学和英语成绩中判断是否至少有一门课程是不及格。这时使用逻辑运算符。逻辑运算符共有三种&& 逻辑与 || 逻辑或 ! 逻辑非 这3个运算符按高到低的优先级顺序是“!”、“&&”、“||” 一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。 C语言程序设计第二讲 分支结构【实例】编写程序,判断某人的体重是否在50公斤至55公斤 之间,若在此范围之内,显示“Ok”,否则显示“No”。1.编程思路先将体重存放在变量w中,要使w的值在50至55范围内,应 同时满足“w&=50”和“w&=55”。在C语言中用“w&=50 && w&=55”表示w的值是否同时满足“w&=50”和“w&=55”。输入体重w的值w &=50 && w&=55显示“Ok”显示“No” C语言程序设计第二讲 分支结构2.程序代码#include &stdio.h& main() { float w=0.0; printf(&Input w:&); scanf(&%f&,&w); printf(&w=%.1f\n&,w); if(w&=50&&w&=55) printf(&Ok\n&); else printf(&No\n&); } C语言程序设计第二讲 分支结构3.运行结果第1次运行结果Input w:53.5&回车& w=53.5 Ok 第2次运行结果Input w:60.7&回车& w=60.7 No C语言程序设计第二讲 分支结构4.归纳分析程序中的“w&=50 && w&=55”是逻辑表达式。用逻辑运算符把两个C语言表达式连接起来的表达式称为逻辑 表达式。逻辑运算的判断结果也只有“真”或“假”两种 可能,逻辑运算的如下逻辑与:1&&1=1,其它为0 逻辑或:0||0=0,其它为1 逻辑非:!0为1,!1为0,!2为0,!a为0(当a不为0时) 逻辑表达式的值也只能是1或0,当逻辑运算的判断结果为 “真”时,逻辑表达式的值为 1,否则,逻辑表达式的值 为0。 C语言程序设计第二讲 分支结构2.3 学会使用嵌套的if语句 有些问题必须在满足某种条件后,再继续分支处理。例 如,某男职工60岁退休,女职工55岁退休,为了判 断某职工是否应退休,首先要判断该职工是男职工还是 女职工,然后再根据职工性别判断年龄是否到规定年龄。这时需要使用嵌套的if语句。 C语言程序设计第二讲 分支结构【实例】编写程序,判断若输入的体重大于0且小于200,再 判断该体重是否在50公斤至55公斤之间,若在此范围之内, 显示“Ok”,否则显示“No”;若所输入的体重不大于0或不 小于200,则显示“Data over!”。1.编程思路在 上 实 例 中 , 输 入 w 的 值 后 立 刻 用 if 语 句 实 现 选 择 执 行 “printf(“Ok\n&);”或“printf(&No\n&);”的功能,但由于 本题目是在w的值大于0且小于200的情况下,才能执行此if 语句,所以在此if语句外面还需要套另一个if语句。 C语言程序设计第二讲 分支结构本实例的程序流程图:开始 输入w值 真 w&0且w&200 真 显示“Ok” w≥50且 w≤55 假 显示“No” 假 显示“Data over! ”结束课堂作业:请根据此图画出其N-S流程图。 C语言程序设计第二讲 分支结构2.程序代码main() { float w=0.0; printf(&Input w:&); scanf(&%f&,&w); printf(&w=%.1f\n&,w); if(w&0 && w&200) /* 外嵌if语句开始 */ if(w&=50 w&=55) /* 内嵌if语句开始 */ printf(“Ok\n&); else printf(&No\n&);/* 内嵌if语句结束 */ else printf(&Data over!\n&);/* 外嵌if语句结束 */ } C语言程序设计第二讲 分支结构3.运行结果第1次运行结果Input w:53.5&回车& w=53.5 Ok 第2次运行结果Input w:60.7&回车& w=60.7 No 第3次运行结果Input w:201.7&回车& w=201.7 Data over! C语言程序设计第二讲 分支结构4.归纳分析(1)本程序在一个if语句中包含了另一个if语句。在if语句的语句组1或语句组2中又包含另一个分支结构的 if语句称为嵌套的if语句。(2)本程序中出现了两次else。C语法规定,在if语句中,若多次出现else,则每一个 else总是与前面的if配对,所以本例题中第一个 else与内嵌的if配对,第二个else与最上面的if配对。程序中由于采用了缩进格式,if与else的配对关系一目 了然。 C语言程序设计第二讲 分支结构2.4学会使用if-else if形式的嵌套if语句 【实例】编写程序,求下面分段函数的值,要求x的值从键盘输 入。0 x+2 y= x2-3 (5≤x&10) (x&0) (0≤x&5)10(x≥10) C语言程序设计第二讲 分支结构1.编程思路:开始 输入x值 真 y=0 x&0 真 假 x&5 真 y=x2-3 显示x和y的值 结束 假 x&10 假y=x+2y=10 C语言程序设计第二讲 分支结构2.程序代码#include &stdio.h& main() { float x=0,y=0; printf(&Input x:&); scanf(&%f&,&x); if(x&0) y=0; else if(x&5) y=x+2; else if(x&10) y=x*x-3; else y=10; printf(&x=%f,y=%f\n&,x,y); } C语言程序设计第二讲 分支结构2.5 switch语句 在日常生活中经常遇到菜单选择操作,例如,用ATM自 动取款机取钱时,从菜单中可以选择语种、取款额;用自 动服务系统给手机充值时,可以选择查余额还是充值,对 本机充值还是对其他号码充值等。这些问题一般使用 switch语句解决。总之,这些问题都是多分支情况。 C语言程序设计第二讲 分支结构【实例】编写程序,在如下菜单中选择一个运算类型,并 进行相应的运算。如选择了加法,则进行求和运算。Please choose + addition - subtraction * multiplication / division C语言程序设计第二讲 分支结构1.程序代码#include &stdio.h& main() {float a=5.0,b=2.0,c=0.0; char sym='\0'; printf(&Please choose\n&); printf(&+ addition\n&); printf(&- subtraction\n&); printf(&* multiplication\n&); printf(&/ division\n&); sym=getchar(); printf(&%f%c%f=&,a,sym,b);/* 显示算式 */ C语言程序设计第二讲 分支结构switch(sym) {case '+'c=a+b; case '-'c=a-b; case '*'c=a*b; case '/'c=a/b; } printf(&%f\n&,c); } /* 计算算式 */ /* 显示结果 */ C语言程序设计第二讲 分支结构2.运行结果Please choose + addition - subtraction * multiplication / division /&回车& 5...500000 C语言程序设计第二讲 分支结构3.归纳分析switch语句的一般形式为switch(表达式) { case 表达式1语句组1 case 表达式2语句组2 … … case 表达式n语句组 default语句组n+1 } 其中switch、case、default和break是关键字,所有表达式均 为整型或字符型。在表达式1、表达式2、…、表达式n中只能 出现常量和运算符,而且每个表达式的值不能相等。 C语言程序设计第二讲 分支结构2.6 条件运算符及其表达式 C语言中条件运算符由“?”和“:”组成,例如“a&b ? a b”。条件表达式的一般形式为表达式1 ?表达式2 :表达式3 当表达式1的值为非0时,以表达式2的值作为条件表达式的值, 否则,以表达式3的值作为条件表达式的值。例如,当a&b 成立时,条件表达式“a&b ? a b”的值为a中的值,否 则为b中的值。使用条件表达式也可以实现分支结构。 C语言程序设计第二讲 分支结构课堂讨论:谁做的好事? 忻州师院有四位同学中的一位做了好事,不留名,表扬信来 了之后,校长问这四位是谁做的好事。A说:不是我。B说是C。C说:是D。D说:C胡说。已知三说的是真话, 一个人说的是假话。现在要根据这些信息,找出做了好事的 人。画出N-S流程图并写出程序。 C语言程序设计第二讲 分支结构1、编程思路如何找到该人,一定是“先假设该人是做好事者,然后 到每句话中去测试看有几句是真话”。“有三句是真话就确 定是该人,否则换下一人再试”。比如,先假定是A同学,让 thisman='A'; 代入到四句话中 A说:thisman!=?A?; ?A?!=?A? 假,值为0。B说:thisman==?C?; ?A?==?C? 假,值为0。C说:thisman==?D?; ?A?==?D? 假,值为0。D说:thisman!=?D?; ?A?!=?D? 真,值为1。显然,不是'A'做的好事(四个关系表达式值的和为1) C语言程序设计第二讲 分支结构再试B同学,让thisman=?B?; 代入到四句话中 A说:thisman!=?A?; ?B?!=?A? 真,值为1。B说:thisman==?C?; ?B?==?C? 假,值为0。C说:thisman==?D?; ?B?==?D? 假,值为0。D说:thisman!=?D?; ?B?!=?D? 真,值为1。显然,不是'B'所为(四个关系表达式值的和为2) C语言程序设计第二讲 分支结构再试C同学,让thisman=?C?; 代入到四句话中 A说:thisman!=?A?; ?C?!=?A? 真,值为1。B说:thisman==?C?; ?C?==?C? 真,值为1。C说:thisman==?D?; ?C?==?D? 假,值为0。D说:thisman!=?D?; ?C?!=?D? 真,值为1。显然,就是‘C?做了好事(四个关系表达式值之和为3) 这时,我可以理出头绪,要用所谓枚举法,一个人一个人地去 试, 四句话中有三句为真,该人即所求。 C语言程序设计第三讲 循环结构 循环结构是程序中一种很重要的结构。其特点 是, 在给定条件成立时,反复执行某程序段,直到 条件不成立为止。给定的条件称为循环条件,反复 执行的程序段称为循环体。C语言提供了三种循环 语句,可以组成各种不同形式的循环结构,它们是:while语句 do-while语句 for语句 C语言程序设计第三讲 循环结构 3.1 简单循环【实例】古典问题:有一对兔子,从出生后第3个月起每个月都 生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 该数列的规律为a1=1 a2=1 an=an-1+an-2这里求前20项 C语言程序设计第三讲 循环结构begina1=1;a2=1; i=3Y an=a1+a2 i&=20 N end输出ani=i+1;a1=a2;a2= C语言程序设计第三讲 循环结构该题目的N-S流程图a1=1;a2=1;an=0;i&=20an=a1+a2输出ani=i+1a1=a2a2=an C语言程序设计第三讲 循环结构2.程序源代码方法一:for循环语句 #include &stdio.h& main( ) { long a1,a2, a1=a2=1; for(i=3;i&=20;i++) { an=a1+a2; printf(“a%d=%ld”,i,an); a1=a2; a2= 可否调换? } } C语言程序设计第三讲 循环结构方法二:while循环语句 #include &stdio.h& main( ) { long a1,a2, a1=a2=1;i=3; while(i&=20) { an=a1+a2; printf(“a%d=%ld”,i,an); a1=a2; a2= i++; } } C语言程序设计第三讲 循环结构方法三:do-while循环语句 #include &stdio.h& main( ) { long a1,a2, a1=a2=1;i=3; do { an=a1+a2; printf(“a%d=%ld”,i,an); a1=a2; a2= i++; } while(i&=20); } C语言程序设计第三讲 循环结构 3.归纳分析(1)for语句格式for ( 表达式1 ; 表达式2 ; 表达式3 ) {语句} 即for (循环变量赋初值 , 循环结束条件 , 循环变量增值 ) {语句} C语言程序设计第三讲 循环结构 For语句执行过程表达式1 N表达式2 Y 语 句表达式3 C语言程序设计第三讲 循环结构表达式可以省略,但分号不能省略 a) 省略表达式1 i=1 for ( ;i&=50 ;i++ ) sum=sum+2*i b) 省略表达式2――产生死循环 for ( i=1; ;i++ ) sum=sum+2*i c) 省略表达式3 for ( i=1;i&=50 ;) { sum=sum+2*i; i++;} d) 省略表达式1 , 省略表达式3 i=1 for ( ;i&=50 ;) { sum=sum+2*i; i++; } C语言程序设计第三讲 循环结构表达式1,表达式3可以是a) 简单的表达式 b)逗号表达式 表达式2 一般是关系表达式或逻辑表达式 例:for ( sum=0 , i=1 ; i&=50 ; i++,i++ ) sum=sum+2*i; 或:for ( sum=0 , i=1 ; i&=50 ; i=i+2 ) sum=sum+2*i C语言程序设计第三讲 循环结构(2) while语句的一般形式为while(表达式) {语句;} 其中表达式是循环条件,语句为循环体。while语句的语义是计算表达式的值,当值为真(非0)时,执行循环体语句。 C语言程序设计第三讲 循环结构使用while语句应注意以下几点1.while语句中的表达式一般是关系表达或逻辑表达式,只 要表达式的值为真(非0)即可继续循环。2.循环体如包括有一个以上的语句,则必须用{}括起来, 组成复合语句。3.应注意循环条件的选择以避免死循环,一般需要在循环体 中动态改变循环条件的值。 C语言程序设计第三讲 循环结构(3) do-while语句的一般形式为do 语句; while(表达式); 其中语句是循环体,表达式是循环条件。do-while语句的语义是先执行循环体语句一次, 再判别表达式的值,若为真(非0) 则继续循环,否则终止循环。do-while语句和while语句的区别在于do-while是先执行后 判断,因此do-while至少要执行一次循环体。而while是先 判断后执行,如果条件不满足,则一次循环体语句也不执 行。 C语言程序设计第三讲 循环结构(4)循环体语句可使用break 和continue语句 break:可以用来从循环体内跳出循环体(提前结束循环) continue:用于跳过循环体中下面尚未执行的语句,接着重 新执行循环的判断 例:输出100以内能被7整除的数。 for(n=7;n&=100;n++) { if (n%7!=0) printf(&%d &,n); } C语言程序设计第三讲 循环结构 练习:1.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13... 求出这个数列的前20项之和。2.求1+2!+3!+...+20!的和。3.用牛顿切线法求x-sin(x)=0在区间(0,π)之间的解。4.任意输入两个数,求这两个数的最大公约数。5.从键盘输入一个数判断其是否为素数。 C语言程序设计第三讲 循环结构作业1. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例 如2+22+222+(此时共有5个数相加),几个数 相加由键盘输入控制。2. 一球从100米高度自由落下,每次落地后反跳回原高度的 一半;再落下,求它在第10次落地时,共经过多少米?第 10次反弹多高? 3. 求1+2!+3!+...+20!的和 4. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一 半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子 吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩 下的一半零一个。到第10天早上想再吃时,见只剩下一个 桃子了。求第一天共摘了多少? C语言程序设计第三讲 循环结构3.2循环的嵌套使用 【实例】 搬砖问题。36块砖,36人搬,男搬4,女搬3,两 个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干? 1.分析列方程,得出问题条件w+m+c=36 4*m+3*w+c/2=36 可以用枚举的方法,让变量w在0~9 、m在0~12 、c在 0~36的偶数中取值,形成满足上述条件的w 、m、c的组合 C语言程序设计第三讲 循环结构N-S流程图m=0 m&9w=0 w&12 c=36-m-w且c%2==0 4*m+3*w+c/2==36 False True 输出m、w、c w=w+1;m=m+1; C语言程序设计第三讲 循环结构 2.程序 main() {int m,w,c; for(m=0;m&9;m++) for(w=0;w&12;w++) {c=36-w-m; if(c%2!=0) if(4*m+3*w+c/2==36) printf(“m=%d,w=%d,c=%d”,m,w,c); } } C语言程序设计第三讲 循环结构 练习1.输出9*9口诀。2.判断101-200之间有多少个素数,并输出所有素 数。3.打印出所有的“水仙花数”,所谓“水仙花数” 是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为 153=1的三次方+5的三次方+3的三次方。 C语言程序设计第三讲 循环结构 作业:1.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k, 然后按下述步骤完成(1)如果这个质数恰等于n,则说明分解质因数的过程已经结 束,打印出即可。(2)如果n&&k,但n能被k整除,则应打印出k的值,并用n除以 k的商,作为新的正整数你n, 重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。2.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。 C语言程序设计第三讲 循环结构课堂讨论五位跳水高手将参加十米高台跳水决赛,有好事者让 五个人据实力预测比赛结果。A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二; D选手说:C最后,我第三; E选手说:我第四,A第一; 决赛成绩公布之后,每位选手的预测都只说对了一半, 即一对一错,请编程解出比赛的实际名次。 C语言程序设计第三讲 循环结构思路:1 首先是将五个人的预测写成逻辑表达式让关系运算符“==”的含义是“是”。让数字1、2、3、4、5分别表示名次第一、第二,?, 第五。让整型变量A、B、C、D、E分别表示每个选手所得名次。A选手说:B==2,A==3; B选手说:B==2,E==4; C选手说:C==1,D==2; D选手说:C==5,D==3; E选手说:E==4,A==1; C语言程序设计第三讲 循环结构2 考虑到每个人说的话是一对一错,即一真一假,比如A说 的,若B==2为真,则A==3为假,为真取值为1,为假取值 为0,则两个关系表达式之和必为1。即(B==2)+(A==3)应该是1 我们可以归纳出要同时满足五个人所说的话都符合一半对一 半错的条件是 ta=((B==2)+(A==3))==1; 符合A选手的话,则ta为1 tb=((B==2)+(E==4))==1; 符合B选手的话,则tb为1 tc=((C==1)+(D==2))==1; 符合C选手的话,则tc为1 td=((C==5)+(D==3))==1; 符合D选手的话,则td为1 te=((E==4)+(A==1))==1; 符合E选手的话,则te为1 C语言程序设计第三讲 循环结构3.仍然可以用枚举的方法,让变量A、B、C、D、E在1~5中取 值,形成满足上述条件且A、B、C、D、E取值均不同的A~E 的组合,即是所求。可以考虑A、B、C、D、E取值均不同的条件为 A *B*C*D*E=120 C语言程序设计第三讲 循环结构 For(A=1;A&=5;A++) For(B=1;B&=5;B++) For(C=1;C&=5;C++) For(D=1;D&=5;D++) E=15-(A+B+C+D) True A*B*C*D*E=120 求ta、tb、tc、 td、te t=ta+tb+tc+td+te True t==5 False输出ABCDEFalse C语言程序设计第三讲 循环结构 作业:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析1)A、B至少有一人作案; 2)A、D不可能是同案犯; 3)A、E、F三人中至少有两人参与作案; 4)B、C或同时作案,或与本案无关; 5)C、D中有且仅有一人作案; 6)如果D没有参与作案,则E也不可能参与作案。试编一程序,将作案人找出来。 C语言程序设计第三讲 循环结构1 案情分析:将案情的每一条写成逻辑表达式,第一条用 CC1表示,第二条用CC2表示,…… CC1:A和B至少有一人作案 令A变量表示A作案 B变量表示B作案 A B CC1 0 0 0 1 0 1 0 1 1 1 1 1 显然这是或的关系,因此有CC1=(A||B) C语言程序设计第三讲 循环结构CC2:A和D不可能是同案犯 可以分析为A如果是案犯,D一定不是案犯,写成 A&&(!D) D如果是案犯,A一定不是案犯,写成D&&(!A) 这两者之间是或的关系,因此有 CC2=!(A&&D)A 1 1 0 0D 0 1 0 1A&&D 0 1 0 0CC2 1 0 1 1 C语言程序设计第三讲 循环结构 CC3:A、E、F中有两人涉嫌作案,分析有三种可 能 第一种,A和E作案,(A&&E) 第二种,A和F作案,(A&&F) 第三种,E和F作案,(E&&F) 这三种可能性是或的关系, 因此有 CC3= (A&&E)||(A&&F)||(E&&F) C语言程序设计第三讲 循环结构CC4:B和C或同时作案,或都与本案无关 第一种情况:同时作案(B && C) 第二种情况:都与本案无关(!B && !C) 两者为或的关系,因此有 CC4=(B && C)||(!B && !C) CC5:C、D中有且仅有一人作案 CC5=(C && !D)||(D && !C) CC6:如果D没有参与作案,则E也不可能参与作案。CC6=!D !E=D||!E C语言程序设计第三讲 循环结构2 采取枚举方法,枚举什么呢? 枚举组合。6个人每个人都有作案或不作案两种可 能,因此有26种组合,从这些组合中挑出符合6条 分析的作案者。定义6个整数变量,分别表示6个 人A,B,C,D,E,F。枚举每个人的可能性让0 表示不是罪犯; 让1表示就是罪犯。 C语言程序设计第三讲 循环结构 for(A=0;A&=1;A++) for(B=0;B&=1;B++) for(C=0;C&=1;C++) for(D=0;D&=1;D++) for(E=0;E&=1;E++) for(F=0;F&=1;F++) 计算CC1 CC2 CC3 CC4 CC5 CC6 True 判断这些值是否都为1 False 输出ABCDEF 为1的 C语言程序设计第四讲 数组问题:哪只羊最重? 中秋佳节,有贵客来到草原,主人要从羊群中 选一只肥羊宴请宾客,当然要选最重者。这样 就要记录每只羊的重量,如果有成千上万只羊, 不可能用一般变量来记录。可以用带有下标的 变量,也就是这里要讲的数组。 C语言程序设计第四讲 数组1.程序分析max=0.0 将记录最重的羊的重量 for(i=0;i&10;i++) 提示输入第i只羊的重量 输入第i只羊的重量sheep[i] Yes max=sheep[i] k=i 输出max和k的值 max&sheep[i]No C语言程序设计第四讲 数组2.程序 main() // 主函数 { float sheep[10]; // 数组,有10个浮点类型元素 // 浮点类型变量,存放最肥羊的重量 int i,k; //整型变量,i用于计数循环,k用于记录最肥羊的号 max = 0.0; // 赋初值0 for ( i=0; i&10; i=i+1 ) // 计数循环 {printf(“请输入羊的重量sheep[%d]=”, i); scanf(“%f”, &(sheep[i])); if ( max & sheep[i] ) {max = sheep[i]; // 让第i只羊为当前最肥羊 k=i;} } printf(“max=%f\n number=%d\n”, max , k);} C语言程序设计第四讲 数组3.归纳分析 (1)数组的定义 类型说明符 数组名 [ 常量表达式 ] 例float sheep[10]; int a]; 说明 ①数组名的第一个字符应为英文字母; ②用方括号将常量表达式括起; ③常量表达式定义了数组元素的个数; C语言程序设计第四讲 数组④数组下标从0开始。如果定义5个元素,是从第0个元 素至第4个元素; 例如 int a[5] 定义了5个数组元素如下a[0], a[1], a[2], a[3], a[4] 这是5个带下标的变量,这5个变量的类型是相同的 ⑤常量表达式中不允许包含变量; 例如 n = 5; int a[n]; 不合法! C语言程序设计第四讲 数组(2)数组初始化 是定义数组完成赋初值的任务 例如 int a[5] = { 3, 5, 4, 1, 2 }; a 下标a[0] = 3; a[1] = 5; a[2] = 4; a[3] = 1; a[4] = 2; C语言程序设计第四讲 数组(3)数组在内存中分配一段连续的存储空间 变量名 地址 内存 数组名FF00 FF01 FF02 FF03 FF04 FF05 FF06 FF07 FF08 FF 00 01 00a[0]aa[1]a[2]a[3]a[4] C语言程序设计第四讲 数组思考1.#include &stdio.h& void main() { int a[4]; // 声明项 printf(“a[0]=%d; a[1]=%d; a[2]=%d; a[3]=%d\n”, a[0], a[1], a[2], a[3]); } 2.其他不变,改变声明项为 int a[4] = { 0, 1, 2, 3 }; C语言程序设计第四讲 数组3.其他不变,改变声明项为 int a[4] = { 3, 8 }; 4.其他不变,改变声明项为 int a[4] = { 2, 4, 6, 8, 10 }; 5.其他不变,改变声明项为 int a[4] = { 2, 4, 6, d }; 6.其他不变,改变声明项为 int n=4; int a[n] = { 0, 1, 2, 3 }; C语言程序设计第四讲 数组 【实例】将几个数从大到小排序并输出,冒泡排序法i=1 a[1] 初始值 1 比较1和8,调换 1 比较1和3,调换 8 比较1和2,调换 8 比较1和4,调换 8 比较1和4,调换 8 1到达位置 8 比较8和3,不动 8 比较3和2,不动 8 比较2和4,调换 8 比较2和9,调换 8 2到达位置 8 i=2 a[2] 8 8 1 3 3 3 3 3 3 3 3 3 i=3 a[3] 3 3 3 1 2 2 2 2 2 2 4 4 i=4 a[4] 2 2 2 2 1 4 4 4 4 4 2 9 i=5 a[5] 4 4 4 4 4 1 9 9 9 9 9 2 i=6 a[6] 9 9 9 9 9 9 1 1 1 1 1 1 C语言程序设计第四讲 数组i=1 a[1] 中间值 比较8和3,不动 比较3和4,调换 比较3和9,调换 3到达位置 比较8和4,不动 比较4和9,调换 4到达位置 比较8和9,调换 8到达位置 8 8 8 8 8 8 8 8 8 9 i=2 a[2] 3 3 3 4 4 4 4 9 9 8 i=3 a[3] 4 4 4 3 9 9 9 4 4 4 i=4 a[4] 9 9 9 9 3 3 3 3 3 3 i=5 a[5] 2 2 2 2 2 2 2 2 2 2 i=6 a[6] 1 1 1 1 1 1 1 1 1 1 C语言程序设计第四讲 数组 从表中可以看出最小的一个数第一遍扫描就交换 到a[6] 如果将a[1]视为水底,a[6]视为水面最轻的(最小的)一个数 1 最先浮到水面,交换 到a[6]; 次轻的 2 第二遍扫描交换到a[5]; 再轻的 3 第三遍扫描交换到a[4]; …依此类推,有6个数,前5个数到位需5遍扫描, 第6个最重的数自然落在a[1]中。因此,6个数只需5遍扫描,即j=n-1, n=6。 C语言程序设计第四讲 数组再看在每遍扫描中,相邻两数组元素的比较次数。当j=1时,i=1,2,…,n-j。n=6时,比较5次之后a[6]中有一个最小数到达,这时a[6] 不必再参与比较了。因此在第二遍搜索时,j=2, i=1,2,…,n-j,即 i=1,2,3,4。比较4次之后次小的一个数到达了a[5]。这时a[5]不必再参与比较了。因此, j=3时,i=1,2,3; j=4时,i=1,2; j=5时,i=1 C语言程序设计第四讲 数组为了表述方便,定义以下3个变量n ―― 待排序的数的个数,这里 n=6 j ―― 扫描遍数,j=1,2,…,n-1 i ―― 第j遍扫描待比较元素的下标, i=1,2,…,n-j C语言程序设计第四讲 数组采用两重计数型循环步骤1将待排序的数据放入数组中; 步骤2置j为1; 步骤3让i从1到n-j,比较a[i]与a[i+1], 如果 a[i] &= a[i+1],位置不动; 如果 a[i] & a[i+1],位置交换, 即 p=a[i]; a[i]=a[i+1]; a[i+1]=p; 步骤3结束后 a[n-j+1]中的数为最小的数 步骤4让j=j+1;只要j&n就返回步骤3, 将a[n-j+1]的值排好。当j==n时执行步骤5 步骤5输出排序结果 C语言程序设计第四讲 数组2.程序 main() // 主函数 { int i, j, p, a[7]; // 整型变量 for (i=1; i&=6; i=i+1) // 键入6个数,放入a数组中 { printf(“请输入待排序的数a[%d]=”, i); scanf (“%d”, &a[i]); } for ( j=1; j&=5; j=j+1) // 冒泡排序,外层循环 for ( i=1; i&=6-j; i=i+1 ) // 内层循环 { if ( a[i] & a[i+1] ) {p = a[i]; a[i] = a[i+1]; a[i+1] =} } for ( i=1; i&=6; i=i+1) // 输出排序结果 printf(“%d\n”, a[i]); } C语言程序设计第四讲 数组作业船长与水手的问题有载有50个人的大船,突然触礁,船底撞了一个大窟窿, 水不停地涌进船里,船不断下沉。这时,聪明的船长把 所有人召集到一起,给每人一个编号,手拉手围成一圈, 从1号开始报数,报的数为9时,这个人出列,跳入大海, 剩下的人继续围成一圈,后面的人从1开始继续报数,重 复上面地步骤,聪明的船长却最后留在了船上。问:船长是几号才能最后一个跳入大海? C语言程序设计第四讲 数组讨论问题使用筛法求100以内的所有素数 思路 1.想象将100个数看作沙子和小石头子,让小石头子当作 素数;让沙子当作非素数。弄一个筛子,只要将沙子 筛走,剩下的就是素数了。2.非素数一定是2、3、4 …… 的倍数。3.使用数组,让下标就是100以内的数,让数组元素的值 作为筛去与否的标志。比如筛去以后让元素值为1。 C语言程序设计第四讲 数组1至100这些自然数可以分为三类单位数:仅有一个数1。素数是这样一个数,它大于1,且只有1和它自身这样两个 正因数。合数除了1和自身以外,还有其他正因数。1不是素数,除1以外的自然数,当然只有素数与合数。筛法实际上是筛去合数,留下素数。为了提高筛选法效率,注意到令n为合数(这里是100),c为n的最小正因数,则据初等数论1? c ?n只要找到c就可以确认n为合数,将其筛去。 C语言程序设计第四讲 数组 for(i=2;i&=100:i++) prim[i]=0; for(i=3;i&=100:i++) a=sqrt(i) for(j=2;j&=a:j++) i%j==0 Yes prim[i]=1 for(i=2;i&=100;i++) Yes 输出i prim[i]==0NoNo C语言程序设计第四讲 数组二维数组 问题:求矩阵a的最大值 1 3 5 a= 7 9 2 4 6 8 C语言程序设计第四讲 数组1.二维数组定义 格式类型说明符 数组名[常量表达式] [常量表达式] 例int a[2] [3] ={{3,5},{4,1},{2,6}}; 说明a)每一维的下标从0开始,整个数组元素为:2×3=6个 b)C语言中,二维数组中元素排列的顺序是按行存放。即:先存放第一行的元素,再存放第二行的元素 C语言程序设计第四讲 数组 二维数组在内存中的分配情况地址 内存 变量名 数组名FF00 FF01 FF02 FF03 FF04 FF05 FF 00 01 FF07
……a[0][0]aa[0][1]a[1][0]a[1][1]a[2][0] C语言程序设计第四讲 数组c)可以计算数组元素在数组中的序号 假设 m×n的数组a,计算a[i][j]序号的公式i×n+j 如3×3数组中a[0][1] 0×3+1=1(第二个) a[1][2] 1×3+2=5(第六个) a[2][2] 2×3+2=8(第九个) C语言程序设计第四讲 数组求矩阵a的最大值 1 3 5 a= 7 9 2 4 6 8 问题分析:将矩阵放入二维数组a[3][3]中 首先定义变量max=a[0][0],max与a[0][1]比较,若发现 max&a[0][1],则将max=a[0][1],这样max与数组元素 逐个比较,最后找到数组中最大的一个。采用二重循环 分别对行和列进行控制。外层控制行标,内层控制列标。 C语言程序设计第四讲 数组算法:作业1.打印魔方阵:1.将1放到第1行的中间。2.下一个数放在该数的前一行后 一列。8 3 41 5 96 7 23.若该位置已经有数,则放在前 一数的正下方。4.当前数是右上角时,其下一个 数放在其下方。5.若当前是第1行,则其前一行为 第n行,若当前列是第n列,则其后 一列为第1列。 C语言程序设计第五讲 函数问题:编程求解?x ? ?x sumk6nlx ?1(l ? 4)x ?1?我们用函数来编写这个题的程序,参考程序如下:#include &stdio.h& //预编译命令 #define n 6 //定义n为6 #define k 4 //定义k为4 void main() //主函数 {printf(&sum of %dth powers of integers from 1 to %d=&,k,n ); printf(&%d\n&,SOP(n,k)); //输出结果,其中SOP(n,k)为被调用函数} C语言程序设计第五讲 函数int SOP(m,l) //整型自定义函数,m,l 为形参 int m,l; //形参m,l 为整型变量 { int i,sum=0; //整型变量i,sum for (i=1; i&=m; i=i+1 ) {sum=sum+power( i ,l ); } return (sum) ; } //返回值sum给函数sop(n,k) //以下函数是被函数sop(n,k)调用的函数 int power(p,q) //整型自定义函数 int p,q; //形参p,q 为整型变量 {int i,product=1; for(i=1; i&=q; i=i+1) { product=product*p; } return(product); } //累乘值product返回给power C语言程序设计第五讲 函数函数的定义格式&数据类型& &函数名& (&参数表&) 例int power(p,n) power为函数名,要以英文字母开头。int是函数值的数据类型,这里是int(整型)。(p,n)括号中的p,n为函数的形式参数,形式参数也要定义其数据 类型。函数定义的一般格式:&数据类型& &函数名& (&参数表&) &参数说明;& { &说明语句& &执行语句& } C语言程序设计第五讲 函数形式参数与实在参数 1、形式参数是在定义函数时放在函数名后括号中的参数。在 未进行函数调用时,并不对形式参数分配内存单元。在发生 函数调用时,立刻给形式参数分配内存单元。调用结束后, 释放掉行参所占的内存单元。2、因此,形参变量属于局部变量,其作用域在它所在的函数 体内。3、在定义函数的时候,必须指定形参变量的类型,如何指定? 有二种方法(1) int power(p,n) (2) int power(int p,int n) int p,n; { { …… …… } } 有些编译系统不认识第(2)种形式 C语言程序设计第五讲 函数4、实在参数是一个具有确定值的表达式。函数在调用时,将实 在参数赋给形式参数。比如,主函数调用SOP(n,k),这时,n,k为实在参数,n的 值为6,k的值为4。在被调用函数定义中,int SOP(m,l)中的 m,l为形式参数,在SOP被调用时,系统给m,l这两个形式参数 分配了内存单元之后,n的值6赋给m,k的值4赋给l。实在参数的个数及类型应与形式参数一致。赋值时前后对 应关系不会改变。下面画出主函数与SOP函数,调用与被调用 时参数传递关系: C语言程序设计第五讲 函数主函数执行下述语句时, printf(“%d\n”,SOP(n,k)); 传值给被调用函数 int SOP(m,l) n的值6传给m, k的值4传给l。6和4为实在参数,m和l为形式参 数。被调用函数在其形式参数被赋值之后,开始执行函数体,先是 让累加器初始化为0(sum=0),接着进入以i为控制变量的计 算循环,i从1变到m(m=6),即累加m次(即6次)。循环体 为sum=sum+power(i,l)。当6次循环执行完后,实现的是sum ? ? x lx ?1 6(l ? 4)注意这里ilxl 是由另一个自定义函数power(i,l)实现的。 C语言程序设计第五讲 函数power(i,l)处在SOP(m,l)函数中,表示SOP函数去调用power 函数。其中i,l为实在参数,而int power(p,q)中的p,q为形 式参数。比如,执行SOP(6,4)时,l=4,m=6, 当i=1时, sum=sum+power(1,4) 这里1,4为实在参数,调用power(p,q),两个形式参数p,q分 别被赋以1,4。 C语言程序设计执行 SOP(6,4) l=4 调用 sum=0 i=1sum = sum + power(i,l) =0+1 =1 i=2sum = sum + power(i,l) = 1 + 16 = 17 i=3sum = sum + power(i,l) = 17 + 81 = 98 i=4sum = sum + power(i,l) = 98 + 256 = 354 i=5sum = sum + power(i,l) = 354 + 625 = 979 i=6sum = sum + power(i,l) = 979 + 1296 = 2275 return (sum) 调用 返回 调用 返回 调用 返回 执行 power(2, 4)product = 2*2*2*2 return(16) = 16 执行 power(3, 4)product = 3*3*3*3 return(81) = 81 执行 power(4, 4)product = 4*4*4*4 return(256) = 256 执行 power(5, 4)product = 5*5*5*5 return(625) = 625 执行 power(6, 4)produ ct = 6*6*6* 6 return(1296) = 1296 执行 power(1, 4)product = 1*1*1*1 return(1) = 1SOP(n,k)调用返回调用返回 调用 返回2275 C语言程序设计第五讲 函数Main() a函数 b函数调用a函数调用b函数结束结束结束 C语言程序设计第五讲 函数例求函数f(x)=x3+x+5的值,其中x=y3+y2+5y+6,求 当y=1,2,3,4…,100时f(x)的值。 C语言程序设计第五讲 函数作业1.设计一个函数,求解1000以内的所有素数. C语言程序设计第六讲 递归及其实现递归算法在可计算性理论中占有重要地位,它是算法设计的 有力工具,对于拓展编程思路非常有用。就递归算法而言 并不涉及高深数学知识,只不过初学者要建立起递归概念 不十分容易。我们先从一个最简单的例子导入。用递归算法求n! 定义:函数 fact(n) = n! fact(n-1) = (n-1)! 则有 fact(n) = n*fact(n-1) 已知 fact(1) = 1 C语言程序设计第六讲 递归及其实现下面我们以3!为例画出了调用和返回的递归示意图A B fact(3) 调用 fact(2) C 调用 =3*fact(2) fact(1) =2*fact(1) =3*2 =1 =2*1 =6 =2 返回 返回 C语言程序设计第六讲 递归及其实现从图可以想象欲求fact(3),先要求fact(2);要求fact(2)先求fact(1)。就象剥一颗圆白菜,从外向里,一层层剥下来,到了菜心, 遇到1的阶乘,其值为1,到达了递归的边界。然后再用fact(n)=n*fact(n-1)这个普遍公式,从里向外倒 推回去得到fact(n)的值。为了把这个问题说得再透彻一点。我们画了如下的流程图: C语言程序设计第六讲 递归及其实现fact(3) 3 ==1 fact(2) 2 ==1 fact(1) 1 ==1真假真假真假调用 fact(2)调用 fact( ) 1fact(1) =1计算 3* fact(2)计算 2* fact(1)返回返回 C语言程序设计第六讲 递归及其实现将上图改为下图fact(3) 3==1 调用 fact( 2 ) 2==1 真真假1 调用 fact( )真fact(1) =1假 假1==1返回 f act(2)=2*fact(1)返回f act(3)=3*fact(2)返回 C语言程序设计第六讲 递归及其实现 在这个图中“内层”与“外层”有着相同的结构。它们之间“你中有我,我中有你”,呈现相互依 存的关系。为了进一步讲清递归的概念,将递归 与递推做一比较。仍以求阶乘为例。递推是从已 知的初始条件出发,逐次去求所需要的阶乘值。如求3! 初始条件fact(1) = 1 fact(2) = 2*fact(1) = 2 fact(3) = 3*fact(2) = 6 C语言程序设计第六讲 递归及其实现这相当于从菜心“推到”外层。而递归算法的出发点不放 在 初始条件上,而放在求解的目标上,从所求的未知项出发逐 次调用本身的求解过程,直到递归的边界(即初始条件)。就本例而言,读者会认为递归算法可能是多余的,费力而不 讨好。但许多实际问题不可能或不容易找到显而易见的递推 关系,这时递归算法就表现出了明显的优越性。下面我们将会看到,递归算法比较符合人的思维方式,逻 辑性强,可将问题描述得简单扼要,具有良好的可读性,易 于理解,许多看来相当复杂,或难以下手的问题,如果能够 使用递归算法就会使问题变得易于处理。 C语言程序设计第六讲 递归及其实现故事:相传在古代印度的Bramah庙中,有位僧人整天把三根柱子 上的金盘倒来倒去,原来他是想把64个一个比一个小的金盘从 一根柱子上移到另一根柱子上去。移动过程中恪守下述规则每次只允许移动一只盘,且大盘不得落在小盘上面。有人会觉 得这很简单,真的动手移盘就会发现,如以每秒移动一只盘子 的话,按照上述规则将64只盘子从一个柱子移至另一个柱子上, 所需时间约为5800亿年。A B C C语言程序设计第六讲 递归及其实现怎样编写这种程序?思路上还是先从最简单的情况分析起,搬 一搬看,慢慢理出思路。1、在A柱上只有一只盘子,假定盘号为1,这时只需将该盘从 A搬至C,一次完成,记为move 1 from A to C ABC1 C语言程序设计第六讲 递归及其实现2、在A柱上有二只盘子,1为小盘,2为大盘。第(1)步将1号盘从A移至B,这是为了让2号盘能移动; 第(2)步将2号盘从A移至C; 第(3)步再将1号盘从B移至C; 这三步记为move 1 from A to B; A B C move 2 from A to C; 3 move 1 form B to C; 12 C语言程序设计第六讲 递归及其实现3、在A柱上有3只盘子,从小到大分别为1号,2号,3号第(1)步将1号盘和2号盘视为一个整体;先将二者作为整体从 A移至B,给3号盘创造能够一次移至C的机会。这一步记为 move( 2, A, C, B) 意思是将上面的2只盘子作为整体从A借助C移至B。第(2)步将3号盘从A移至C,一次到位。记为 move 3 from A to C 第(3)步处于B上的作为一个整体的2只盘子,再移至C。这一步记为 move( 2, B, A, C) 意思是将2只盘子作为整体从B借助A移至C。 C语言程序设计第六讲 递归及其实现移动过程如下图 A B C132 C语言程序设计第六讲 递归及其实现4、从题目的约束条件看,大盘上可以随便摞小盘,相反 则不允许。在将1号和2号盘当整体从A移至B的过程中 move(2, A, C, B)实际上是分解为以下三步 第(1)步:move 1 form A to C; 第(2)步:move 2 form A to B; 第(3)步:move 1 form C to B; 经过以上步骤,将1号和2号盘作为整体从A移至B,为3号 盘从A移至C创造了条件。同样,3号盘一旦到了C,就要 考虑如何实现将1号和2号盘当整体从B移至C的过程了。实际上move(2, B, A, C)也要分解为三步第(1)步:move 1 form B to A; 第(2)步:move 2 form B to C; 第(3)步:move 1 form A to C; C语言程序设计第六讲 递归及其实现5、看move(2, A, C, B)是说要将2只盘自从A搬至B,但没有C 是不行的,因为第(1)步就要将1盘从A移到C,给2盘创造 条件从A移至B,然后再把1盘从C移至B。看到这里就能明白 借助C的含义了。因此,在构思搬移过程的参量时,要把3个 柱子都用上。6、定义搬移函数move(n, A, B, C),物理意义是将n只盘子从 A经B搬到C move(n, A, B, C) 分解为3步 (1)move(n-1, A, C, B)理解为将上面的n-1只盘子作为一个整 体从A经C移至B; (2)输出n:A to C,理解将n号盘从A移至C; (3)Move(n-1, B, A, C)理解为将上面的n-1只盘子作为一个整 体从B经A移至C。 C语言程序设计第六讲 递归及其实现这里显然是一种递归定义,当解move(n-1, A, C, B)时又 可想到,将其分解为3步第1步:将上面的n-2只盘子作为一个整体从A经B到C, move(n-2, A, B, C); 第2步:第n-1号盘子从A直接移至B,即输出n-1:A to B; 第3步:再将上面的n-2只盘子作为一个整体从C经A移至B, move(n-2, C, A, B); C语言程序设计第六讲 递归调用move(2 ,A,C ,B )调用move( 1 ,A,B,C) 输出 1A to C 1move( 1,A, B, C)返回 调用move(3,A,B,C)2 输出 2A to Bmove (1,C,A,B)move(2,A,C, B)返回move( 1, C,A ,B) 返回输出 1C to B 3输出 3A to C 4 调用 move(2,B,A,C)调用move(1 ,B,C,A) 5 输出 1B to Amove(2, B, A,C)move( 1 ,B,C,A ) 调用 调用6 输出 2B to C 返回move (1,A,B,C) 输出 1A to C 7move( 1,A ,B,C)返回 C语言程序设计move(3,A,B,C) move(2,A,C,B) move(1,A,B,C)第 六 讲 递 归 及 其 实 现调用 move(1,A,B,C) 调用 move(2,A,C,B) 调用 move(1,C,A,B)输出 1A to C 输出:2A to B move(1,C,A,B) 输出:1C to B1 23输出 3A to C4move(2,B,A,C) move(1,B,C,A) 调用 move(1,B,C,A) 输出 1B to A 输出:2B to C move(1,A,B,C) 调用 move(1,A,B,C)5 6 7调用 move(2,B,A,C)输出 1A to C C语言程序设计int step=1 ; //整型全局变量,预置1,步数 void move(int , char ,char,char); //声明要用到的被调用函数 void main() { printf(“请输入盘数n=” ); scanf(&%d&,&n); printf(“在3根柱子上移%d只盘的步骤为:\n”,n); move(n,'a','b','c');} void move(int m, char p, char q, char r) { if (m==1) {printf(&[%d] move 1# from %c to %c\n&, step, p,r); step=step+1; } else{move(m-1,p,r,q); printf(&[%d] move %d# from %c to %c\n&,step, m,p,r); step=step+1; move(m-1,q,p,r); } } C语言程序设计第六讲 递归及其实现该题是2000年全国青少年信息学奥林匹克的一道试题。叙述 如下一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸 有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石 柱R,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一 个比一个小。我们将青蛙从小到大,用1,2,…,n编号。规 定初始时这队青蛙只能趴在左岸的石头L上,当然是按号排一 个落一个,小的落在大的上面。不允许大的在小的上面。在 小溪中有S个石柱,有 y片荷叶,规定溪中的柱子上允许一只 青蛙落脚,如有多只同样要求按号排一个落一个,大的在下, 小的在上。对于荷叶只允许一只青蛙落脚,不允许多只在其 上。对于右岸的石柱R,与左岸的石柱L一样 ,允许多个青蛙 按号排一个落一个,小的在上,大的在下。当青蛙从左岸的L 上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R, 或从溪中荷叶或溪中石柱跳至右岸R上的青蛙也不允许再离开。问在已知溪中有S根石柱和y片荷叶的情况下,最多能跳过多 少只青蛙? C语言程序设计第六讲 递归及其实现思路1、简化问题,探索规律。先从个别再到一般,要善于对多个 因素作分解,孤立出一个一个因素来分析,化难为易。2. 定义函数 Jump(S,y) ―― 最多可跳过河的青蛙数 其中S ―― 河中柱子数 y ―― 荷叶数 C语言程序设计第六讲 递归及其实现3. 先看简单情况,河中无柱子:S=0, Jump(0,y) 当y=1时,Jump(0,1)=2; 说明:河中有一片荷叶,可以过两只青蛙,起始时L上有 两只青蛙,1#在2#上面。第一步:1# 跳到荷叶上; 第二步:2# 从L直接跳至R上; 3 1 第三步:1# 再从荷叶跳至R上。1# 如下图:L左岸2#R右岸2 C语言程序设计第六讲 递归及其实现当y=2时, Jump(0,2)=3; 说明:河中有两片荷叶时,可以过3只青蛙。起始时1#,2#,3# 3只青蛙落在L上, 1 第一步:1# 从L跳至叶 1上, 叶1 第二步:2# 从L跳至叶 2上, 第三步:3# 从L直接跳至R上, L 第四步:2# 从叶2跳至R上, 3 第五步:1# 从叶1跳至R上,25R4叶2采用归纳法:Jump(0,y)=y+1;意思是:在河中没有石柱的情 况下,过河的青蛙数仅取决于荷 叶数,数目是荷叶数+1。 C语言程序设计第六讲 递归及其实现再看Jump(S, y) 先看一个最简单情况S=1,y=1。从图上看出需要9步, 跳过4只青蛙。4 3# 1# 青蛙从 L -& Y; 3# 2# 青蛙从 L -& S; 6 1 1# 青蛙从 Y -& S; Y 3# 青蛙从 L -& Y; 9 1# R L 4# 青蛙从 L -& R; 1# 3 7 3# 青蛙从 Y -& R; 1# 1# 2 2# S 1# 青蛙从 S -& Y; 2# 8 2# 青蛙从 S -& R; 1# 青蛙从 Y -& R;5 4# C语言程序设计第六讲 递归及其实现用L1 L2 L3 L4表示左岸石柱上落在一起的青蛙的高度位置。L1 在最上面,L4 在最下面的位置。引入这个信息就可比较容易地看出对青蛙占位的约束条件。同理R1 R2 R3 R4也是如此。对水中石柱S,也分成两个高度位置S1 S2。对荷叶Y无须分层,因为它只允许一只青蛙落在其上。t=0为初始时刻,青蛙从小到大落在石柱L上。t=1为第一步:1#从L跳至荷叶Y上;L上只剩2# 3# 4#。T=2 为第二步;2#从L跳至石柱S上,处在S2位置上,L上只剩3#和4#。T=3为第三步,1#从Y跳至S,将Y清空。这时可看出,S上有1#、2#,L上有3#、4#,好象是原来在L上的4只青蛙,分 成了上下两部分,上面的2只通过荷叶y转移到了S上。这一过程是一分为 二的过程。即将L上的一队青蛙,分解为两个队,每队各二只,且将上面 的二只转移到了S上。这时我们可以考虑形成两个系统,一个是L,Y,R系 统,一个是S,Y,R系统。前者二只青蛙号大;后者二只青蛙号小。先跳 号大的,再跳号小的。从第五步到第九步可以看出的确是这么做的。 C语言程序设计第六讲 递归及其实现对于LYR系统,相当于Jump(0,1) 对于SYR系统,相当于Jump(0,1) 两个系统之和为2*Jump(0,1),因此有Jump(1,1)=2*Jump(0,1)=2*2=4。y L S1 S2 R现在再看S=2,y=1Jump(2,1)我们将河中的两个石柱称作S1和S2,荷 叶叫y, 考虑先将L上的青蛙的一半借助于S2和y 转移到S1上,当然是一半小号的青蛙在S1上,大的留在L上。 C语言程序设计第六讲 递归及其实现这样 L S1 S2 y R 系统分解为 (L S2 y R 系统) + (S1 S2 y R 系统) = 2 * (L S2 y R 系统) = 2 * Jump(1,1) 用归纳法 Jump(S, y)=2*Jump(S-1, y) C语言程序设计第六讲 递归及其实现main() { int s,y, //整型变量,s为河中石柱数,y为荷叶数 printf(&请输入石柱数s=& ); scanf(&%d&,&s); printf(&请输入荷叶数y=& ); scanf(&%d&,&y); sum=Jump(s,y); //Jump(s,y)为被调用函数 printf(“Jump(%d,%d)=%d\n”,s,y,sum);} int Jump(int r,int z) { if (r==0) {k=z+1; } else{k=2*Jump(r-1,z);} return(k); } C语言程序设计第七讲 指针指针是C语言中的一个重要概念。掌握指针的用法,可使程序简 洁、高效、灵活,但并不难学。为了了解什么是指针,先看一个小故事 地下工作者阿金接到上级指令,要去寻找打开密电码的密 钥,这是一个整数。几经周折,才探知如下线索,密钥藏在 一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚, 阿金潜入了小楼,房间很多,不知该进哪一间,正在一筹莫 展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫 不迟疑,抓起听筒,只听一个陌生人说:“去打开211房间, 那里有线索”。阿金疾步上楼,打开211房间,用电筒一照, 只见桌上赫然6个大字:地址1000。阿金眼睛一亮,迅速找到 1000房间,取出重要数据66,完成了任务。 C语言程序设计第七讲 指针P
1000说明1、数据藏在一个内存地址单元中,地址是1000。2、地址1000又由P单元所指认,P单元的地址为211。3、66的直接地址是1000;66的间接地址是211;211中存的是直 接地址1000。4、称P为指针变量,1000是指针变量的值,实际上是有用数据藏 在存储器中的地址。 C语言程序设计第七讲 指针指针变量――用来存放另一变量地址的变量 变量的指针就是变量的地址。1、指针的概念指针是一种特殊的变量,特殊性表现在类型和 值上。从变量讲,指针也具有变量的三个要素(1)变量名,这与一般变量取名相同,由英文字符开始。(2)指针变量的类型,是指针所指向的变量的类型,而不是 自身的类型。(3)指针的值是某个变量的内存地址。 C语言程序设计第七讲 指针从上面的概念可知,指针本身类型是int型,因为任何内存地址 都是整型的。但是指针变量的类型却定义成它所指向的变量 的类型。2、指针的定义(说明,先说明后引用) 例如int *p, *q; // 定义p,q为指向整数类型变量的指针 float * // 定义point为指向float型变量的指针 double * // 定义pd为指向double型变量的指针 int (*pa)[10]; // 定义pa为指向int型数组的指针 int (*pu)(); // 定义pu为指向int型函数的指针 int ** // 定义qq为指向int型指针的指针 还有指向结构、联合的指针,后面再介绍 C语言程序设计第七讲 指针3、指针赋值 例 // 定义一个整型变量akey int *p,*q; // 定义p,q为指向整型变量的指针变量 akey=66; // 将66赋给akey p = & //将变量akey的地址赋给p,这时见图1 q = // 将p的值赋给q,见图2p akey&akey&p p 变量的地址66&akey akey变量的地址 图1图 1 的说明:将akey 变量的地址赋给指针 p,意味着让指针 p 指向 akey C语言程序设计第七讲 指针p a&a&p66q=p;q图2&a&q 图 2 的说明:当着执行q=p;之后,p 中所存的 a 变量的 地址值,也就被放到 q 变量中,意味着让指 针 q 也指向 a C语言程序设计第七讲 指针#include &stdio.h& void main() { int a[5]={0,1,2,3,4}; //定义数组,赋初值 int *p1,*p2; //定义指针变量 p1=&a[1]; //赋值给指针变量,让p1指向a[1] p2=&a[2]; //赋值给指针变量,让p2指向a[2] printf(&a[1]=%d;a[2]=%d\n&,*p1,*p2); } C语言程序设计第七讲 指针 0 1 2 3 4&a[0] &a[1] &a[2] &a[3] &a[4]p1&a[1]p2&a[2]&p1&p2p1和p2分别指向a[1],a[2],这里 ? & ―― 取地址运算符 ? * ―― 指针运算符(间接访问运算符) ? *p1――间接访问p1所指向的内存单元,当然是输出a[1]的值 ? *p2――间接访问p2所指向的内存单元,当然是输出a[2]的值 C语言程序设计第七讲 指针4、向指针所指向的内存单元赋值 void main() { int akey,b; int *p,*q; akey=66; p=& q=&b; *q=*p; printf(“b=%d\n”,b); printf(“*q=%d\n”,*q); } C语言程序设计第七讲 指针p&akey66&akey *q=*pq&b66&b C语言程序设计第七讲 指针5、指针与数组 void main() { int a[5]={1,3,5,7,9}; int *p; p=a; for(i=0;i&5;i=i+1) {printf(&a[%d]=%d\n&,i,*p); p=p+1; } } C语言程序设计第七讲 指针说明 ? (1) p=a; 这里数组名作为数组的起始地址,即a[0]的地址。因此 p=a 等效于 p=&a[0]; ? (2) p=p+1; 如p指向a[0], 则p=p+1之后,p指向a[1] ? (3) 如果p=a 等效于 p=&a[0]; 则 p=a+4 等效于 p=&a[4]; p p+1 p+2 pa[1] a[2] a[3] a[4] a[5]等效p+1 p+2*p *(p+1) *(p+2) *(p+3) *(p+4) C语言程序设计第七讲 指针void main() { int a[5]={1,3,5,7,9}; int *p; int i=0; for(p=a;p&a+5;p=p+1) { printf(&a[%d]=%d\n&,i,*p); i=i+1; } } C语言程序设计第七讲 指针数组名是一个常量指针,指向该数组的首地址, 例 void main() { char *p; static char s[] = “abcdefgh”; p=s; while (*p != ?\0?) { p=p+1; } printf(“字串长度为%d\n”,p-s); } C语言程序设计第七讲 指针sabcdefgh\0s p图中数组的首地址是s[0]的地址,即&s[0]。s可看作是指 向s[0]的指针。s是不会动的,是常量指针。 C语言程序设计第八讲 结构体任务我们要作一张登记表,登记排队求职信息,包括:姓名、 年龄、性别、电话四个参数。希望便于管理,即可以插入 和删除,这时可采用结构类型变量。struct ST { char name[20]; // 字符串,姓名 // 整数,年龄 // 字符,性别 // 电话号码 }; // 注意,这里必须有分号 struct ST student1,student2 ; C语言程序设计第八讲 结构体在定义一个结构体类型时,可以用另一个结构类型来定义其中 的成员,即可以嵌套定义。例:struct date { }; struct person { char name[10];
}; C语言程序设计第八讲 结构体 结构体类型变量的引用 引用方式:结构体变量.成员名 对成员变量可以像普通变量一样使用,进行 各种运算。即:worker.name 、 worker.birthday 、 worker.certificate C语言程序设计第八讲 结构体结构指针 设一个指针变量,用来指向一个结构体变量,此时该变量 的值是结构体变量的起始地址。即:结构指针就是对已经定义的结构变量的一个起始地址 例:main () { struct student { char name[20]; }; C语言程序设计第八讲 结构体struct student stu_1; struct student *p; p=&stu_1; stu_1.num=10001; strcpy(stu_1.name,&Li Lin&); stu_1.sex='M'; stu_1.score=92.5; printf(&No.:%ld\n name:%s\n sex:%c\n score:%4.1f\n&, stu_1.num,stu_1.name,stu_1.sex,stu_1.score); printf(&\n No.:%ld\n name:%s\n sex:%c\n score:%4.1f\n&, (*p).num,(*p).name,(*p).sex,(*p).score); } C语言程序设计第八讲 结构体注:C语言中,为了使用方便和直观,可以把(*p).num 用p-&num来代替 即以下三种形式是等价的a)结构体变量.成员名 b)(*p) .成员名 c)p-&成员名 C语言程序设计第八讲 结构体用指针处理链表 (1)链表的基本概念 链表是一种重要的数据结构,主要用以实现对数据的动态存 储,链表中包含若干个结点( 又可称为元素),每个结点 包含的数据有两部分:一是用户的实际数据,二是下个结 点的地址信息,这样,结点都按这个原则“连接”起来, 在这种链式结构中,每个结点只有一个“前驱”和一个 “后继”,所以,只要知道链中第一个结点的地址,就可 以遍访链中的其他结点。 C语言程序设计第八讲 结构体头指针:存储第一个结点的指针变量 (*head) 表头由头指针指向的结点,有后继而无前驱 表尾:表的最后一个结点,有前驱而无后继,其下一个的 地址信息为空(NULL) 结点的表述:以结构体变量描述struct student { struct student * }; C语言程序设计第八讲 结构体如下所示为典型的单链表结构头指针head 数据 指针首地址40 3 15 4首地址10 NULL首地址20首地址15 C语言程序设计第八讲 结构体链表的建立 例子:已有一个如图所示的链表。它是按结点中的整数域从小 到大排序的。现在要插入一个结点,该节点中的数为10。head5681215 nullp10待插入结点 C语言程序设计第八讲 结构体分析考虑将结点p插入链表head中,分如下三种情况1、第一种情况,链表还未建成(空链表),待插入结点p实 际上是第一个结点。这时必然有head==null。只要让头指针指向p就可以了。语句为 head = p-&next = 2、第二种情况,链表已建成,待插入结点p的数据要比头结 点的数据还要小,这时有p-&num &head-&num 。当然p结点要插在head结点前。3、第三种情况,链表已建成,待插入结点p的数据比头结点 的数据大,需要找到正确的插入位置。这时,可以借助两 个结构指针r和q,利用循环比较来找到正确位置。然后将 结点p插入到链表中正确的位置。 C语言程序设计第八讲 结构体r q6 head81215p13 null说明:这种情况下,p结点已经与链表的第一个结点比 较过了,所以从链表的下一个结点开始比较。13&8, 继续比较。 C语言程序设计第八讲 结构体r q6 head81215 nullp13null说明:13&12,继续比较。 C语言程序设计第八讲 结构体r q6 head81215 null说明p 13&15,找到了正确的插入位置, 则插入结点p。语句为:r-&next = p-&next =13 C语言程序设计第八讲 结构体 #include &stdio.h& // 预编译命令 #include &malloc.h& // 内存空间分配 #define null 0 // 定义空指针常量 #define LEN sizeof(struct numST) struct numST { struct numST * }; C语言程序设计第八讲 结构体// 被调用函数insert(),两个形参分别表示链表和待插入的结 点 void insert (struct numST **phead, struct numST *p) { struct numST *q,*r; if ((*phead)==null) // 第一种情况,链表为空 { *phead = // 链表头指向 // 完成插入操作,返回 } else // 链表不为空 { // 第二种情况,p结点num值小于链表头结点的num值 if ( (*phead)-&num & p-&num) { // 将p结点插到链表头部 p-&next = *// 将p的next指针指向链表头(*phead) *phead = // 将链表头赋值为 // 返回 C语言程序设计第八讲 结构体// 第三种情况,循环查找正确位置 r = * // r赋值为链表头 q = (*phead)-& // q赋值为链表的下一个结点 while (q!=null) // 利用循环查找正确位置 { // 判断当前结点num是否小于p结点的num if (q-&num & p-&num) {r = // r赋值为q,即指向q所指的结点 q = q-&// q指向链表中相邻的下一个结点 } else // 找到了正确的位置 // 退出循环 } // 将p结点插入正确的位置 r-&next = p-&next = } } C语言程序设计第八讲 结构体void main() // 主函数开始 { // 函数体开始 struct numST *head, *p; // ST型结构指针 head =// 分配两个ST结构的内存空间,用于构造链表 head = (struct numST *) malloc(LEN); head-&next = (struct numST *) malloc(LEN); // 为链表中的两个结点中的num赋值为5和10 head-&num = 5; head-&next-&num = 10; head-&next-&next = // 链表尾赋值为空 // 构造一个结点p,用于插入链表 p = (struct numST *) malloc(LEN); p-&num = 8; p-&next = insert(&head, p); } C语言程序设计第八讲 结构体 动态地开辟和释放存储单元的函数malloc( size ) ――在内存的动态存储区中分配一个长 度为size的连续空间。此函数值是一个指向分配域起始地址的指针。calloc( n, size ) ――在内存的动态存储区中分配 n个长度为size的连续空间 此函数值是一个指向分配域起始地址的指针。free( ptr ) ―― 释放由ptr指向的内存区。ptr是最近一次调用calloc或malloc函数时返回的值 (指针) C语言程序设计第八讲 结构体例a)p=(float *)malloc(4); 开辟4个字节的存储空间,并把此地址赋 给指针pb ) new=(struct work *)malloc(struct work); 开辟一个能容纳结构变量work的空间,并 把这个空间的首地址赋给结构指针new
【c】C语言程序设计任课:何兴恒
cug_ 课程安排讲授课时:40 课时16使用教材:C程序设计(第三版),谭浩强 实习教材C语言课程设计与学习指导,张冬梅等 第一章计算机语言与C语言概述1.1 计算机语言概念 ■计算机语言定义 计算机能够识别和接受的语言。要使计算机按自己的意图工作, 必须使用计算机所能接受、理解和 执行的指令指挥计算机工作。 ■计算机语言的种类机器语言计 算 机 语 言低级语言(面向计算机)汇编语言BASIC 入门语言 F77 科学计算 高级语言 Foxpro 数据库管理 (面向问题 ) C 多用途…… …… ?机器语言 最早问世,用二进制代码构成指令。如100000 (+) 110000 (-) 用机器语言编程的缺点─繁琐、不直观、不易调试。如计算y=2x2+3x-1需要七八条指令。─移植性差。依赖于计算机。 ?汇编语言 用符号构成指令,如:MOV、ADD 用汇编语言编程相对直观,但仍繁琐,仍是面向计算 机的语言。汇编语言是计算机间接接受的语言 ?高级语言 与低级语言相比,有根本性的区别是面向问题的语言。高级语言的一条指令(语句)y=2*x*x+3*x-1; 对应于:y=2x2+3x-1 y=sin(x); 对应于:y=sinx 用高级语言编程直观、易懂、移植性好(不依赖于具体计 算机) 上机运行高级语言程序需经过编译:编译高级语言源程序执行机器指令 目的程序 结果编译程序要上机完成一个计算问题,主要的任务就是 用高级语言编写出相应的源程序。即至少要 学会一种计算机语言。 1.2C语言的特点集高级语言和低级语言的优点于一身●能实现低级语言的大部分功能(如直接 访问内存物理地址、进行位操作等)。●图形功能强。●运算符和数据结构丰富。●语法限制不太严格,程序设计自由度大。●生成目标代码质量高,程序执行效率高。 1.3简单的C程序介绍例1:main() 主函数说明 { 程序框架 printf(“abcdef”); 函数体 } 语句程序的功能是输出字符串:abcdef 例2:求两数之和。main() { int a,b,c; a=100; b=50; c=a+b; printf(“\n c=%d”,c); }程序运行结果:c=150a b c 例3:求两数中的最大值。函数类型 函数名 形参 main() int max (int x,int y) { int a,b,c; { scanf(“%d,%d”,&a,&b); if(x&y) z=x; c=max(a,b); else z=y; printf(“\nmax is:%d”,c); return(z); } }a b c3 5 5x y z3 5 5(两个函数组成) 总结上例可知(1) C程序由函数构成。(2) 函数由两部分组成函数说明部分:函数名、函数类型、形 参名、形参类型。函数体:实现函数的具体操作;由语句 构成。(3) 程序总是从main函数开始执行。(4) 书写格式自由。(5)语句必须有分号。: 第二章2.1 算法的概念算法要利用计算机处理问题,光学习语言的语法规则还不够,最重要的是要学会针对各类型的问题,拟定出有效的解题方法和步骤。解题方法和步骤就是算法。 算法:为了解决一个问题而采取的有限步骤。计算机算法:如何使计算机一步一步地工作的具体过程。 利用计算机处理问题的步骤1)设计好算法――算法设计; 2)用计算机语言实现算法――程序设计。算法必须是“有效”的。算法设计还要充分考虑算法的好坏。衡量算法好坏的主要标准① 程序简练。② 执行速度快。③ 占空间少。 例:考虑 s=∑i110的算法。算法①:直接表达。直接用语句 s=1+2+3+4+5+6+7+8+9+10当项数较多时该算法不适用 算法②:迭代法(累加求和法) s=1+2+3+4+5+6+7+8+9+10 算法步骤s i ① 使s=0 + 10 6 3 1 0 5 4 3 2 1 ② 使i=1 累加器 记数器 ③ s+i→s 该算法通用,是好算法 ④ i+1→i ⑤ 若i≤10转③,否则转⑥ ⑥ 输出s 2.2算法的表示算法需要有统一的表示方法 常用的表示方法有自然语言 流程图 结构化流程图 N-S流程图. 1、自然语言 对于计算 s=1+2+3+4+5+6+7+8+9+10 用自然语言表示为① 使s=0 (s为累加器) ② 使i=1 (i为计数器) ③ s+i→s (累加求和公式) ④ i+1→i (计数器加1) ⑤ 若i≤10转③,否则转⑥ ⑥ 输出s的值 特点:通俗易懂、文字冗长、含义不大严格。 2、流程图 用流程图符号表示算法。常用的流程图符号起止框 处理框 输入输出框 流程线判断框 对于计算 s=1+2+3+4+5+6+7+8+9+10 用流程图表示为:s+i → s0→ sS+i → si+1 → i Y i≤101→ iN输出s直 观 形 象 , 易 于 理 解 , 次 序 清 楚 3、结构化流程图传统的流程图有一个弊端:对流程线没 有严格的限制,对于较复杂的算法可能会 变成乱麻一般(BS型算法)。为克服这一弊端,提出了由三个基本结构 组成算法流程图的思想结构化流程图 三个基本结构① 顺序结构 按固定顺序(从上到下或从左到右)执行 的结构。a ABb ② 选择结构 根据条件P选择执行哪一个分支。a成立成立 不成立不成立p A Bb 例:计算y= 1/x y= 10000 当x≠0时 当x=0时 的算法流程图图:选择结构输入x Y NX=0?10000→y输出y1/x→y ③ 循环结构 重复执行某些操作的结构。分为两种当型循环和直到型循环。a aAP1 N b YAP2 Y b N当型循环直到型循环 可以看出,每个基本结构都只有 一个入口和一个出口,因此,用三 个基本结构构成的流程图不会象乱 麻一般,用三个基本结构构成的流 程图就成为结构化流程图,用结构 化流程图描述的算法称为结构化算 法,相应的程序设计就称为结构化 程序设计。 观察前例:顺 序 结 构0→ s 1→ i yS+i → s i+1 → i循 环 结 构i≤10 n输出s 4 N-S流程图N-S流程图的三个基本结构顺 序 结 构AP成立BA选 不成立 择 结 B 构B循 环 结 构当P1A 直到P2 例:计算 y= 1/x y= 10000 的N-S流程图:输入xX=0? 是当x≠0时 当x=0时否10000→y输出y1/x→y 例计算 s=1+2+3+4+5+6+7+8+9+10 的N-S流程图:0→ s 1→ i 0→ s 1→ ii≤10s+i → si+1 → i直到i&10s+i → s i+1 → i 输出s输出s直到型当型 第三章3.1数据类型、运算符 与 表达式C 的数据类型●基本类型 (整型、实型、字符型、枚举型) ●构造类型 (略) ●指针类型 (略)●空类型各类型包含常量与变量 3.2常量与变量■常量与符号常量 常量 在程序运行过程中其值保持不变的量。符号常量用来代表一个常量的标识符。#define PI 3.1415926 例#define PI 3.1415926 main() { float r=2,c; c=2*PI*r; printf(“%f”,c); } ■变量 其值可以改变的量。变量的三要素① 变量名 每个变量有一个名字,作为识别该变量的 标识符。② 变量的值 每个变量有一个值,变量的值是随时 可以改变的。 ③变量的存储单元 每个变量占据一个内存单元,用于存放变量 的值。变量名a 变量值3存储单元 变量的命名规则由字母、数字和下划线组成 以字母或下划线开头a、x1、y_2、_b1、_1c 1x、a+2、Ф、Ω 合法 不合法变量必须先定义后使用。程序中何时使用常量?何时使用变量? 3.3 整型数据 ■整型常量 即整常数,c的整常数有三种形式①十进制整数 与数学中的整数一致,如:100,123,15等。②八进制整数 以0开头的整数,如:010,07,020等。③十六进制整数 以0x开头的整数,如:0x10,0xff,0x2a等。 ■整型变量 用于存放整数的变量。分4种类型①基本型:int a 16位,可表示的数值范围:-3 ②短整型:short int b 16位,可表示的数值范围:-3 ③长整型:long int c 32位,数值范围:-― ④无符号型:加上 unsigned 只存放正数。如:unsigned int x 变量x为无符号整数,16位全表示数码, 数值范围:0―65535 在程序设计中,如果要使用整型变 量,必须首先选择以上类型符来定义变量, 然后才能使用; 例main() { int a,b,c; a=100; b=50; c=a+b; printf(“%d”,c); }定义使用一般根据什么原则选择变量的类型? 3.4实型数据■实型常量 可使用两种形式表示①小数形式:如 1.23, 3.1415926 ②指数形式:如 1e-20 1.23e5 15.48 ■实型变量 用于存放实数的变量 分单精度和双精度两种float a,b 定义a和b为单精度型变量 32位,7位有效数字,10-38―1038 double x,y 定义x和y为双精度型变量 64位,15位有效数字,10-308―10308 例main() { float r,c; double r,c; r=5; c=2*3.1415926*r; printf(“%f”,c); } 3.5字符型数据■字符常量 用单引号括起来的一个字符。’a?,?x?,?*?,?1?等除此外,以’\?开头的字符如’\n?,?\t?等 称为转义字符,祥见书表3.3 ■字符型变量用于存放字符的变量。char c1,c2 定义c1和c2为字符型变量 c1=?a?; c2=?b?; 字符赋值字符型变量存放一个字符,占据一个字节 ■字符型数据的存储形式 a 存放ASCII码 不是 而是 97 如字符’a?在内存中存放97,’b? 存放98。与整数的存储形式一致,它们之间可以通 用 一个字符数据既可以作字符用,也可以作 整数用(取其ASCII代码)。如:32+?a?相当于 32+97 若 则 x=?a?; c=97; x=97; c=?a?; 都允许 ■字符串常量 用双引号括起来的字符序列。如:”abcde”,”china” ”a”也属字符串。注意”a”与’a?的区 别。对于 c=”a”; 用法错误 字符串中每个字符各占一个字节,并且在 字符串结尾加上一个结束标记’\0?如:”china” 在内存中占6个字节。c h i n a \0C语言中专门的字符串变量,可用字符数 组存放(以后介绍)。 3.6 变量赋初值 在定义变量的同时给相应的变量赋初值。如int a=3; a 3 float b=5.2; char c=?a?; int x=y=z=6; 效果在给变量分配内存单元的同时在相应的单 元中存放初值。 3.7各数值型数据间的混合运算整型、实型、字符型数据间可以进行混合运 算,如10-?a?*1.5 运算时,参加运算的两个数据如果类型不同, 则首先将其类型转换成一致再运算,转换规则 是将优先级低的类型转换到优先级高的类型 数据类型的优先级:高double long unsignde 低 floatintchar 算术运算符与算术表达式 ■基本的算术运算符 + - * / % ■算术表达式 用算术运算符将运算对象连接起来的式子 用于表达数学公式的式子 如:2*x+y-1/a 表达式经过运算最终得到一个值算术表达式的值3.8 ■运算符的优先级与结合性 优先级在对表达式求值时,如果存在多个运算符,则 运算的先后次序按运算符的优先级别从高到底进 行。运算符的优先级关系为高:* / % 低:+ 如:a-2*x 先算 * 2*(a+2) 有括号的情况? 结合性如果在一个运算对象两边的运算符的优先级相 同,则按规定的“结合方向”处理。如:a-b+c b与-结合是从左到右,称“左结合性”。b与+结合是从右到左,称“右结合性”。每个运算符都有相应的优先级和结合性。基本算术运算符都是左结合性。 计算表达式例2+?A?-1/2.0 1+3/2-1 构造表达式例 2x2+3x-1 a+b a+ba-b2*x*x+3*x-1 (a+b)/(a-b) ? a+b/a-b(*不能省)a-b x+y x-y(a+b)/(a-b)/(x+y)/(x-y) (a+b)/(a-b)/((x+y)/(x-y))(a+b)/(a-b)/(x+y)*(x-y) ■强制类型转换可以用强制类型转换运算符将一个表达式 的值转换成所需类型如(int)(x+y) (float)(7%3) 应用举例:int a=200,b=300,c; c=(long)a*b/100; ? c=(long)(a*b)/100; c=a*b/100;可知,有自动转换和强制转换, 当自动转换达不到目的时,可用强制转换。 ■自增、自减运算符 自增运算符:++ 使变量值加1 自减运算符:-使变量值减1 两种用法++i, --i 先加(减)后用 i++, i-先用后加(减) 两种用法对i效果一样,但表达式的值不同。例:假设i的原值为5j=++i; j=? j=i++; j=? 注意●++和--只能用于变量。如:3++和(a+1)++ 不合法 ●++和--为右结合性。(-i)++ -i++ -(i++) 若i的原值是5,则该表达式的值是多少? 例:分析执行下列语句后的结果:a=5; a b=a++; 6 5 c=--a-b++; d=(a++)-(++b)+c--;b 7 6 5c -1 0d -2 两种特殊情况① k=(i++)+(i++)+(i++)②i+++j是 i+(++j) 还是 (i++)+j ?i++虽然与i=i+1等效,但使用自增自减 运算符的代码优化程度好,因而经常使用; 但用时需特别小心。 3.9 赋值运算符和赋值表达式■赋值运算符“=”称赋值运算符,其作用是将一个数据赋给一个变量。如a=5不要理解为“等号”。执行赋值运算的结果,是将右边的数据存入左边变量所对应的内存单元中。 ■赋值规则 如果赋值运算符两侧的类型不一致,则在赋 值时要进行类型转换,转换规则为●实型→整变量 舍去小数部分。int a=5.5; a中为5。●整型→实变量 数值不变,以浮点形式存储。●字符型→整变量 放在整形变量低8位。保持原值不变原则。int a=?A?; ■复合赋值运算符 在赋值运算符前加上其它运算符,可以构成 复合赋值运算符。a+=3 ―― a=a+3 b-=x+5 ―― b=b-(x+5) x*=c-6 ―― x=x*(c-6) y/=a*4 ―― y=y/(a*4) k%=b-2 ―― k=k%(b-2) 属于高效率运算符。 ■赋值表达式 主要实现赋值运算的表达式。一般形式&变量&=&表达式& 如a=5 y=2*x+3 a=a+1不是衡等作用:将右边表达式的值赋给左边的变量。赋值表达式的值取左边变量的值。 赋值表达式右边的&表达式&可以是任何表 达式,如a=(b=5) 赋值表达式中包含赋值表达式赋值运算符的优先级低于所有算术运算符,且是右结合性。a=(b=5) 与 a=b=5 等效。 例:计算以下表达式的值:a=b=c=5a=5+(c=6)a=(b=4)+(c=

我要回帖

更多关于 已知正方形面积求周长 的文章

 

随机推荐