C语言程序设计课件

PPT
  • 阅读 36 次
  • 下载 0 次
  • 页数 185 页
  • 大小 829.000 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言程序设计课件
可在后台配置第一页与第二页中间广告代码
C语言程序设计课件
可在后台配置第二页与第三页中间广告代码
C语言程序设计课件
可在后台配置第三页与第四页中间广告代码
C语言程序设计课件
C语言程序设计课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 185
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
文本内容

【文档说明】C语言程序设计课件.ppt,共(185)页,829.000 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44526.html

以下为本文档部分文字说明:

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语言程序设计1.1认识C语言程序1.程序实例#include<stdio.h>//预编译命令,将标准输入输出函数//作为头文件包

扩到用户源文件中#include<math.h>//预编译命令,将系统提供的数学函数//作为头文件包扩到用户源文件中main()//主函数,名为main,{//函数体.开始floata,b,c;//声明部分.定义变量类型b=30.0;//执行部分.赋值语句a=sin(b*3.141

59/180);//执行部分.赋值语句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赋给变量ba=sin(b*3.14159/180);//读作将表达式(正弦函数)的值赋给变量a第一讲简单的C程序设

计C语言程序设计6.变量赋值特点(1)先定义,后使用intd,e,f;定义三个变量为整数类型如未定义,则在编译时被查出,认为非法(2)变量未被赋值前,值为未知(3)对变量赋值过程是“覆盖”过程,用新值去替换旧(4)读出变量的值,该变量保持不变(5)参与表达式运算的所有变量

都保持原来的值不变第一讲简单的C程序设计C语言程序设计变量赋值过程def未赋值前执行d=7执行e=d执行f=d+e执行d=d+1000-12349723431607234316077077148714第一讲简单的C程序设计C语言程序设计

7.输出语句printf函数(格式输出函数)一般形式为printf(参数1,参数2,参数3,……,参数n)其中参数1——格式控制参数2,参数3,……,参数n——输出表列举例:floata;intb;a=85.56

;b=100;printf("%f%d",a,b);第一讲简单的C程序设计C语言程序设计格式控制是用双引号括起来的字符串,称“转换控制字符串”%f——第一个输出表列的格式说明,以小数形式输出单、双精度实数,隐含输出6位小数%d——第二个输出表列的格式说明,以带有

符号的十进制形式输出整数(正数不输出符号)显然,%f是控制实数a的;%d是控制整数b的第一讲简单的C程序设计C语言程序设计为了醒目,格式控制项中除格式说明之外可以有•普通字符例:printf(“a=%fb=%d",

a,b);输出结果为:a=85.560000b=100•换行符号例:printf(“a=%f\nb=%d”,a,b);输出结果为:a=85.560000b=100•域宽和精度例:printf(”%5.3f”,a);第一讲简单的C程序设计C语言程序设计8.数学函数sin(x)x为弧度,doublex

,doublesin(x)cos(x)cos(x)exp(x)exlog(x)logexlog10(x)log10xfabs(x)xfmod(x,y)整除x/y的余数floor(x)求不大于x的最大整数po

w(x,y)xysqrt(x)x1/2第一讲简单的C程序设计C语言程序设计9.算术运算符+加-减*乘/除%模(取余数)第一讲简单的C程序设计C语言程序设计1.3作业第一讲简单的C程序设计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!”显示“Grea

t!”显示“Wrong!”显示“Sorry!”结束假真第二讲分支结构C语言程序设计本实例的N-S流程图如图所示输入a的值a==6显示“Right!”显示“Great!”显示“Wrong!”显示“Sorry!”第二讲分支结构C语言

程序设计2.程序代码:#include<stdio.h>main(){inta=0;printf("Inputa:");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次运行结果:Inputa:6<回

车>a=6Right!Great!第2次运行结果:Inputa:5<回车>a=5Wrong!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(){floatw=0.0;printf("Inputw:");scanf("%f",&w)

;printf("w=%.1f\n",w);if(w>=50&&w<=55)printf("Ok\n");elseprintf("No\n");}第二讲分支结构C语言程序设计3.运行结果:第1次运行结果:Inputw:53.5<回车>w=53.5Ok第2次运行结果:Inputw:60.7<回车>

w=60.7No第二讲分支结构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,则显示“Dataover!”。1.编程思路:在上实例中,输入w的值后立刻用if语句实现选择执行“printf(“Ok\n");”或“printf("No\n");”的功能,但由于本题目是在w的值大于0

且小于200的情况下,才能执行此if语句,所以在此if语句外面还需要套另一个if语句。第二讲分支结构C语言程序设计本实例的程序流程图:课堂作业:请根据此图画出其N-S流程图。开始输入w值w>0且w<200显示“Ok”显示“Da

taover!”结束假真w≥50且w≤55真假显示“No”第二讲分支结构C语言程序设计2.程序代码:main(){floatw=0.0;printf("Inputw:");scanf("%f",&w);printf("w=%.1f\n",w);if(w>0&&w<

200)/*外嵌if语句开始*/if(w>=50w<=55)/*内嵌if语句开始*/printf(“Ok\n");elseprintf("No\n");/*内嵌if语句结束*/elseprintf("D

ataover!\n");/*外嵌if语句结束*/}第二讲分支结构C语言程序设计3.运行结果:第1次运行结果:Inputw:53.5<回车>w=53.5Ok第2次运行结果:Inputw:60.7<回车>w=60.7No第3次运行结果:Inputw:201.7<回车>w=201.7Datao

ver!第二讲分支结构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-elseif形式的嵌套if语句【实例】编写程序,求下面分段函数的值,要求x的值从键盘输入。x+2(0≤x<5)y=0(x<0)x2-3(5≤x<10)10(x≥10)第二讲分支结构C语言程序设计1.编程思路:开始输入x值x<0结束假真真假显示x和y

的值x<5真假x<10y=x+2y=10y=x2-3y=0第二讲分支结构C语言程序设计2.程序代码:#include<stdio.h>main(){floatx=0,y=0;printf("Inputx:");scanf("%f",&x);if(x<0)y=0;elseif(x<5)y=x+2;

elseif(x<10)y=x*x-3;elsey=10;printf("x=%f,y=%f\n",x,y);}第二讲分支结构C语言程序设计2.5switch语句在日常生活中经常遇到菜单选择操作,例如,用ATM自动取款机取钱时,从菜

单中可以选择语种、取款额;用自动服务系统给手机充值时,可以选择查余额还是充值,对本机充值还是对其他号码充值等。这些问题一般使用switch语句解决。总之,这些问题都是多分支情况。第二讲分支结构C语言程序设计【实例】编写程序,在如下菜单中选择一个运算类型,并进行相应的运算。如选

择了加法,则进行求和运算。Pleasechoose+:addition-:subtraction*:multiplication/:division第二讲分支结构C语言程序设计„1.程序代码:#include<stdio.h>main

(){floata=5.0,b=2.0,c=0.0;charsym='\0';printf("Pleasechoose\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;break;case'-':c=a-b;break;case'*':c=a*b;break;case'/':c=a/b;break;}printf("%f\n",c);/*显示结果*/}

第二讲分支结构C语言程序设计2.运行结果:Pleasechoose+:addition-:subtraction*:multiplication/:division/<回车>5.000000/2.0000

00=2.500000第二讲分支结构C语言程序设计3.归纳分析:switch语句的一般形式为:switch(表达式){case表达式1:语句组1break;case表达式2:语句组2break;……case表达式n:语句组nbreak;default:

语句组n+1break;}其中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同学,让thi

sman='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=1a2=1an=an-1+an-2这里求前20项第三讲

循环结构C语言程序设计i<=20a1=1;a2=1;i=3an=a1+a2输出ani=i+1;a1=a2;a2=an;YendbeginN第三讲循环结构C语言程序设计该题目的N-S流程图a1=1;a2=1;an=0;i<=20an=a1+a2输出an

i=i+1a1=a2a2=an第三讲循环结构C语言程序设计2.程序源代码:方法一:for循环语句#include"stdio.h"main(){longa1,a2,an;inti;a1=a2=1;for(i=3;i<=20;i

++){an=a1+a2;printf(“a%d=%ld”,i,an);a1=a2;a2=an;}}可否调换?第三讲循环结构C语言程序设计方法二:while循环语句#include"stdio.h"main(){longa1,a2,an;inti;a1=a2=1;i=3;w

hile(i<=20){an=a1+a2;printf(“a%d=%ld”,i,an);a1=a2;a2=an;i++;}}第三讲循环结构C语言程序设计方法三:do-while循环语句#include"stdio.h"main(){longa1,a2,an;inti;a1=a2=1;i=3

;do{an=a1+a2;printf(“a%d=%ld”,i,an);a1=a2;a2=an;i++;}while(i<=20);}第三讲循环结构C语言程序设计3.归纳分析(1)for语句格式:for(表达式1;表达式2;表达式3){语句}即:for(循环变量赋初值,循环结束条件,

循环变量增值){语句}第三讲循环结构C语言程序设计For语句执行过程表达式1表达式2表达式3语句YN第三讲循环结构C语言程序设计表达式可以省略,但分号不能省略a)省略表达式1i=1for(;i<=50;

i++)sum=sum+2*ib)省略表达式2——产生死循环for(i=1;;i++)sum=sum+2*ic)省略表达式3for(i=1;i<=50;){sum=sum+2*i;i++;}d)省略表达式1,省略表达式3i=1for(;

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语句br

eak:可以用来从循环体内跳出循环体(提前结束循环)continue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断例:输出100以内能被7整除的数。intn;for(n=7;n<=100;n++){i

f(n%7!=0)continue;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+2222+2222

2(此时共有5个数相加),几个数相加由键盘输入控制。2.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?3.求1+2!+3!+...+20!的和4.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一

半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?第三讲循环结构C语言程序设计3.2循环的嵌套使用【实例】搬砖问题。

36块砖,36人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、女、小孩各若干?1.分析:列方程,得出问题条件:w+m+c=364*m+3*w+c/2=36可以用枚举的方法,让变量w在0~9、m在0~12、c在0~36的偶数中取值,形成满足上述条件的w、m、c的组合第三讲

循环结构C语言程序设计N-S流程图m<9w<12c=36-m-w且c%2==04*m+3*w+c/2==36输出m、w、cTrueFalsew=0w=w+1;m=m+1;m=0第三讲循环结构C语言程序设计2.程序main(){intm,w,c;for(m

=0;m<9;m++)for(w=0;w<12;w++){c=36-w-m;if(c%2!=0)continue;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为1tb=((B==2)+(E==4))==1;符合B选手的话,则tb为1tc=(

(C==1)+(D==2))==1;符合C选手的话,则tc为1td=((C==5)+(D==3))==1;符合D选手的话,则td为1te=((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)A*B*C*D*E=120求ta、tb、tc、td、tet=ta+tb+tc

+td+tet==5输出ABCDETrueTrueFalseFalseC语言程序设计作业:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: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作案ABCC1000101011111显然这是或的关系,因此有CC1=(A||B)第三讲循环结构C语言程序设计CC2:A和D不可能是同案犯可以分析为:A如果是案犯,

D一定不是案犯,写成A&&(!D)D如果是案犯,A一定不是案犯,写成D&&(!A)这两者之间是或的关系,因此有CC2=!(A&&D)ADA&&DCC21001111000010101第三讲循环结构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++)计算CC1CC2CC3CC4CC5CC6判断这些值是否都为1TrueFalse输出ABCDEF为1的C语言程序设计问题:哪只羊最重?中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊宴请宾客,当然要选最重者。这样就要记录每只羊的重量,

如果有成千上万只羊,不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的数组。第四讲数组C语言程序设计1.程序分析:max=0.0将记录最重的羊的重量for(i=0;i<10;i++)提示输入第i只羊的重量输入第i只羊的重量sheep[i]max<sheep[i]YesNo

max=sheep[i]k=i输出max和k的值第四讲数组C语言程序设计2.程序main()//主函数{floatsheep[10];//数组,有10个浮点类型元素floatmax;//浮点类型变量,存放最肥羊的重量inti,k;//整型变量,i用于计数循环,k用于记录最肥羊的号max

=0.0;//赋初值0for(i=0;i<10;i=i+1)//计数循环{printf(“请输入羊的重量sheep[%d]=”,i);scanf(“%f”,&(sheep[i]));if(max<sheep[i]){max=s

heep[i];//让第i只羊为当前最肥羊k=i;}}printf(“max=%f\nnumber=%d\n”,max,k);}第四讲数组C语言程序设计3.归纳分析(1)数组的定义类型说明符数组名[常量表达式]例:floatsheep[10];inta2001[1000];说明①数组名的第一个

字符应为英文字母;②用方括号将常量表达式括起;③常量表达式定义了数组元素的个数;第四讲数组C语言程序设计④数组下标从0开始。如果定义5个元素,是从第0个元素至第4个元素;例如inta[5]定义了5个数组元素如下:a[0],a[1],a[2],a[3],a[4]这是5个带

下标的变量,这5个变量的类型是相同的⑤常量表达式中不允许包含变量;例如intn;n=5;inta[n];不合法!第四讲数组C语言程序设计(2)数组初始化是定义数组完成赋初值的任务例如inta[5]={3,5,4,1,2}

;aa[0]=3;a[1]=5;a[2]=4;a[3]=1;a[4]=2;35412下标01234第四讲数组C语言程序设计(3)数组在内存中分配一段连续的存储空间内存地址变量名FF02FF01FF00FF03F

F04FF05FF06FF07a[0]a[1]a[2]a[3]00000000000000110000000000000101000000000000010000000000000000010000000000000010FF08FF09a[4]a数组名第四讲

数组C语言程序设计思考:1.#include<stdio.h>voidmain(){inta[4];//声明项printf(“a[0]=%d;a[1]=%d;a[2]=%d;a[3]=%d\n”,a[0],a[1],a[2],a[3]);}2.其他不变,改变声明项为inta[4]={0,1,

2,3};第四讲数组C语言程序设计3.其他不变,改变声明项为inta[4]={3,8};4.其他不变,改变声明项为inta[4]={2,4,6,8,10};5.其他不变,改变声明项为inta[4]={2,4,6,d};6.其他不变,改变声明项为intn=4;inta[n]={0,1,2,3};第

四讲数组C语言程序设计第四讲数组【实例】将几个数从大到小排序并输出,冒泡排序法i=1i=2i=3i=4i=5i=6a[1]a[2]a[3]a[4]a[5]a[6]初始值183249比较1和8,调换183249比较1和3,调换813249比较1和2,调

换831249比较1和4,调换832149比较1和4,调换8324191到达位置832491比较8和3,不动832491比较3和2,不动832491比较2和4,调换832491比较2和9,调换834291

2到达位置834921C语言程序设计i=1i=2i=3i=4i=5i=6a[1]a[2]a[3]a[4]a[5]a[6]中间值834921比较8和3,不动834921比较3和4,调换834921比较3和9,调换8439213

到达位置849321比较8和4,不动849321比较4和9,调换8493214到达位置894321比较8和9,调换8943218到达位置984321第四讲数组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=6j——扫描遍数,j=1,2,…,n-1i——第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()//主函数{inti,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]=p;}}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的最小正因数,则据初等数论只要找到c就可以确认n为合数,将其筛去。nc1第四讲数组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==0prim[i]=1for(i=2;i<=100;i++)prim[i]==0输出iYesYes

NoNo第四讲数组C语言程序设计二维数组问题:求矩阵a的最大值135a=792468第四讲数组C语言程序设计1.二维数组定义格式:类型说明符数组名[常量表达式][常量表达式]例:inta[2][3]={{3,5},{4,1},{2,6}};说明:a)每一维的下标从

0开始,整个数组元素为:2×3=6个b)C语言中,二维数组中元素排列的顺序是按行存放。即:先存放第一行的元素,再存放第二行的元素第四讲数组C语言程序设计二维数组在内存中的分配情况内存地址变量名FF02FF01FF00FF03FF04FF05FF06

FF07a[0][0]a[0][1]a[1][0]a[1][1]00000000000000110000000000000101000000000000010000000000000000010000000000000010FF08FF09a[2][0]a数组名……第四讲数组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的最大值135a=792468问题分析:将矩阵放入二维数组a[3][3]中首先定义变量max=a[0][0],max与a[0][1]比较,若发现max<a[0][1],则将max=a[0][1]

,这样max与数组元素逐个比较,最后找到数组中最大的一个。采用二重循环分别对行和列进行控制。外层控制行标,内层控制列标。第四讲数组C语言程序设计作业1.打印魔方阵:816357492算法:1.将1放到第1行的中间。2.下一个数放在该数的前一行后一列。3.若该位置已经有数,则放在前一数的正下方。4

.当前数是右上角时,其下一个数放在其下方。5.若当前是第1行,则其前一行为第n行,若当前列是第n列,则其后一列为第1列。第四讲数组C语言程序设计1nkxx问题:编程求解我们用函数来编写这个题的程序,参考程序如下:#include<stdio.h

>//预编译命令#definen6//定义n为6#definek4//定义k为4voidmain()//主函数{printf("sumof%dthpowersofintegersfrom1to%d=",k,n);pr

intf("%d\n",SOP(n,k));//输出结果,其中SOP(n,k)为被调用函数}61(4)lxsumxl第五讲函数C语言程序设计intSOP(m,l)//整型自定义函数,m,l为形参intm,l;//形参m,l为整型变量{inti,sum=0;

//整型变量i,sumfor(i=1;i<=m;i=i+1){sum=sum+power(i,l);}return(sum);}//返回值sum给函数sop(n,k)//以下函数是被函数sop(n,k)调用的函数intpower(p,q)/

/整型自定义函数intp,q;//形参p,q为整型变量{inti,product=1;for(i=1;i<=q;i=i+1){product=product*p;}return(product);}//累乘值product返回给power第五讲函数C语言程序设计<数据类型><

函数名>(<参数表>)例:intpower(p,n)power为函数名,要以英文字母开头。int是函数值的数据类型,这里是int(整型)。(p,n)括号中的p,n为函数的形式参数,形式参数也要定义其数据类型。函数定义的一般格式:<数据类型><函数名>(<参数表>)<参数说明;>{

<说明语句><执行语句>}函数的定义格式:第五讲函数C语言程序设计第五讲函数1、形式参数是在定义函数时放在函数名后括号中的参数。在未进行函数调用时,并不对形式参数分配内存单元。在发生函数调用时,立刻给形式参数分配内存单元。调用结束后,释

放掉行参所占的内存单元。2、因此,形参变量属于局部变量,其作用域在它所在的函数体内。3、在定义函数的时候,必须指定形参变量的类型,如何指定?有二种方法:形式参数与实在参数(1)intpower(p,n

)intp,n;{……}(2)intpower(intp,intn){……}有些编译系统不认识第(2)种形式C语言程序设计4、实在参数是一个具有确定值的表达式。函数在调用时,将实在参数赋给形式参数。比如,主函数调用SOP(n,k),这时,n,k为实在参数,n的值为6,k的值

为4。在被调用函数定义中,intSOP(m,l)中的m,l为形式参数,在SOP被调用时,系统给m,l这两个形式参数分配了内存单元之后,n的值6赋给m,k的值4赋给l。实在参数的个数及类型应与形式参数一致。赋值时前后对应关系不会改变。下面画出主函数与SOP函数,调用与被调用

时参数传递关系:第五讲函数C语言程序设计主函数执行下述语句时,printf(“%d\n”,SOP(n,k));传值给被调用函数intSOP(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次循环执行完后,实现的是61(4)lxsumxl注意这里xl是由另一个自定义函数

power(i,l)实现的。li第五讲函数C语言程序设计power(i,l)处在SOP(m,l)函数中,表示SOP函数去调用power函数。其中i,l为实在参数,而intpower(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语言程序设计6i=2:sum

=sum+power(i,l)=1+16=17调用返回执行power(2,4):product=2*2*2*2return(16)=16i=3:sum=sum+power(i,l)=17+81=98调用返回执行power(

3,4):product=3*3*3*3return(81)=81i=4:sum=sum+power(i,l)=98+256=354调用返回执行power(4,4):product=4*4*4*4return(256)=256i=5:sum=sum+power(i,l)=354+625

=979调用返回执行power(5,4):product=5*5*5*5return(625)=625执行power(6,4):product=6*6*6*return(1296)=1296调用=0+1=1

返回执行SOP(6,4)l=4sum=0i=1:sum=sum+power(i,l)执行power(1,4):product=1*1*1*1return(1)=1SOP(n,k)调用i=6:sum=su

m+power(i,l)=979+1296=2275return(sum)2275返回调用返回C语言程序设计第五讲函数Main()调用a函数结束a函数调用b函数结束b函数结束C语言程序设计例:求函数f(x)=x3+x+5的值,其中x=y3+y2+5y+6,求当y=1,2,3,4…,1

00时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!为例

画出了调用和返回的递归示意图Bfact(2)=2*fact(1)=2*1=2返回Afact(3)=3*fact(2)=3*2=6返回Cfact(1)=1调用调用第六讲递归及其实现C语言程序设计从图可以想象:欲求fact(3),先要求fact(2);要求fact(2)先求fact(1)。就象

剥一颗圆白菜,从外向里,一层层剥下来,到了菜心,遇到1的阶乘,其值为1,到达了递归的边界。然后再用fact(n)=n*fact(n-1)这个普遍公式,从里向外倒推回去得到fact(n)的值。为了把这个问题说得再透彻一点。我们画了如下的流程图:第六讲递归及其实现C语言程序设计

2))1312*)2121*111))))==fact(3)真假调用fact(计算3fact(fact(fact(==真假调用fact(1计算2fact(==真假fact(=1返回返回第六讲递归及其实现C语言程序设计将上图改为下图1)假真fact(3)真假3==1调用fact

(2真假2==11==1fact(2)=2*fact(1)返回fact(3)=3*fact(2)返回调用fact()fact(1)=1返回第六讲递归及其实现C语言程序设计在这个图中“内层”与“外层”有着相同的结构。它们之间“你中有我,我中有你”,呈现相互依存的关系。为了进一步讲清递归的概念,将递

归与递推做一比较。仍以求阶乘为例。递推是从已知的初始条件出发,逐次去求所需要的阶乘值。如求3!初始条件fact(1)=1fact(2)=2*fact(1)=2fact(3)=3*fact(2)=6第六讲递归

及其实现C语言程序设计这相当于从菜心“推到”外层。而递归算法的出发点不放在初始条件上,而放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。就本例而言,读者会认为递归算法可能是多余的,费力而不讨好。但许多实际问题不可能或不容易找到显而易见的递推关系,这时递归算

法就表现出了明显的优越性。下面我们将会看到,递归算法比较符合人的思维方式,逻辑性强,可将问题描述得简单扼要,具有良好的可读性,易于理解,许多看来相当复杂,或难以下手的问题,如果能够使用递归算法就会使问题变得易于处理。第六讲递归及其实现C语

言程序设计故事:相传在古代印度的Bramah庙中,有位僧人整天把三根柱子上的金盘倒来倒去,原来他是想把64个一个比一个小的金盘从一根柱子上移到另一根柱子上去。移动过程中恪守下述规则:每次只允许移动一只盘,且大盘不得落在小盘上面。有人会觉得这很简单,真的动手移盘就会发现,如以每秒移动一只盘子

的话,按照上述规则将64只盘子从一个柱子移至另一个柱子上,所需时间约为5800亿年。CAB第六讲递归及其实现C语言程序设计怎样编写这种程序?思路上还是先从最简单的情况分析起,搬一搬看,慢慢理出思路。1、在A柱上只有一

只盘子,假定盘号为1,这时只需将该盘从A搬至C,一次完成,记为move1fromAtoCCAB1第六讲递归及其实现C语言程序设计2、在A柱上有二只盘子,1为小盘,2为大盘。第(1)步将1号盘从A移至B,这是为了让2号盘能移动;第(2)步将2号盘从A移至C;第(3)步再将1号盘从B移至C;这三

步记为:move1fromAtoB;move2fromAtoC;move1formBtoC;CAB132第六讲递归及其实现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,一次到位。记为move3fromAtoC第(3)步处于B上的作为一个整体的2只盘子,再移至C。这一步记为mov

e(2,B,A,C)意思是将2只盘子作为整体从B借助A移至C。第六讲递归及其实现C语言程序设计移动过程如下图ABC132第六讲递归及其实现C语言程序设计4、从题目的约束条件看,大盘上可以随便摞小盘,相反则不允许。在将1号和2号盘当整体从A移至B的过程中move(2,A,C,B)实际上

是分解为以下三步第(1)步:move1formAtoC;第(2)步:move2formAtoB;第(3)步:move1formCtoB;经过以上步骤,将1号和2号盘作为整体从A移至B,为3号盘从A移至C创造了条件。同样,3号盘一旦到了C,就要考虑如何实现将1号和2号盘当整体从B

移至C的过程了。实际上move(2,B,A,C)也要分解为三步:第(1)步:move1formBtoA;第(2)步:move2formBtoC;第(3)步:move1formAtoC;第六讲递归及其实现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搬到Cmove(n,A,B,C)分解为3步(1)move(n-1,A,C,B)理解为将上面的n-1只盘子作为一个整体从A经C移至B;(2)输出n:AtoC,理解

将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:AtoB;第3步:再将上面的n-2只盘子作为一个整体从C经A移至B,move(n-2,

C,A,B);第六讲递归及其实现C语言程序设计47返回move(3,A,B,C)CBmove(2,A,,),,2Amove(B,C),B,move(2A,C)调用返回返回调用调用返回,,1move(BC,A),1,move(AB,C)1move(,A,B,C)输出1:AtoC1,,A,move(2

CB)1BCmove(,A,,)输出2:AtoBC1,,move(,AB)21move(,B,C,A)输出1:BtoA5输出2:BtoC6输出3:AtoC调用调用返回调用调用输出1:CtoB3move(1,C,A,B)输出1:AtoCmove(1,A,B,C)第六讲递归C语言程序设

计B输出3:AtoC调用move(1,C,A,B)输出:1:Cto输出:Atomove(1,C,A,B)调用move(1,A,B,C)1:AtoCmove(1,A,B,C)move(2,A,C,B)调用move(2

,A,C,B)调用move(2,B,A,C)调用move(1,A,B,C)输出1:AtoC输出:to调用move(1,B,C,A)输出1:BtoAmove(1,B,C,A)move(2,B,A,C)move(1,A,B,C)mo

ve(3,A,B,C)2:B输出2:BC1234567第六讲递归及其实现C语言程序设计intstep=1;//整型全局变量,预置1,步数voidmove(int,char,char,char);//声明要用到的被调用函数void

main(){intn;printf(“请输入盘数n=”);scanf("%d",&n);printf(“在3根柱子上移%d只盘的步骤为:\n”,n);move(n,'a','b','c');}voidmove(intm,charp,ch

arq,charr){if(m==1){printf("[%d]move1#from%cto%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上;第三步:1#再从荷叶跳至R上。如下图:2#1#213L左岸R右岸第六讲递归及其实现C语言程序设计当y=2时,Jump(0,2)=3;说明:河中有两片荷叶时,可以过3只青蛙。起始时:1#,2#,3#3只青蛙落在L上,第

一步:1#从L跳至叶1上,第二步:2#从L跳至叶2上,第三步:3#从L直接跳至R上,第四步:2#从叶2跳至R上,第五步:1#从叶1跳至R上,叶1315LR叶224采用归纳法:Jump(0,y)=y+1;意思是:在河中

没有石柱的情况下,过河的青蛙数仅取决于荷叶数,数目是荷叶数+1。第六讲递归及其实现C语言程序设计再看Jump(S,y)先看一个最简单情况:S=1,y=1。从图上看出需要9步,跳过4只青蛙。1#青蛙从L->Y;2#青蛙从L->S;1#青蛙从Y-

>S;3#青蛙从L->Y;4#青蛙从L->R;3#青蛙从Y->R;1#青蛙从S->Y;2#青蛙从S->R;1#青蛙从Y->R;SY546LR1237891#2#4#3#3#1#2#1#1#第六讲递归及其

实现C语言程序设计用L1L2L3L4表示左岸石柱上落在一起的青蛙的高度位置。L1在最上面,L4在最下面的位置。引入这个信息就可比较容易地看出对青蛙占位的约束条件。同理R1R2R3R4也是如此。对水中石柱S,也分成两个高度位置S1S2。对荷叶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。现在再看S=2,y=1Jump(2,1)我们将河中的两个石柱称作S1和S2,荷叶叫y,考虑先将L上的青蛙的一半借助于S2和y转移到S1上,当然是一半小号的青蛙在S1上,大的留

在L上。yLRS1S2第六讲递归及其实现C语言程序设计这样LS1S2yR系统分解为:(LS2yR系统)+(S1S2yR系统)=2*(LS2yR系统)=2*Jump(1,1)用归纳法Jump(S,y)=2*Jump(S-1,y)第六讲递归及其实现C语

言程序设计main(){ints,y,sum;//整型变量,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);}intJump(intr,intz){intk;if(r==0){k=z+1;}else{k=2*Jump(r-1,z);}return(k);}第六讲递归及其实现C语言程序设计指针是C语言中的一个重

要概念。掌握指针的用法,可使程序简洁、高效、灵活,但并不难学。为了了解什么是指针,先看一个小故事地下工作者阿金接到上级指令,要去寻找打开密电码的密钥,这是一个整数。几经周折,才探知如下线索,密钥藏在一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚,阿金潜入了小楼,房间很多,不

知该进哪一间,正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫不迟疑,抓起听筒,只听一个陌生人说:“去打开211房间,那里有线索”。阿金疾步上楼,打开211房间,用电筒一照,只见桌上赫然6个大字:地址1000。阿金眼睛一亮,

迅速找到1000房间,取出重要数据66,完成了任务。第七讲指针C语言程序设计2111000P说明:1、数据藏在一个内存地址单元中,地址是1000。2、地址1000又由P单元所指认,P单元的地址为211。3、66的直接地址是1000;66的间

接地址是211;211中存的是直接地址1000。4、称P为指针变量,1000是指针变量的值,实际上是有用数据藏在存储器中的地址。100066第七讲指针C语言程序设计指针变量——用来存放另一变量地址的变量变量的指针就是变量的地址。1、指针的概念指针是一种特殊的变量,特殊性

表现在类型和值上。从变量讲,指针也具有变量的三个要素:(1)变量名,这与一般变量取名相同,由英文字符开始。(2)指针变量的类型,是指针所指向的变量的类型,而不是自身的类型。(3)指针的值是某个变量的内存地址。第七讲指针C语言

程序设计从上面的概念可知,指针本身类型是int型,因为任何内存地址都是整型的。但是指针变量的类型却定义成它所指向的变量的类型。2、指针的定义(说明,先说明后引用)例如:int*p,*q;//定义p,q为指向整数类型变量的指针

float*point;//定义point为指向float型变量的指针double*pd;//定义pd为指向double型变量的指针int(*pa)[10];//定义pa为指向int型数组的指针int(

*pu)();//定义pu为指向int型函数的指针int**qq;//定义qq为指向int型指针的指针还有指向结构、联合的指针,后面再介绍第七讲指针C语言程序设计3、指针赋值例intakey;//定义一个整型变量akeyint*p,*q;//定义p,q为指向整型变量的指针变量ake

y=66;//将66赋给akeyp=&akey;//将变量akey的地址赋给p,这时见图1q=p;//将p的值赋给q,见图266&akeypakey&pp变量的地址&akeyakey变量的地址图1的说明:将akey变量的地址赋给指

针p,意味着让指针p指向akey图1第七讲指针C语言程序设计第七讲指针66&apapq图2的说明:当着执行q=p;之后,中所存的a变量的地址值,也就被放到变量中,意味着让指针q也指向a图2&aq&p&qq=p;C语言程序设计#include<stdio.

h>voidmain(){inta[5]={0,1,2,3,4};//定义数组,赋初值int*p1,*p2;//定义指针变量p1=&a[1];//赋值给指针变量,让p1指向a[1]p2=&a[2];//赋值给指针变量,让p2指向a[2]prin

tf("a[1]=%d;a[2]=%d\n",*p1,*p2);}第七讲指针C语言程序设计43210&a[0]&a[1]&a[2]&a[3]&a[4]&a[1]&a[2]&p1&p2p1p2p1和p2分别指向a[1],

a[2],这里&——取地址运算符*——指针运算符(间接访问运算符)*p1——间接访问p1所指向的内存单元,当然是输出a[1]的值*p2——间接访问p2所指向的内存单元,当然是输出a[2]的值第七讲指针C语言程序设计4、向指针所指向的内存单元赋值voi

dmain(){intakey,b;int*p,*q;akey=66;p=&akey;q=&b;*q=*p;printf(“b=%d\n”,b);printf(“*q=%d\n”,*q);}第七讲指针C语言程序设计66

66&akeyp&akey*q=*p&bq&b第七讲指针C语言程序设计5、指针与数组voidmain(){inta[5]={1,3,5,7,9};int*p;inti;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];a[5]a[4]a[3]a[2]a[1]*(p+3)*(p+4)*(p+2)*(p+1)*ppp+1p+2pp+1p+2等效第七讲指针C语言程序设计voidmain(){inta[5]={1,3,5,7,9};int*p;inti=0;for(p=a;

p<a+5;p=p+1){printf("a[%d]=%d\n",i,*p);i=i+1;}}第七讲指针C语言程序设计数组名是一个常量指针,指向该数组的首地址,例voidmain(){char*p;staticc

hars[]=“abcdefgh”;p=s;while(*p!=„\0‟){p=p+1;}printf(“字串长度为%d\n”,p-s);}第七讲指针C语言程序设计\0hgfedcbassp图中数组的首地址是s[0]的地址,即&s[0]。s

可看作是指向s[0]的指针。s是不会动的,是常量指针。第七讲指针C语言程序设计任务:我们要作一张登记表,登记排队求职信息,包括:姓名、年龄、性别、电话四个参数。希望便于管理,即可以插入和删除,这时可采用结构类型变量。structST{charname[20];

//字符串,姓名intage;//整数,年龄charsex;//字符,性别longnum;//电话号码};//注意,这里必须有分号structSTstudent1,student2;第八讲结构体C语言程序设计在定义一个结构体类型时,可以用另一个结构类型来定义其中

的成员,即可以嵌套定义。例:structdate{intmonth;intday;intyear;};structperson{charname[10];structdatebirthday;longcertificate;};第八讲结构体C语言程序设计结构体类型变量的引用引用方式:结构体变量.成

员名对成员变量可以像普通变量一样使用,进行各种运算。即:worker.name、worker.birthday、worker.certificate第八讲结构体C语言程序设计结构指针设一个指针变量,用

来指向一个结构体变量,此时该变量的值是结构体变量的起始地址。即:结构指针就是对已经定义的结构变量的一个起始地址例:main(){structstudent{longintnum;charname[20];charsex;floatscore;};第八讲结构体C语言程序设计st

ructstudentstu_1;structstudent*p;p=&stu_1;stu_1.num=10001;strcpy(stu_1.name,"LiLin");stu_1.sex='M';stu_1.score=92.5;printf("No.:%ld\nname:%s\nsex:

%c\nscore:%4.1f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%

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)结点的表述:以结构体变量描述:structstudent{intnum;intscore;structstudent*next;};第八讲结构体C语言程序设计第八讲结构体40

1102203154NULL头指针head数据指针首地址40首地址10首地址20首地址15如下所示为典型的单链表结构:C语言程序设计5head610null15128链表的建立例子:已有一个如图所示的链表。它是按结点中的整数域从小到大排序的。

现在要插入一个结点,该节点中的数为10。待插入结点p第八讲结构体C语言程序设计分析:考虑将结点p插入链表head中,分如下三种情况:1、第一种情况,链表还未建成(空链表),待插入结点p实际上是第一个结点。这时必然有head==null。只要让头指针指向p

就可以了。语句为head=p;p->next=null;2、第二种情况,链表已建成,待插入结点p的数据要比头结点的数据还要小,这时有p->num<head->num。当然p结点要插在head结点前。3、第三种情况,链表已建成,待插入结点p的数据比头结点的数据大,需要找到正确的插入位置

。这时,可以借助两个结构指针r和q,利用循环比较来找到正确位置。然后将结点p插入到链表中正确的位置。第八讲结构体C语言程序设计6head812null13p15qr说明:这种情况下,p结点已经与链表的第一个结点比较过了,所以从链表的下一个结点开始比较。13>8,继续比较。

第八讲结构体C语言程序设计说明:13>12,继续比较。6head812null13pnull15qr第八讲结构体C语言程序设计说明:13<15,找到了正确的插入位置,则插入结点p。语句为:r->next=p;p->next=q;6head81213

pnull15qr第八讲结构体C语言程序设计#include<stdio.h>//预编译命令#include<malloc.h>//内存空间分配#definenull0//定义空指针常量#defineLENsizeof(structn

umST)structnumST{intnum;structnumST*next;};第八讲结构体C语言程序设计//被调用函数insert(),两个形参分别表示链表和待插入的结点voidinsert(struc

tnumST**phead,structnumST*p){structnumST*q,*r;if((*phead)==null)//第一种情况,链表为空{*phead=p;//链表头指向preturn;//完成插入操作,返回}else//链表不为空{//第

二种情况,p结点num值小于链表头结点的num值if((*phead)->num>p->num){//将p结点插到链表头部p->next=*phead;//将p的next指针指向链表头(*phead)*phead=p;//将链表头赋值为preturn;//返回}第八讲结构体C语

言程序设计//第三种情况,循环查找正确位置r=*phead;//r赋值为链表头q=(*phead)->next;//q赋值为链表的下一个结点while(q!=null)//利用循环查找正确位置{//判断当前结点num是否小于p结点

的numif(q->num<p->num){r=q;//r赋值为q,即指向q所指的结点q=q->next;//q指向链表中相邻的下一个结点}else//找到了正确的位置break;//退出循环}//将p结点插入正确的位置r->next=p;p->nex

t=q;}}第八讲结构体C语言程序设计voidmain()//主函数开始{//函数体开始structnumST*head,*p;//ST型结构指针head=null;//分配两个ST结构的内存空间,用于构造链表head=(structnumST*)malloc(LEN);head->next=(s

tructnumST*)malloc(LEN);//为链表中的两个结点中的num赋值为5和10head->num=5;head->next->num=10;head->next->next=null;//链表

尾赋值为空//构造一个结点p,用于插入链表p=(structnumST*)malloc(LEN);p->num=8;p->next=null;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=(structwork*)malloc(structwork);开辟一

个能容纳结构变量work的空间,并把这个空间的首地址赋给结构指针new第八讲结构体

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?