C语言教程基础篇【全】课件_第1页
C语言教程基础篇【全】课件_第2页
C语言教程基础篇【全】课件_第3页
C语言教程基础篇【全】课件_第4页
C语言教程基础篇【全】课件_第5页
已阅读5页,还剩365页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、教学对象计算机科学与技术系新生(第二学期)二、教学目标程序设计的重要性程序设计的基本概念与基本方法编程解题的思路与典型方法数学模型简介算法及算法步骤程序结构与相应语句编码与上机调试绪论一、教学对象绪论

三、教学重点

1.程序设计的基本概念,基本方法;

2.在C语言的环境下,学会如何针对问题进行分析,得出数学模型,理出算法并编程实现;

3.有条有理有根有据的编程实践;

4.养成良好的编程风格与习惯;

5.重在思维方法的学习,鼓励创新。绪论三、教学重点绪论四、指导思想

1.立足改革,以培养高素质有创造精神的人才为这门课的教学目标。

2.以学生为中心,采用与现实生活贴切和具有趣味性的实例进行讲解,有利于调动学生学习的积极性,引导学生主动学习。

3.强化实践,这门课主张程序设计是高强度的脑力劳动,不是听会的、也不是看会的,而是练会的。引导学生在解题编程的实践中探索其中带规律性的认识。将感性认识升华到理性高度。绪论四、指导思想

1.立足改革,以培养高素质有创造精神的人才为五、学习方法

1.动手动脑,理论指导下的实践有条有理的实践。

2.在编写大量程序之后,才能感到运用自如。绪论五、学习方法绪论六、教学内容安排

1.简单C程序设计;

2.分支结构程序设计;

3.循环结构程序设计;

4.数组;

5.函数;

6.递归及其实现方法

7.指针;

8.结构体与链表。绪论六、教学内容安排绪论1.1认识C语言程序1.程序实例#include<stdio.h>//预编译命令,将标准输入输出函数

//作为头文件包扩到用户源文件中#include<math.h>//预编译命令,将系统提供的数学函数

//作为头文件包扩到用户源文件中main() //主函数,名为main,

{ //函数体.开始

floata,b,c; //声明部分.定义变量类型

b=30.0; //执行部分.赋值语句

a=sin(b*3.14159/180);//执行部分.赋值语句

printf(“%f\n”,a); //执行部分.输出语句

} //函数体.结束第一讲简单的C程序设计1.1认识C语言程序第一讲简单的C程序设计1.2实例总结

1.C程序结构预编译命令主函数main(){

函数体开始声明部分执行部分}函数体结束第一讲简单的C程序设计1.2实例总结预编译命令主函数main()第一讲简2.变量的类型整型:int长整型:long

浮点型:float

双精度型:double

字符型:char

用户自定义类型第一讲简单的C程序设计2.变量的类型第一讲简单的C程序设计

3.声明的作用为变量分配内存单元,变量名作为内存单元的符号地址,这件事是在程序编译链接时完成的。4.变量其值可以改变的量,是内存单元的符号地址。通过符号b可以找到相应的存储单元地址,假设为1000。语句

b=30.0;是将值30.0存放在地址为1000的存储单元。第一讲简单的C程序设计3.声明的作用第一讲简单的C程序设计5.对变量的赋值

赋值符号“=”<变量>=<表达式>

b=30.0; //读作将表达式的值30.0赋给变量ba=sin(b*3.14159/180); //读作将表达式(正弦函数)的值赋给变量a第一讲简单的C程序设计5.对变量的赋值第一讲简单的C程序设计6.变量赋值特点(1)先定义,后使用

intd,e,f; 定义三个变量为整数类型

如未定义,则在编译时被查出,认为非法(2)变量未被赋值前,值为未知(3)对变量赋值过程是“覆盖”过程,用新值去替换旧(4)读出变量的值,该变量保持不变(5)参与表达式运算的所有变量都保持原来的值不变第一讲简单的C程序设计6.变量赋值特点第一讲简单的C程序设计变量赋值过程

def未赋值前执行d=7执行e=d执行f=d+e执行d=d+1000-12349723431607234316077077148714第一讲简单的C程序设计变量赋值过程-123497234316072343160777.输出语句

printf函数(格式输出函数)一般形式为

printf(参数1,参数2,参数3,……,参数n)

其中参数1——格式控制 参数2,参数3,……,参数n——输出表列举例:floata;intb;a=85.56;b=100;printf("%f%d",a,b);第一讲简单的C程序设计7.输出语句第一讲简单的C程序设计格式控制是用双引号括起来的字符串,称“转换控制字符串”%f——第一个输出表列的格式说明,以小数形式输出单、双精度实数,隐含输出6位小数%d——第二个输出表列的格式说明,以带有符号的十进制形式输出整数(正数不输出符号)显然,%f是控制实数a的;%d是控制整数b的第一讲简单的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的最大整数pow(x,y)xysqrt(x)x1/2第一讲简单的C程序设计8.数学函数第一讲简单的C程序设计9.算术运算符

* 乘

/ 除

% 模(取余数)第一讲简单的C程序设计9.算术运算符 第一讲简单的C程序设计1.3作业第一讲简单的C程序设计1.3作业第一讲简单的C程序设计

我们在日常生活中经常需要处理具有两个分支的问题,例如,如果明天下雨,则在教室内组织活动,否则去野游。在C语言中,这类问题需要使用if语句解决,而判断操作通常使用关系运算符。关系运算符和关系表达式

> 大于

< 小于

>= 大于等于

<=小于等于

== 等于

!= 不等于第二讲分支结构我们在日常生活中经常需要处理具有两个分支的问题,例第二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)”形式。

第二讲分支结构2.1掌握if语句的使用方法第二讲分支结构本实例的流程图如图所示

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

显示“Great!”

显示“Wrong!”

显示“Sorry!”

第二讲分支结构本实例的N-S流程图如图所示输入a的值a==6显示“Righ2.程序代码:#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语句结束*/}第二讲分支结构2.程序代码:第二讲分支结构3.运行结果:第1次运行结果:

Inputa:6<回车>a=6Right!

Great!第2次运行结果:

Inputa:5<回车>a=5Wrong!

Sorry!第二讲分支结构3.运行结果:第二讲分支结构4.归纳分析:

(1)程序中的“a==6”是关系表达式。用关系运算符把两个C语言表达式连接起来的表达式称为关系表达式。关系运算的判断结果只有“真”或“假”两种可能,关系成立时为“真”,不成立时为“假”。关系表达式的值只能是1或0,当关系运算的判断结果为“真”时,关系表达式的值为1,否则,关系表达式的值为0。例如,当a的值为6时,关系表达式“a==6”的值为1,当a的值为5时,关系表达式“a==6”的值为0。第二讲分支结构4.归纳分析:第二讲分支结构(2)程序中的“if(a==6)”是if语句的开始部分。本例题需要根据“a==6”是否为“真”来选择执行不同的两个输出语句。处理两个分支的问题时常使用if语句。if语句根据其后面括号中表达式的结果,选择执行某个分支程序段。

if语句的一般形式如下:

if(表达式){ 语句组1 }else{ 语句组2 }

“if”和“else”是关键字。当表达式结果为“真”(即不等于0)时,执行语句组1,表达式结果为“假”(即等于0)时,执行语句组2。在语句组1和语句组2中只能选择执行一组,而后执行整个if语句后面的语句。第二讲分支结构(2)程序中的“if(a==6)”是if语句的开始部分。第二(3)C语言中允许程序中的if语句不带else部分。省略else的if语句一般形式如下:

if(表达式){语句组}

此if语句的执行过程:当表达式结果为“真”时,执行语句组,表达式结果为“假”时,不处理。第二讲分支结构(3)C语言中允许程序中的if语句不带else部分。第二讲2.2学会使用逻辑运算符

处理问题时经常需要同时判断多个条件。例如,在某学生数学和英语成绩中判断是否至少有一门课程是不及格。这时使用逻辑运算符。逻辑运算符共有三种:

&&逻辑与

||逻辑或

!逻辑非这3个运算符按高到低的优先级顺序是“!”、“&&”、“||”

一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。第二讲分支结构2.2学会使用逻辑运算符第二讲分支结构【实例】编写程序,判断某人的体重是否在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”第二讲分支结构【实例】编写程序,判断某人的体重是否在50公斤至55公斤之间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");

else

printf("No\n");

}第二讲分支结构2.程序代码:

第二讲分支结构3.运行结果:第1次运行结果:Inputw:53.5<回车>w=53.5Ok第2次运行结果:Inputw:60.7<回车>w=60.7No第二讲分支结构3.运行结果:第二讲分支结构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。第二讲分支结构4.归纳分析:第二讲分支结构2.3学会使用嵌套的if语句有些问题必须在满足某种条件后,再继续分支处理。例如,某单位男职工60岁退休,女职工55岁退休,为了判断某职工是否应退休,首先要判断该职工是男职工还是女职工,然后再根据职工性别判断年龄是否到规定年龄。这时需要使用嵌套的if语句。第二讲分支结构2.3学会使用嵌套的if语句第二讲分支结构【实例】编写程序,判断若输入的体重大于0且小于200,再判断该体重是否在50公斤至55公斤之间,若在此范围之内,显示“Ok”,否则显示“No”;若所输入的体重不大于0或不小于200,则显示“Dataover!”。

1.编程思路:在上实例中,输入w的值后立刻用if语句实现选择执行“printf(“Ok\n");”或“printf("No\n");”的功能,但由于本题目是在w的值大于0且小于200的情况下,才能执行此if语句,所以在此if语句外面还需要套另一个if语句。第二讲分支结构【实例】编写程序,判断若输入的体重大于0且小于200,再判断本实例的程序流程图:课堂作业:请根据此图画出其N-S流程图。开始输入w值w>0且w<200显示“Ok”显示“Dataover!”结束假真w≥50且w≤55真假显示“No”第二讲分支结构本实例的程序流程图:开始输入w值w>0且w<200显示“Ok2.程序代码: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");

else

printf("No\n");/*内嵌if语句结束*/

else

printf("Dataover!\n");/*外嵌if语句结束*/}第二讲分支结构2.程序代码:第二讲分支结构3.运行结果:第1次运行结果:Inputw:53.5<回车>w=53.5Ok第2次运行结果:Inputw:60.7<回车>w=60.7No第3次运行结果:Inputw:201.7<回车>w=201.7Dataover!第二讲分支结构3.运行结果:第二讲分支结构4.归纳分析:(1)本程序在一个if语句中包含了另一个if语句。在if语句的语句组1或语句组2中又包含另一个分支结构的if语句称为嵌套的if语句。(2)本程序中出现了两次else。

C语法规定,在if语句中,若多次出现else,则每一个else总是与前面最近的if配对,所以本例题中第一个else与内嵌的if配对,第二个else与最上面的if配对。程序中由于采用了缩进格式,if与else的配对关系一目了然。第二讲分支结构4.归纳分析:第二讲分支结构2.4学会使用if-elseif形式的嵌套if语句【实例】编写程序,求下面分段函数的值,要求x的值从键盘输入。

x+2(0≤x<5)y=0(x<0)x2-3(5≤x<10)10(x≥10)第二讲分支结构2.4学会使用if-elseif形式的嵌套if语句x+21.编程思路:

开始输入x值x<0结束假真真假显示x和y的值x<5真假x<10y=x+2y=10y=x2-3y=0第二讲分支结构1.编程思路:开始输入x值x<0结束假真真假显示x和y的值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);}第二讲分支结构2.程序代码:第二讲分支结构2.5switch语句在日常生活中经常遇到菜单选择操作,例如,用ATM自动取款机取钱时,从菜单中可以选择语种、取款额;用自动服务系统给手机充值时,可以选择查余额还是充值,对本机充值还是对其他号码充值等。这些问题一般使用switch语句解决。

总之,这些问题都是多分支情况。第二讲分支结构2.5switch语句第二讲分支结构【实例】编写程序,在如下菜单中选择一个运算类型,并进行相应的运算。如选择了加法,则进行求和运算。Pleasechoose+:addition-:subtraction*:multiplication/:division第二讲分支结构【实例】编写程序,在如下菜单中选择一个运算类型,并进行相应的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); /*显示算式*/

第二讲分支结构1.程序代码:第二讲分支结构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); /*显示结果*/}第二讲分支结构switch(sym) /*计算算式*/第二讲分2.运行结果:Pleasechoose+:addition-:subtraction*:multiplication/:division/<回车>

5.000000/2.000000=2.500000

第二讲分支结构2.运行结果:第二讲分支结构3.归纳分析:switch语句的一般形式为:switch(表达式){ case表达式1:语句组1break; case表达式2:语句组2break;…

case表达式n:语句组nbreak;default:语句组n+1break;}其中switch、case、default和break是关键字,所有表达式均为整型或字符型。在表达式1、表达式2、…、表达式n中只能出现常量和运算符,而且每个表达式的值不能相等。第二讲分支结构3.归纳分析:第二讲分支结构2.6条件运算符及其表达式C语言中条件运算符由“?”和“:”组成,例如“a>b?a:b”。条件表达式的一般形式为:表达式1?表达式2:表达式3当表达式1的值为非0时,以表达式2的值作为条件表达式的值,否则,以表达式3的值作为条件表达式的值。例如,当a>b成立时,条件表达式“a>b?a:b”的值为a中的值,否则为b中的值。使用条件表达式也可以实现分支结构。

第二讲分支结构2.6条件运算符及其表达式第二讲分支结构课堂讨论:谁做的好事?

忻州师院有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。A说:不是我。B说:是C。C说:是D。D说:C胡说。已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。画出N-S流程图并写出程序。第二讲分支结构课堂讨论:谁做的好事?第二讲分支结构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)第二讲分支结构1、编程思路:第二讲分支结构再试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)第二讲分支结构再试B同学,让thisman=‘B’; 代入到四句话中第二讲再试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同学,让thisman=‘C’; 代入到四句话中第二讲

循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了三种循环语句,可以组成各种不同形式的循环结构,它们是:

while语句do-while语句for语句

第三讲循环结构循环结构是程序中一种很重要的结构。其特点是,在3.1简单循环【实例】古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....

该数列的规律为

a1=1a2=1

an=an-1+an-2

这里求前20项第三讲循环结构3.1简单循环第三讲循环结构i<=20a1=1;a2=1;i=3an=a1+a2输出ani=i+1;a1=a2;a2=an;YendbeginN第三讲循环结构i<=20a1=1;a2=1;i=3an=a1+a2输出a该题目的N-S流程图a1=1;a2=1;an=0;i<=20an=a1+a2输出ani=i+1a1=a2a2=an第三讲循环结构该题目的N-S流程图a1=1;a2=1;an=0;i<=202.程序源代码:方法一: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;

}

}可否调换?第三讲循环结构2.程序源代码:可否调换?第三讲循环结构方法二:while循环语句

#include"stdio.h"

main()

{

longa1,a2,an;

inti;

a1=a2=1;i=3;

while(i<=20)

{

an=a1+a2;printf(“a%d=%ld”,i,an);

a1=a2;

a2=an;i++;

}

}第三讲循环结构方法二:while循环语句

#include"stdio.方法三: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);

}第三讲循环结构方法三:do-while循环语句

#include"std3.归纳分析(1)for语句格式:

for(表达式1;表达式2;表达式3){语句}

即:

for(循环变量赋初值,循环结束条件,循环变量增值){语句}第三讲循环结构3.归纳分析第三讲循环结构For语句执行过程表达式1表达式2表达式3语

YN第三讲循环结构For语句执行过程表达式1表达式2表达式3语句Y表达式可以省略,但分号不能省略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++;}第三讲循环结构表达式可以省略,但分号不能省略第三讲循环结构表达式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第三讲循环结构表达式1,表达式3可以是:第三讲循环结构(2)while语句的一般形式为:

while(表达式){语句;}

其中表达式是循环条件,语句为循环体。

while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。第三讲循环结构(2)while语句的一般形式为:第三讲循环结构使用while语句应注意以下几点:1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。2.循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。3.应注意循环条件的选择以避免死循环,一般需要在循环体中动态改变循环条件的值。第三讲循环结构使用while语句应注意以下几点:第三讲循环结构(3)do-while语句的一般形式为:

do

语句;

while(表达式);

其中语句是循环体,表达式是循环条件。

do-while语句的语义是:

先执行循环体语句一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。

do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。第三讲循环结构(3)do-while语句的一般形式为:

do

语句;(4)循环体语句可使用break

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

intn;

for(n=7;n<=100;n++)

{

if(n%7!=0)

continue;

printf("%d",n);

}

第三讲循环结构(4)循环体语句可使用break和continue语句第三练习: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.从键盘输入一个数判断其是否为素数。第三讲循环结构练习:第三讲循环结构作业:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?求1+2!+3!+...+20!的和猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?第三讲循环结构作业:第三讲循环结构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的组合第三讲循环结构3.2循环的嵌套使用第三讲循环结构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第三讲循环结构N-S流程图m<9w<12c=36-m-w且c%2==04*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);}}第三讲循环结构2.程序第三讲循环结构练习:1.输出9*9口诀。2.判断101-200之间有多少个素数,并输出所有素数。3.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。第三讲循环结构练习:第三讲循环结构作业: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以内的所有完数。

第三讲循环结构作业:第三讲循环结构课堂讨论:五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。 A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。第三讲循环结构课堂讨论:第三讲循环结构思路: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;第三讲循环结构思路:1首先是将五个人的预测写成逻辑表达式:

让关系运算符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第三讲循环结构2考虑到每个人说的话是一对一错,即一真一假,比如A说的,若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第三讲循环结构3.仍然可以用枚举的方法,让变量A、B、C、D、E在1~5中第三讲循环结构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输出ABCDETrueTrueFalseFalse第三讲循环结构For(A=1;A<=5;A++)For(B作业:

某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:

1)A、B至少有一人作案;

2)A、D不可能是同案犯;

3)A、E、F三人中至少有两人参与作案;

4)B、C或同时作案,或与本案无关;

5)C、D中有且仅有一人作案;

6)如果D没有参与作案,则E也不可能参与作案。试编一程序,将作案人找出来。第三讲循环结构作业:第三讲循环结构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)第三讲循环结构1案情分析:将案情的每一条写成逻辑表达式,第一条用CC1表CC2:A和D不可能是同案犯可以分析为:A如果是案犯,D一定不是案犯,写成A&&(!D)D如果是案犯,A一定不是案犯,写成D&&(!A)这两者之间是或的关系,因此有CC2=!(A&&D)

A D A&&D CC2 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1第三讲循环结构CC2:A和D不可能是同案犯第三讲循环结构CC3:A、E、F中有两人涉嫌作案,分析有三种可能第一种,A和E作案,(A&&E)第二种,A和F作案,(A&&F)第三种,E和F作案,(E&&F)这三种可能性是或的关系,因此有CC3=(A&&E)||(A&&F)||(E&&F)第三讲循环结构CC3:A、E、F中有两人涉嫌作案,分析有三种可能第三讲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第三讲循环结构CC4:B和C或同时作案,或都与本案无关第三讲循环结构2采取枚举方法,枚举什么呢?枚举组合。6个人每个人都有作案或不作案两种可能,因此有26种组合,从这些组合中挑出符合6条分析的作案者。定义6个整数变量,分别表示6个人A,B,C,D,E,F。枚举每个人的可能性:让0表示不是罪犯;让1表示就是罪犯。第三讲循环结构2采取枚举方法,枚举什么呢?第三讲循环结构第三讲循环结构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的第三讲循环结构for(A=0;A<=1;A++)for(B问题:哪只羊最重?中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊宴请宾客,当然要选最重者。这样就要记录每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的数组。第四讲数组问题:哪只羊最重?第四讲数组1.程序分析:max=0.0将记录最重的羊的重量for(i=0;i<10;i++)提示输入第i只羊的重量输入第i只羊的重量sheep[i]max<sheep[i]YesNomax=sheep[i]k=i输出max和k的值第四讲数组1.程序分析:max=0.0将记录最重的羊的重量for(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=sheep[i]; //让第i只羊为当前最肥羊

k=i;} } printf(“max=%f\nnumber=%d\n”,max,k);}第四讲数组2.程序第四讲数组3.归纳分析(1)数组的定义 类型说明符 数组名[常量表达式]例: floatsheep[10]; inta2001[1000];说明①数组名的第一个字符应为英文字母;②用方括号将常量表达式括起;③常量表达式定义了数组元素的个数;第四讲数组3.归纳分析第四讲数组④数组下标从0开始。如果定义5个元素,是从第0个元素至第4个元素; 例如 inta[5]定义了5个数组元素如下: a[0],a[1],a[2],a[3],a[4] 这是5个带下标的变量,这5个变量的类型是相同的⑤常量表达式中不允许包含变量; 例如 intn; n=5; inta[n]; 不合法!第四讲数组④数组下标从0开始。如果定义5个元素,是从第0个元素至第4个(2)数组初始化 是定义数组完成赋初值的任务 例如 inta[5]={3,5,4,1,2};a

a[0]=3;a[1]=5;a[2]=4;a[3]=1;a[4]=2;35412下标01234第四讲数组(2)数组初始化 35(3)数组在内存中分配一段连续的存储空间内存地址变量名FF02FF01FF00FF03FF04FF05FF06FF07a[0]a[1]a[2]a[3]00000000000000110000000000000101000000000000010000000000000000010000000000000010FF08FF09a[4]a数组名第四讲数组(3)数组在内存中分配一段连续的存储空间内存地址变量名FF0思考: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};第四讲数组思考:第四讲数组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};第四讲数组3.其他不变,改变声明项为 第四讲数组第四讲数组【实例】将几个数从大到小排序并输出,冒泡排序法

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,调换8342912到达位置834921第四讲数组i=1i=2i=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第四讲数组i=1i=2i=3从表中可以看出最小的一个数第一遍扫描就交换到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。

第四讲数组从表中可以看出最小的一个数第一遍扫描就交换到a[6]第四讲再看在每遍扫描中,相邻两数组元素的比较次数。当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第四讲数组再看在每遍扫描中,相邻两数组元素的比较次数。第四讲数组为了表述方便,定义以下3个变量:n——

待排序的数的个数,这里n=6j——

扫描遍数,j=1,2,…,n-1i——

第j遍扫描待比较元素的下标,i=1,2,…,n-j第四讲数组为了表述方便,定义以下3个变量:第四讲数组采用两重计数型循环:步骤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: 输出排序结果第四讲数组采用两重计数型循环:第四讲数组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]); }第四讲数组2.程序第四讲数组作业:船长与水手的问题:有载有50个人的大船,突然触礁,船底撞了一个大窟窿,水不停地涌进船里,船不断下沉。这时,聪明的船长把所有人召集到一起,给每人一个编号,手拉手围成一圈,从1号开始报数,报的数为9时,这个人出列,跳入大海,剩下的人继续围成一圈,后面的人从1开始继续报数,重复上面地步骤,聪明的船长却最后留在了船上。问:船长是几号才能最后一个跳入大海?第四讲数组作业:第四讲数组讨论问题:使用筛法求100以内的所有素数思路1.想象将100个数看作沙子和小石头子,让小石头子当作素数;让沙子当作非素数。弄一个筛子,只要将沙子筛走,剩下的就是素数了。2.非素数一定是2、3、4……

的倍数。3.使用数组,让下标就是100以内的数,让数组元素的值作为筛去与否的标志。比如筛去以后让元素值为1。第四讲数组讨论问题:使用筛法求100以内的所有素数第四讲数组1至100这些自然数可以分为三类:单位数:仅有一个数1。素数:是这样一个数,它大于1,且只有1和它自身这样两个正因数。合数:除了1和自身以外,还有其他正因数。1不是素数,除1以外的自然数,当然只有素数与合数。筛法实际上是筛去合数,留下素数。 为了提高筛选法效率,注意到: 令n为合数(这里是100),c为n的最小正因数,则据初等数论

只要找到c就可以确认n为合数,将其筛去。第四讲数组1至100这些自然数可以分为三类:第四讲数组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输出iYesYesNoNo第四讲数组for(i=2;i<=100:i++)prim[i]=0;f二维数组问题:求矩阵a的最大值

135a=792468第四讲数组二维数组第四讲数组1.二维数组定义格式:类型说明符数组名[常量表达式][常量表达式]

例:inta[2][3]={{3,5},{4,1},{2,6}};说明:

a)每一维的下标从0开始,整个数组元素为:2×3=6个

b)C语言中,二维数组中元素排列的顺序是按行存放。即:先存放第一行的元素,再存放第二行的元素第四讲数组1.二维数组定义第四讲数组二维数组在内存中的分配情况内存地址变量名FF02FF01FF00FF03FF04FF05FF06FF07a[0][0]a[0][1]a[1][0]a[1][1]00000000000000110000000000000101000000000000010000000000000000010000000000000010FF08FF09a[2][0]a数组名……第四讲数组二维数组在内存中的分配情况内存地址变量名FF02FF01FFc)可以计算数组元素在数组中的序号假设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(第九个)第四讲数组第四

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论