C语言程序设计基础(通识版 慕课版) 课件 第3章 基本控制结构_第1页
C语言程序设计基础(通识版 慕课版) 课件 第3章 基本控制结构_第2页
C语言程序设计基础(通识版 慕课版) 课件 第3章 基本控制结构_第3页
C语言程序设计基础(通识版 慕课版) 课件 第3章 基本控制结构_第4页
C语言程序设计基础(通识版 慕课版) 课件 第3章 基本控制结构_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

第3章基本控制结构哈尔滨工业大学3.1算法的概念和描述方法3.1.1算法的概念3.1.2算法的描述方法3.1.1算法的概念算法(Algorithm)为解决一个具体问题而采取的确定的有限的操作步骤,仅指计算机能执行的算法计算机中的问题求解计划通过程序员按照某种算法编写的计算机程序(ComputerProgram)来实现的设计出正确的算法是编写正确的计算机程序的前提条件程序设计是一门艺术,主要体现在算法设计结构设计揭示面向过程的程序本质的公式算法+数据结构=程序N.Wirth(图灵奖1984)Pascal创始人定义待操作的数据在计算机内存中是如何存储和组织的,选择恰当的数据结构可以提高程序的运行或存储效率对在数据上的操作的描述,不同的算法可能有不同的时间或空间效率3.1.1算法的概念算法的特性有穷性(Finiteness)在合理的时间内完成确定性(Definiteness)无歧义,能有效执行,且能得到确定的结果有效性(Effectiveness)允许没有输入或有多个输入(Input)必须有一个或多个输出(Output)3.1.1算法的概念常用的算法描述方法自然语言(NaturalLanguage)伪码(Pseudocode)表示传统的流程图(Flowchart)N-S结构化流程图3.1.2算法的描述方法3.1.2算法的描述方法以买苹果为例,已知单价每斤y元,问买x斤苹果,需多少钱?step1:输入x和y;step2:根据公式t=x*y计算总价;step3:输出总价t。BeginInputx,yt=x*yOutputtEnd

自然语言描述伪码描述通俗易懂,符合人的日常思维习惯,但不易直接转化为程序书写无固定格式和规范,灵活,介于自然语言和计算机语言之间,易于转换为计算机程序3.1.2算法的描述方法3.2顺序结构顺序结构:最简单、最常用的程序结构复合语句:以两数交换为例3.3选择结构3.3.1选择结构的控制方式3.3.2条件语句3.3.3开关语句3.3.1选择结构的控制方式选择结构根据给定的判定条件,判断结果,并根据判断的结果来控制程序的流程选择结构(分支结构)单分支选择结构(SingleSelection)双分支选择结构(DoubleSelection)多分支选择结构(MultipleSelection)单分支选择结构(SingleSelection)面临的选择是:要么执行一个操作,要么跳过它3.3.1选择结构的控制方式双分支选择结构(DoubleSelection)面临的选择是:在两个不同的操作中选择其中的一个来执行多分支选择结构(MultipleSelection)3.3.1选择结构的控制方式if-else单分支双分支多分支ifelse-if3.3.2条件语句【例3.1】计算最大值。从键盘输入两个整型数,编程计算并输出其最大值确定问题的输入和输出建立问题的数学模型算法描述3.3.2条件语句【例3.1】3.3.2条件语句#include<stdio.h>intmain(void){ inta,b,max; scanf("%d,%d",&a,&b); if(a>=b) { max=a; } else { max=b; } printf("max=%d\n",max);return0;}#include<stdio.h>intmain(void){ inta,b; scanf("%d,%d",&a,&b); if(a>=b) { printf("max=%d\n",a); } else { printf("max=%d\n",b); }return0;}【例3.1】3.3.2条件语句#include<stdio.h>intmain(void){ inta,b,max; scanf("%d,%d",&a,&b); max=a>=b?a:b;

printf("max=%d\n",max);return0;}#include<stdio.h>intmain(void){ inta,b; scanf("%d,%d",&a,&b); printf("max=%d\n",a>=b?a:b);//直接打印条件表达式的值

return0;}3.3.2条件语句如何表示真假值?真

1假

0如何判断真假值?非0

真0

假3.3.2条件语句3.3.2条件语句逻辑非

算术

关系

逻辑与

逻辑或

赋值圆括号优先级最高【例3.2】从键盘任意输入一个年份year,编程判断其是否为闰年,如果是闰年,则输出“Yes!”,否则输出“No!”。闰年需要满足下列两个条件中的任意一个。(1)能被4整除,但不能被100整除。(2)能被400整除。3.3.2条件语句#include<stdio.h>intmain(void){ intyear,leap; scanf("%d",&year); leap=((year%4==0)&&(year%100!=0))||(year%400==0); if(leap)//若leap的值为非0,即为真

{

printf("Yes!\n"); } else { printf("No!\n"); }return0;}【例3.2】从键盘任意输入一个年份year,编程判断其是否为闰年,如果是闰年,则输出“Yes!”,否则输出“No!”。3.3.2条件语句#include<stdio.h>intmain(void){ intyear; scanf("%d",&year); if(((year%4==0)&&(year%100!=0))||(year%400==0)) { printf("Yes!\n"); } else { printf("No!\n"); }return0;}【例3.3】简单的计算器。要求用户按如下格式从键盘输入算式:操作数1运算符op操作数2编程输出其计算结果值,算术运算符包括:加(+)、减(-)、乘(*)、除(/)。3.3.3开关语句3.3.3开关语句#include<stdio.h>intmain(void){ intdata1,data2; charop; scanf("%d%c%d",&data1,&op,&data2);//输入算式,运算符两侧不加空格

if(op=='+') //加法运算

{

printf("%d+%d=%d\n",data1,data2,data1+data2); } elseif(op=='-') //减法运算

{

printf("%d-%d=%d\n",data1,data2,data1-data2); } elseif(op=='*') //乘法运算

{

printf("%d*%d=%d\n",data1,data2,data1*data2); } elseif(op=='/') //除法运算

{

if(data2==0)//为避免除0错误,检验除数是否为0 {

printf("Divisionbyzero!\n"); } else { printf("%d/%d=%d\n",data1,data2,data1/data2); } } else { printf("Invalidoperator!\n"); } return0;}3.3.3开关语句1.每个case后的常量的类型应与switch后括号内表达式的类型一致,并且switch后括号内表达式的值只能为整型、字符型或枚举类型的常量。2.switch语句与break语句配合使用,才能形成真正意义上的多分支3.改变case标号出现的次序,不会影响程序的运行结果3.3.3开关语句#include<stdio.h>intmain(void){ intdata1,data2; charop; scanf("%d%c%d",&data1,&op,&data2);//输入算式,运算符两侧不加空格

switch(op) //根据输入的运算符确定执行的运算

{

case'+'://加法运算

printf("%d+%d=%d\n",data1,data2,data1+data2); break; case'-'://减法运算

printf("%d-%d=%d\n",data1,data2,data1-data2); break; case'*'://乘法运算

printf("%d*%d=%d\n",data1,data2,data1*data2); break; case'/'://除法运算

if(data2==0)//为避免除0错误,检验除数是否为0{

printf("Divisionbyzero!\n"); } else { printf("%d/%d=%d\n",data1,data2,data1/data2); } break; default://处理非法运算符

printf("Invalidoperator!\n"); } return0;}3.4循环结构3.4.1循环控制方式3.4.2计数控制的循环和for语句3.4.3条件控制的循环以及while和do-while语句3.4.4嵌套循环3.4.1循环的控制方式当型循环是先测试循环条件,后执行循环体直到型循环是先执行循环体,然后测试循环条件3.4.2计数控制的循环实现计数控制的for语句

3.4.2计数控制的循环#include<stdio.h>intmain(void){intn;intsum=0;//累加和变量初始化为0

scanf("%d",&n);for(inti=1;i<=n;i++){sum=sum+i;//做累加运算

}

printf("sum=%d\n",sum);return0;}【例3.4】从键盘输入整型变量n的值,然后计算并输出1+2+3+…+n的值。3.4.2计数控制的循环#include<stdio.h>intmain(void){ intn; scanf("%d",&n); intsum=(n%2==0)?0:(n+1)/2; for(inti=1,j=n;i<j;i++,j--) { sum=sum+i+j; } printf("%d\n",sum); return0;}【例3.5】累加求和计算的加速。4.5.2计数控制的循环#include<stdio.h>intmain(void){intn;longp=1;//因是累乘计算,故初始化为1

scanf("%d",&n);for(inti=1;i<=n;i++){p=p*i;//做累乘运算

}

printf("%d!=%ld\n",n,p);

return0;}【例3.6】从键盘输入整型变量n的值,然后计算并输出1×2×3×…×n(即n!)的值。4.5.2计数控制的循环#include<stdio.h>intmain(void){intn;longsum=0;//累加求和变量初始化为0

longp=1;//累乘求积变量初始化为1

scanf("%d",&n);for(inti=1;i<=n;i++){p=p*i;//计算累加项(即通项)

sum=sum+p;//将累乘后p的值即i!进行累加求和

}

printf("sum=%ld\n",n,p);

return0;}【例3.7】编程从键盘输入整型变量n的值,然后计算并输出1~n所有数的阶乘值(1!,2!,3!,…,n!)的累加和,即1!+2!+3!+…+n!。4.5.2计数控制的循环【例3.7】编程从键盘输入整型变量n的值,然后计算并输出1~n所有数的阶乘值(1!,2!,3!,…,n!)的累加和,即1!+2!+3!+…+n!。3.3.3条件控制的循环循环次数未知、由条件或标记值控制的循环结构,通常用while语句或do-while语句来实现。自底向上的程序设计——只猜一次intmain(void){intmagic;

intguess;

srand(time(NULL));

magic=rand()%100+1;

printf("Guessanumber:");scanf("%d",&guess);

if(guess>magic)

{printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else

{printf("Right!\n");}return0;}【例3.8】猜数游戏V1.0:先由计算机“想”一个数,然后请用户猜,若用户猜对了,则计算机给出提示“正确!”,否则提示“错误!”,并告诉用户所猜的数是大还是小。自底向上的程序设计——只猜一次intmain(void){...

scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else { printf("Right!\n");}

return0;}do{

}while(guess!=magic);

counter++;printf("counter=%d\n",counter);intcounter=0;

printf("Try%d:",counter+1);【例3.9】猜数游戏V2.0:在例3.7的基础上,将游戏升级为:直到猜对为止,同时记录用户猜的次数,以此来反映用户“猜”数的水平。自底向上的程序设计——只猜一次intmain(void){...

scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else { printf("Right!\n");}

return0;}do{

}while(guess!=magic);

counter++;printf("counter=%d\n",counter);intcounter=0;

printf("Try%d:",counter+1);&&counter<10);

【例3.10】猜数游戏3.0:在例3.8的基础上,将游戏升级为:每次猜数只允许用户最多猜10次,即用户猜对了或者猜了10次仍未猜对,都结束游戏。自底向上的程序设计——只猜一次intmain(void){……intcounter=0;

return0;}【例3.11】猜数游戏V4.0:猜多个数charreply;do{

counter=0;magic=rand()%100+1;...//输出magic和counterprintf("Doyouwanttocontinue(Y/Nory/n)?");

scanf("%c",&reply);}while(reply=='Y'||reply=='y');3.4.4嵌套循环4.5.2计数控制的循环【例4.8】利用单独计算累加通项的方法,编程计算1!+2!+3!+…+n!。#include<stdio.h>intmain(void){intn;longsum=0;//累加求和变量初始化为0

longp=1;scanf("%d",&n);for(inti=1;i<=n;i++)//外层循环

{

p=1;//每次循环之前都要将累乘求积变量p重新初始化为1

for(intj=1;j<=i;j++)//内层循环

{

p=p*j;//累乘求积

}

sum=sum+p;//将累乘后p的值即i!进行累加求和

}

printf("sum=%ld\n",sum); //以长整型格式输出n的阶乘值

return0;}3.5结构化程序设计与流程转移控制一个比较流行的定义是:结构化程序设计(StructuredProgramming)是一种程序设计的原则和方法它限制和避免使用goto语句,采用“自顶向下、逐步求精”方法进行程序设计按照这种原则和方法设计出的程序的特点为:结构清晰容易阅读容易修改容易验证按照结构化程序设计的要求设计出的语言——结构化程序设计语言按照结构化程序设计语言(或结构化程序设计思想)设计的程序——结构化程序结构化程序设计的目标为了得到一个好结构的程序有无goto语句,并不是程序结构好坏的标志3.5结构化程序设计与流程转移控制结构化程序设计Structured

温馨提示

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

评论

0/150

提交评论