nullnull一、教学对象
计算机科学与技术系新生(第二学期)
二、教学目标
程序设计的重要性
程序设计的基本概念与基本方法
编程解题的思路与典型方法
数学模型简介
算法及算法步骤
程序结构与相应语句
编码与上机调试
绪论null 三、教学重点
1. 程序设计的基本概念,基本方法;
2.在 C语言的环境下,学会如何针对问题进行分析,得出数学模型,理出算法并编程实现;
3.有条有理有根有据的编程实践;
4.养成良好的编程风格与习惯;
5.重在思维方法的学习,鼓励创新。
绪论null四、指导思想 1. 立足改革,以培养高素质有创造精神的人才为这门课的教学目标。 2. 以学生为中心,采用与现实生活贴切和具有趣味性的实例进行讲解,有利于调动学生学习的积极性,引导学生主动学习。
3. 强化实践,这门课主张程序设计是高强度的脑力劳动,不是听会的、也不是看会的,而是练会的。引导学生在解题编程的实践中探索其中带规律性的认识。将感性认识升华到理性高度。
绪论null五、学习方法
1.动手动脑,理论指导下的实践 有条有理的实践。
2.在编写大量程序之后,才能感到运用自如。绪论null六、教学内容安排
1. 简单C程序设计;
2. 分支结构程序设计;
3. 循环结构程序设计;
4. 数组;
5. 函数;
6. 递归及其实现方法
7. 指针;
8. 结构体与链表。绪论null1.1 认识C语言程序
1.程序实例
#include
//预编译命令,将标准输入输出函数
//作为头文件包扩到用户源文件中
#include //预编译命令,将系统提供的数学函数
//作为头文件包扩到用户源文件中 main( ) //主函数,名为main,
{ //函数体.开始
float a,b,c; //声明部分.定义变量类型
b=30.0; //执行部分.赋值语句
a=sin(b*3.14159/180); //执行部分.赋值语句
printf(“%f\n”,a); //执行部分.输出语句
} //函数体.结束第一讲 简单的C程序设计null1.2 实例总结
1.C程序结构
预编译命令主函数 main( )
{
函数体开始
声明部分
执行部分
} 函数体结束第一讲 简单的C程序设计null2.变量的类型
整型:int 长整型:long
浮点型:float
双精度型:double
字符型:char
用户自定义类型
第一讲 简单的C程序设计 3.声明的作用
为变量分配内存单元,变量名作为内存单元的符号地址,这件事是在程序编译链接时完成的。
4. 变量
其值可以改变的量,是内存单元的符号地址。
通过符号b可以找到相应的存储单元地址,假设为1000。
语句
b=30.0;
是将值30.0存放在地址为1000的存储单元。第一讲 简单的C程序设计null5.对变量的赋值
赋值符号“=”
<变量>=<表达式>
b = 30.0; // 读作将表达式的值30.0赋给变量b
a=sin(b*3.14159/180);
// 读作将表达式(正弦函数)的值赋给变量a 第一讲 简单的C程序设计null6.变量赋值特点
(1)先定义,后使用
int d,e,f; 定义三个变量为整数类型
如未定义,则在编译时被查出,认为非法
(2)变量未被赋值前,值为未知
(3)对变量赋值过程是“覆盖”过程,用新值去替换旧
(4)读出变量的值,该变量保持不变
(5)参与表达式运算的所有变量都保持原来的值不变第一讲 简单的C程序设计null变量赋值过程
d e f
未赋值前
执行d=7
执行 e=d
执行 f=d+e
执行 d=d+1 000第一讲 简单的C程序设计null7. 输出语句
printf函数(
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
输出函数)
一般形式为
printf(参数1,参数2,参数3,……,参数n)
其中参数1——格式控制
参数2,参数3,……,参数n——输出表列
举例: float a;
int b;
a = 85.56;
b = 100;
printf("%f %d", a, b);第一讲 简单的C程序设计null格式控制是用双引号括起来的字符串,称“转换控制字符串”
%f —— 第一个输出表列的格式说明,以小数形式输出单、双精度实数,隐含输出6位小数
%d —— 第二个输出表列的格式说明,以带有符号的十进制形式输出整数(正数不输出符号)
显然,%f是控制实数a的;%d是控制整数b的第一讲 简单的C程序设计null为了醒目,格式控制项中除格式说明之外可以有
普通字符
例: 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程序设计null8. 数学函数
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程序设计null9. 算术运算符
+ 加
- 减
* 乘
/ 除
% 模(取余数)第一讲 简单的C程序设计null1.3 作业第一讲 简单的C程序设计null 我们在日常生活中经常需要处理具有两个分支的问题,例
如,如果明天下雨,则在教室内组织活动,否则去野游。
在C语言中,这类问题需要使用if语句解决,而判断操
作通常使用关系运算符。
关系运算符和关系表达式
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于第二讲 分支结构null2.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)”形式。 第二讲 分支结构null本实例的流程图如图所示 第二讲 分支结构null本实例的N-S流程图如图所示
第二讲 分支结构null2.程序代码:
#include
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语句结束 */
}第二讲 分支结构null3.运行结果:
第1次运行结果:
Input a:6<回车>
a=6
Right!
Great!
第2次运行结果:
Input a:5<回车>
a=5
Wrong!
Sorry!第二讲 分支结构null4.归纳分析:
(1)程序中的“a==6”是关系表达式。
用关系运算符把两个C语言表达式连接起来的表达式称为关系表达式。关系运算的判断结果只有“真”或“假”两种可能,关系成立时为“真”,不成立时为“假”。
关系表达式的值只能是1或0,当关系运算的判断结果为“真”时,关系表达式的值为 1,否则,关系表达式的值为0。例如,当a的值为6时,关系表达式“a==6”的值为1,当a的值为5时,关系表达式“a==6”的值为0。
第二讲 分支结构null(2)程序中的“if(a==6)”是if语句的开始部分。
本例题需要根据“a==6”是否为“真”来选择执行不同的两个输出语句。处理两个分支的问题时常使用if语句。if语句根据其后面括号中表达式的结果,选择执行某个分支程序段。
if语句的一般形式如下:
if(表达式)
{ 语句组1 }
else
{ 语句组2 }
“if”和“else”是关键字。当表达式结果为“真”(即不等于0)时,执行语句组1,表达式结果为“假”(即等于0)时,执行语句组2。在语句组1和语句组2中只能选择执行一组,而后执行整个if语句后面的语句。 第二讲 分支结构null(3) C语言中允许程序中的if语句不带else部分。
省略else的if语句一般形式如下:
if(表达式)
{语句组}
此if语句的执行过程:
当表达式结果为“真”时,执行语句组,表达式结果为“假”时,不处理。 第二讲 分支结构null2.2学会使用逻辑运算符
处理问题时经常需要同时判断多个条件。例如,在某学生数学和英语成绩中判断是否至少有一门课程是不及格。这时使用逻辑运算符。
逻辑运算符共有三种:
&& 逻辑与
|| 逻辑或
! 逻辑非
这3个运算符按高到低的优先级顺序是“!”、“&&”、“||”
一般而言,单目运算符优先级较高,赋值运算符优先级低。
算术运算符优先级较高,关系和逻辑运算符优先级较低。
第二讲 分支结构null【实例】编写程序,判断某人的体重是否在50公斤至55公斤之间,若在此范围之内,显示“Ok”,否则显示“No”。
1.编程思路:
先将体重存放在变量w中,要使w的值在50至55范围内,应同时满足“w>=50”和“w<=55”。在C语言中用“w>=50 && w<=55”表示w的值是否同时满足“w>=50”和“w<=55”。 第二讲 分支结构null2.程序代码:
#include
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");
}第二讲 分支结构null3.运行结果:
第1次运行结果:
Input w:53.5<回车>
w=53.5
Ok
第2次运行结果:
Input w:60.7<回车>
w=60.7
No
第二讲 分支结构null4.归纳分析:
程序中的“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。
第二讲 分支结构null2.3 学会使用嵌套的if语句
有些问题必须在满足某种条件后,再继续分支处理。例如,某单位男职工60岁退休,女职工55岁退休,为了判断某职工是否应退休,首先要判断该职工是男职工还是女职工,然后再根据职工性别判断年龄是否到规定年龄。这时需要使用嵌套的if语句。 第二讲 分支结构null【实例】编写程序,判断若输入的体重大于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语句。第二讲 分支结构null本实例的程序流程图:
课堂作业:请根据此图画出其N-S流程图。第二讲 分支结构null2.程序代码:
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语句结束 */
}第二讲 分支结构null3.运行结果:
第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!第二讲 分支结构null4.归纳分析:
(1)本程序在一个if语句中包含了另一个if语句。
在if语句的语句组1或语句组2中又包含另一个分支结构的if语句称为嵌套的if语句。
(2)本程序中出现了两次else。
C语法规定,在if语句中,若多次出现else,则每一个else总是与前面最近的if配对,所以本例题中第一个else与内嵌的if配对,第二个else与最上面的if配对。程序中由于采用了缩进格式,if与else的配对关系一目了然。 第二讲 分支结构null2.4学会使用if-else if形式的嵌套if语句
【实例】编写程序,求下面分段函数的值,要求x的值从键盘输入。
第二讲 分支结构null1.编程思路: 第二讲 分支结构null2.程序代码:
#include
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);
}第二讲 分支结构null2.5 switch语句
在日常生活中经常遇到菜单选择操作,例如,用ATM自动取款机取钱时,从菜单中可以选择语种、取款额;用自动服务系统给手机充值时,可以选择查余额还是充值,对本机充值还是对其他号码充值等。这些问题一般使用switch语句解决。
总之,这些问题都是多分支情况。第二讲 分支结构null【实例】编写程序,在如下菜单中选择一个运算类型,并进行相应的运算。如选择了加法,则进行求和运算。
Please choose
+ : addition
- : subtraction
* : multiplication
/ : division
第二讲 分支结构null1.程序代码:
#include
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); /* 显示算式 */
第二讲 分支结构nullswitch(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); /* 显示结果 */
}
第二讲 分支结构null2.运行结果:
Please choose
+ : addition
- : subtraction
* : multiplication
/ : division
/<回车>
5.000000/2.000000=2.500000 第二讲 分支结构null3.归纳分析:
switch语句的一般形式为:
switch(表达式)
{ case 表达式1: 语句组1 break;
case 表达式2: 语句组2 break;
… …
case 表达式n: 语句组n break;
default: 语句组n+1 break;
}
其中switch、case、default和break是关键字,所有表达式均为整型或字符型。在表达式1、表达式2、…、表达式n中只能出现常量和运算符,而且每个表达式的值不能相等。 第二讲 分支结构null2.6 条件运算符及其表达式
C语言中条件运算符由“?”和“:”组成,例如“a>b ? a : b”。
条件表达式的一般形式为:
表达式1 ?表达式2 :表达式3
当表达式1的值为非0时,以表达式2的值作为条件表达式的值,否则,以表达式3的值作为条件表达式的值。例如,当a>b成立时,条件表达式“a>b ? a : b”的值为a中的值,否则为b中的值。
使用条件表达式也可以实现分支结构。 第二讲 分支结构null课堂讨论:谁做的好事?
忻州师院有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:C胡说。 已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。画出N-S流程图并写出程序。第二讲 分支结构null1、编程思路:
如何找到该人,一定是“先假设该人是做好事者,然后到每句话中去测试看有几句是真话”。“有三句是真话就确定是该人,否则换下一人再试”。
比如,先假定是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)第二讲 分支结构null再试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)第二讲 分支结构null再试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)
这时,我可以理出头绪,要用所谓枚举法,一个人一个人地去试,
四句话中有三句为真,该人即所求。第二讲 分支结构null 循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 C语言提供了三种循环语句,可以组成各种不同形式的循环结构,它们是:
while语句
do-while语句
for语句
第三讲 循环结构null3.1 简单循环
【实例】古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 该数列的规律为
a1=1
a2=1
an=an-1+an-2
这里求前20项第三讲 循环结构nulli<=20a1=1;a2=1; i=3an=a1+a2输出ani=i+1;a1=a2;a2=an;YendbeginN第三讲 循环结构null该题目的N-S流程图
a1=1;a2=1;an=0;i<=20an=a1+a2输出ani=i+1a1=a2a2=an第三讲 循环结构null2.程序源代码:
方法一:for循环语句 #include "stdio.h" main( ) { long a1,a2,an; int i; a1=a2=1; for(i=3;i<=20;i++) { an=a1+a2;
printf(“a%d=%ld”,i,an); a1=a2; a2=an; } }可否调换?第三讲 循环结构null方法二:while循环语句 #include "stdio.h" main( ) { long a1,a2,an; int i; a1=a2=1;i=3;
while(i<=20) { an=a1+a2;
printf(“a%d=%ld”,i,an); a1=a2; a2=an;
i++; } }第三讲 循环结构null方法三:do-while循环语句 #include "stdio.h" main( ) { long a1,a2,an; int i; a1=a2=1;i=3;
do { an=a1+a2;
printf(“a%d=%ld”,i,an); a1=a2; a2=an;
i++; } while(i<=20);
}
第三讲 循环结构null3.归纳分析
(1)for语句格式:
for ( 表达式1 ; 表达式2 ; 表达式3 )
{语句}
即:
for (循环变量赋初值 , 循环结束条件 , 循环变量增值 )
{语句}
第三讲 循环结构nullFor语句执行过程
第三讲 循环结构null表达式可以省略,但分号不能省略
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++; }第三讲 循环结构null表达式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
第三讲 循环结构null(2) while语句的一般形式为:
while(表达式)
{语句;}
其中表达式是循环条件,语句为循环体。 while语句的语义是:
计算表达式的值,当值为真(非0)时,执行循环体语句。
第三讲 循环结构null使用while语句应注意以下几点:
1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。
2.循环体如包括有一个以上的语句,则必须用{}括起来, 组成复合语句。
3.应注意循环条件的选择以避免死循环,一般需要在循环体中动态改变循环条件的值。
第三讲 循环结构null(3) do-while语句的一般形式为: do 语句; while(表达式); 其中语句是循环体,表达式是循环条件。 do-while语句的语义是: 先执行循环体语句一次, 再判别表达式的值,若为真(非0)则继续循环,否则终止循环。 do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。第三讲 循环结构null(4)循环体语句可使用break 和continue语句
break:可以用来从循环体内跳出循环体(提前结束循环)
continue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断
例:输出100以内能被7整除的数。 int n; for(n=7;n<=100;n++) { if (n%7!=0) continue; printf("%d ",n); } 第三讲 循环结构null练习:
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.从键盘输入一个数判断其是否为素数。
第三讲 循环结构null作业:
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
求1+2!+3!+...+20!的和
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?第三讲 循环结构null3.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的组合第三讲 循环结构nullN-S流程图
第三讲 循环结构null2.程序
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)continue;
if(4*m+3*w+c/2==36)
printf(“m=%d,w=%d,c=%d”,m,w,c);
}
}第三讲 循环结构null练习:
1.输出9*9口诀。
2.判断101-200之间有多少个素数,并输出所有素数。
3.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。第三讲 循环结构null作业:
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以内的所有完数。
第三讲 循环结构null课堂讨论:
五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
决赛成绩公布之后,每位选手的预测都只说对了一半,
即一对一错,请编程解出比赛的实际名次。第三讲 循环结构null思路: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;第三讲 循环结构null2 考虑到每个人说的话是一对一错,即一真一假,比如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第三讲 循环结构null3.仍然可以用枚举的方法,让变量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第三讲 循环结构null第三讲 循环结构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输出ABCDETrueTrueFalseFalsenull作业:
某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:
1)A、B至少有一人作案;
2)A、D不可能是同案犯;
3)A、E、F三人中至少有两人参与作案;
4)B、C或同时作案,或与本案无关;
5)C、D中有且仅有一人作案;
6)如果D没有参与作案,则E也不可能参与作案。
试编一程序,将作案人找出来。
第三讲 循环结构null1 案情分析:将案情的每一条写成逻辑表达式,第一条用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)第三讲 循环结构nullCC2: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第三讲 循环结构nullCC3:A、E、F中有两人涉嫌作案,分析有三种可能
第一种,A和E作案,(A&&E)
第二种,A和F作案,(A&&F)
第三种,E和F作案,(E&&F)
这三种可能性是或的关系,
因此有 CC3= (A&&E)||(A&&F)||(E&&F)第三讲 循环结构nullCC4: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第三讲 循环结构null2 采取枚举方法,枚举什么呢?
枚举组合。 6个人每个人都有作案或不作案两种可能,因此有26种组合,从这些组合中挑出符合6条分析的作案者。 定义6个整数变量,分别表示6个人A,B,C,D,E,F。 枚举每个人的可能性: 让0表示不是罪犯; 让1表示就是罪犯。第三讲 循环结构null第三讲 循环结构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判断这些值是否都为1TrueFalse输出ABCDEF为1的null问题:哪只羊最重?
中秋佳节,有贵客来到草原,主人要从羊群中选一只肥羊宴请宾客,当然要选最重者。这样就要
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
每只羊的重量,如果有成千上万只羊,不可能用一般变量来记录。可以用带有下标的变量,也就是这里要讲的数组。
第四讲 数组null1.程序分析:
第四讲 数组null2.程序
main() // 主函数
{ float sheep[10]; // 数组,有10个浮点类型元素
float max; // 浮点类型变量,存放最肥羊的重量
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);}第四讲 数组null3.归纳分析
(1)数组的定义
类型说明符 数组名 [ 常量表达式 ]
例: float sheep[10];
int a2001[1000];
说明
①数组名的第一个字符应为英文字母;
②用方括号将常量表达式括起;
③常量表达式定义了数组元素的个数;
第四讲 数组null④数组下标从0开始。如果定义5个元素,是从第0个元素至第4个元素;
例如 int a[5] 定义了5个数组元素如下: a[0], a[1], a[2], a[3], a[4]
这是5个带下标的变量,这5个变量的类型是相同的
⑤常量表达式中不允许包含变量;
例如 int n;
n = 5;
int a[n]; 不合法!
第四讲 数组null(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;
第四讲 数组null(3)数组在内存中分配一段连续的存储空间
内存地址变量名FF02FF01FF00FF03FF04FF05FF06FF07a[0]a[1]a[2]a[3]00000000000000110000000000000101000000000000010000000000000000010000000000000010FF08FF09a[4]a数组名第四讲 数组null思考:
1.#include
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 };
第四讲 数组null3.其他不变,改变声明项为
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 };第四讲 数组null第四讲 数组
【实例】将几个数从大到小排序并输出,冒泡排序法
i=1 i=2 i=3 i=4 i=5 i=6a[1] a[2] a[3] a[4] a[5] a[6]初始值 1 8 3 2 4 9比较1和8,调换 1 8 3 2 4 9比较1和3,调换 8 1 3 2 4 9比较1和2,调换 8 3 1 2 4 9比较1和4,调换 8 3 2 1 4 9比较1和4,调换 8 3 2 4 1 91到达位置 8 3 2 4 9 1比较8和3,不动 8 3 2 4 9 1比较3和2,不动 8 3 2 4 9 1比较2和4,调换 8 3 2 4 9 1比较2和9,调换 8 3 4 2 9 12到达位置 8 3 4 9 2 1null
i=1 i=2 i=3 i=4 i=5 i=6a[1] a[2] a[3] a[4] a[5] a[6]中间值 8 3 4 9 2 1比较8和3,不动 8 3 4 9 2 1比较3和4,调换 8 3 4 9 2 1比较3和9,调换 8 4 3 9 2 13到达位置 8 4 9 3 2 1比较8和4,不动 8 4 9 3 2 1比较4和9,调换 8 4 9 3 2 14到达位置 8 9 4 3 2 1比较8和9,调换 8 9 4 3 2 18到达位置 9 8 4 3 2 1第四讲 数组null从表中可以看出最小的一个数第一遍扫描就交换到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。
第四讲 数组null再看在每遍扫描中,相邻两数组元素的比较次数。
当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
第四讲 数组null为了表述方便,定义以下3个变量:
n —— 待排序的数的个数,这里 n=6
j —— 扫描遍数,j=1,2,…,n-1
i —— 第j遍扫描待比较元素的下标,i=1,2,…,n-j
第四讲 数组null采用两重计数型循环:
步骤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
本文档为【C语言程序设计课件(免费)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。