计算思维与算法设计基础教学课件电子教案_第1页
计算思维与算法设计基础教学课件电子教案_第2页
计算思维与算法设计基础教学课件电子教案_第3页
计算思维与算法设计基础教学课件电子教案_第4页
计算思维与算法设计基础教学课件电子教案_第5页
已阅读5页,还剩399页未读 继续免费阅读

下载本文档

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

文档简介

概论第一章目录123计算思维算法基础计算机程序和计算机语言

4算法实现和VS2010开发环境简介

延迟符计算思维20世纪50年代抽象、数据表达、数据逻辑组织等等,蕴含在工程思维、科学思维等中2006年关于教育计算思维是一种思维过程,是用计算机能够有效解决问题的方法,确切的描述问题及其解决方案的思维过程2008强调计算思维教育的普适性1高级目标——培养计算思维《computationalThinking》计算思维是运用计算机科学的基础概念进行问题求解、系统设计、以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。计算思维的本质就是抽象(abstraction)与自动化(Automation),即在不同层面进行抽象,以及将这些抽象自动化。导航问题起终132N+1n高级目标——培养计算思维《computationalThinking》计算思维是运用计算机科学的基础概念进行问题求解、系统设计、以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。计算思维的本质就是抽象(abstraction)与自动化(Automation),即在不同层面进行抽象,以及将这些抽象自动化。计算思维是人类应具备的第三种思维:实验思维:实验-》观察-》发现、推断与总结。---观察与归纳理论思维:假设、预设-》定义/性质/定理-》证明。---推理和演绎计算思维:设计,构造与计算。--设计与构造3的二进制码9的二进制码内存中的程序代码不管是哪种程序设计语言写的程序,最后都要转换成同样的机器指令代码,存于内存,才能被CPU执行完成3+9的计算机程序(基于Z80指令系统)计算机语言的比较延迟符算法基础——算法的定义2算法的非正式定义:算法是一种逐步解决问题或完成任务的方法。

【例1.1】某课程学习小组有5个同学,设计算法求该课程的最高分。求解此题,可以采用逐个比较的方法求得最高分,具体步如下:步骤1:将第一个同学的分数设为最高分;步骤2:如果第二个同学的分数大于最高分,则将其设为最高分,否则最高分不变。步骤3:如果第三个同学的分数大于最高分,则将其设为最高分,否则最高分不变。步骤4:如果第四个同学的分数大于最高分,则将其设为最高分,否则最高分不变。步骤5:如果第五个同学的分数大于最高分,则将其设为最高分,否则最高分不变。延迟符算法基础——算法的定义2算法更正式的定义:算法是指求解特定问题的一组明确步骤的有序集合,它产生结果并在有限的时间内终止。算法的特性:有穷性。确定性。

有0个或多个输入。有一个或多个输出。有效性。

延迟符算法基础——算法的结构(顺序结构)2将第1个同学的分数设为最高分如果第2个同学的分数大于最高分,则将其设为最高分,否则最高分不变。如果第3个同学的分数大于最高分,则将其设为最高分,否则最高分不变。如果第4个同学的分数大于最高分,则将其设为最高分,否则最高分不变。如果第5个同学的分数大于最高分,则将其设为最高分,否则最高分不变。例题1.1的流程图表示延迟符算法基础——算法的结构(分支结构)2第n个同学的分数大于最高分最高分改为该同学的分数真假延迟符算法基础——算法的结构2算法设计过程包括问题分析、问题抽象、数学建模、算法详细设计、算法正确性验证、算法分析、程序测试和相关文档资料的编制。

算法基础——算法设计过程2延迟符算法基础2算法设计举例:求1!+2!+3!+…+n!的值

(1)定义问题求解的目标开始编写程序时,总是需要清晰地知道程序可以做什么。例如上例中要实现的功能就是求20以内阶乘之和。(2)定义算法适用范围求n阶乘的算法很简单,就是1×2×3×…×n即可。然而,n!的值随着n的增长而迅速增长。那么程序求解过程中是否能表示这一整数呢?在实际应用中恰当地处理极大的数字或避免出现极大的数字是相当复杂的。(3)定义输入和输出(4)定义常量和变量以及相关公式1.问题说明和分析延迟符算法基础2算法设计举例:求1!+2!+3!+…+n!的值

2.算法表示3.算法正确性证明和分析算法流程图表示延迟符算法基础——算法举例2成绩管理系统延迟符计算机程序和计算机语言3程序是一系列计算机能识别和执行的指令。

程序的定义1计算机语言是用于人与计算机通信的语言。

计算机语言的定义2延迟符算法实现和VS2010使用4算法实现C语言程序:/*p1_2.c*/#include<stdio.h>intmain(){doublenumCount=1;doublefactorial=1,sumFactorial=0;while(numCount<20){factorial=factorial*numCount;sumFactorial=sumFactorial+factorial;numCount=numCount+1;}printf("sumFactorial=%lf\n",sumFactorial);return0;}算法要使用某种计算机语言实现才能被计算机执行算法独立于计算机语言,算法是问题解决的方法和步骤的统称,并不依赖于某种计算机语言,但算法要用计算机运行获得结果则必须用具体的语言编写后才行。延迟符算法实现和VS2010使用4VS2010使用延迟符算法实现和VS2010使用4VS2010使用程序编辑栏2.编写程序和调试程序调试程序方法:(1)通过设置变量输出,根据输出结果检查程序错误并修改。(2)使用断点调试 a.单击需要暂停的程序行左边栏或者按F9给当前行添加断点 b.按F10(StepOver)逐条执行代码,在执行前可以先设置观察变量,也就是设置需要检查结果是否正确的变量为观察变量,根据逐条执行代码看变量值是否为正确值。 c.按F11(StepIn)逐条执行代码,但调试器会进入方法内部(比如遇到printf函数将进入该函数内部调试。)

2.编写程序和调试程序执行程序方法:(1)选择“调试”菜单中的“开始执行(不调试)”选项执行程序(2)按“Ctrl+F5”运行程序。

测试程序:(1)白盒测试(2)黑盒测试3.执行和测试程序2020加油怎样显示信息第二章程序设计延迟符计算思维的培养算法语言延迟符怎样显示信息求某个学生综合成绩问题变量的命名规则;变量的类型;给变量赋值;算术运算符;求余和除法深入介绍;赋值运算符;格式输出函数;转义字符求任意学生综合成绩问题格式输入函数输入学生成绩判断是否良好问题关系运算符;逻辑运算符123本章提要1、学生综合成绩问题学生的某课程综合成绩由三部分构成:平时成绩占30%;期中测试成绩占10%;期末考试成绩占60%。求解学生的综合成绩某同学平时成绩92分,期中测试89分,期末考试成绩95分92*30%+89*10%+95*60%规律:综合成绩=平时成绩*30%+期中成绩*10%+期末成绩*60%0192*30%=27.60289*10%=8.90395*60%=570427.6+8.9+57=93.5手工计算92*30%+89*10%+95*60%93.5找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程平时成绩期中成绩期末成绩综合成绩找个地方准备存放数据1延迟符计算机的处理过程计算表达式92*30%+89*10%+95*60%92,89,95整型数据我们知道是百分数,但计算机不知道计算机中有浮点数,即0.3,0.1,0.6我们知道是百分数,但计算机不知道计算机中有浮点数,即0.3,0.1,0.6我们知道是百分数,但计算机不知道计算机中有浮点数,即0.3,0.1,0.6找个地方准备存放数据1延迟符计算机的处理过程计算表达式92*30%+89*10%+95*60%intdaily_perf,mid_test,final_exam;直接书写0.3,0.1,0.6综合成绩:floatscorescore=daily_perf*0.3+mid_test*0.1+final_exam*0.6延迟符C语言标识符的命名规则变量明、数组名、函数名等都属于标识符01OPTION02OPTION03OPTION必须以字母或者下划线开头可以包含字母、数字和下划线不能与关键字相同C语言相关知识点——变量的命名规则延迟符C语言相关知识点——变量的类型类型名称所占位数精度(位)数值范围基本整型([signed]int)8*432-2147483648~2147483647单精度实型(float)8*4约70和10-38~1038(绝对值)字符型(char)8*180~256(包含ASCII码表的字符)找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程给数据赋值2延迟符定义变量后,再给变量赋值intdaily_perf,mid_test,final_exam;floatscore;daily_perf=92;mid_test=89;final_exam=95;给数据赋值2延迟符intdaily_perf=92,mid_test=89,final_exam=95;定义变量时,给变量赋值给数据赋值2延迟符intdaily_perf=92,mid_tes,final_exam=95;mid_test=89;定义变量时,给部分变量赋值找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){/*定义整形变量并赋值*/

intdaily_perf=92,mid_test=89,final_exam=95;

floatscore;/*定义实型变量*/……找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程计算3延迟符计算机的处理过程score=daily_perf*0.3+mid_test*0.1+final_exam*0.6;延迟符C语言相关知识点——算术运算符%/*+-优先级:这五种运算符中“乘”(*)、“除”(/)和“求余”(%)的优先级相同,都比“加”(+)和“减”(-)优先级高结合性:除非“-”当作负值运算符,否则这五种运算符都具有左结合性注意:整型数据的除法;整型数据才能求余;没有幂运算延迟符C语言相关知识点——赋值运算符’=‘一般形式:变量=表达式符合赋值运算符:+=、-=、*=、/=、%=优先级:非常低级,低于目前所学所有运算符。结合性:从右到左注意:左边必须是变量例如:a+=b相当于a=a+b

a/=b+c相当于a=a/(b+c)找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){/*定义整形变量并赋值*/ intdaily_perf=92,mid_test=89,final_exam=95;floatscore;/*定义实型变量*/

score=daily_perf*0.3+mid_test*0.1+final_exam*0.6;……找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf=92,mid_test=89,final_exam=95;/*定义整形变量并赋值*/floatscore;/*定义实型变量*/score=daily_perf*0.3+mid_test*0.1+final_exam*0.6;

printf(“Theoverallscoreis%f\n”,score);/*输出*/return0;}延迟符C语言相关知识点——格式输出函数格式字符串+非格式字符串指定输出格式,以%开头,说明输出数据的类型、形式、长度、小数位数原样输出包含:普通字符、转义字符零个、一个或者多个输出项,用逗号隔开,可以是常量、变量或者表达式printf(“i=%d,ch=%c\n”,i,ch);printf(“格式控制字符串”,输出项表);延迟符C语言相关知识点——格式输出函数格式字符%d%f%c整型数据实型数据字符型数据输出结果4延迟符计算机的处理过程printf(“Theoverallscoreis%f\n”,score);指定输出格式,以%开头,说明输出数据的类型、形式、长度、小数位数原样输出包含:普通字符、转义字符零个、一个或者多个输出项,用逗号隔开,可以是常量、变量或者表达式延迟符C语言相关知识点——转义字符字符形式功能说明\n回车换行,将当前位置移到下一行开头\t横向跳到下一制表位置\\反斜线符"\"\'单引号字符\”双引号字符找个地方准备存放数据给数据赋值计算输出结果1234延迟符计算机的处理过程#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf=92,mid_test=89,final_exam=95;/*定义整形变量并赋值*/floatscore;/*定义实型变量*/score=daily_perf*0.3+mid_test*0.1+final_exam*0.6;

printf(“Theoverallscoreis%f\n”,score);/*输出*/return0;}2、求任意学生综合成绩问题变量平时成绩(daily_perf)、期中测试成绩(mid_test)和期末考试成绩(final_exam)的值,由用户输入,通过统一的计算公式求解综合成绩(score),计算机再输出结果daily_perf*0.3+mid_test*0.1+final_exam*0.6定义变量用户给数据赋值计算输出结果1234延迟符计算机的处理过程定义变量用户给数据赋值计算输出结果1234延迟符计算机的处理过程#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf,mid_test,final_exam;/*定义整形变量*/floatscore;/*定义实型变量*/

……/*用户输入数据*/score=daily_perf*0.3+mid_test*0.1+final_exam*0.6;printf(“Theoverallscoreis%f\n”,score);/*输出*/return0;}怎样输入数据?延迟符C语言相关知识点——格式输入函数格式字符串+非格式字符串指定输出格式,以%开头,说明输出数据的类型最好不要使用地址列表用逗号隔开是由若干个地址组成的列表scanf(“%d%c”,&i,&ch);scanf(“格式控制字符串”,地址列表)定义变量用户给数据赋值计算输出结果1234延迟符计算机的处理过程intdaily_perf,mid_test,final_exam;scanf(“%d%d%d”,&daily_perf,&mid_test,&final_exam);printf(“%d%d%d”,daily_perf,mid_test,final_exam);比较延迟符C语言相关知识点——部分scanf格式字符说明表格式字符意义d输入十进制整数u输入无符号十进制整数f输入实型数(用小数形式)c输入单个字符s输入字符串#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf,mid_test,final_exam;/*定义整形变量并赋值*/ floatscore;/*定义实型变量*/ printf("Inputdaily_perfmid_testfinal_exam:\n");

/*提示用户输入信息*/ scanf("%d%d%d",&daily_perf,&mid_test,&final_exam); /*使用格式输入函数,获取变量的值*/ score=daily_perf*0.3+mid_test*0.1+final_exam*0.6; /*给变量赋值为算术表达式的值*/ printf("Theoverallscoreis%f\n",score);/*输出*/ return0;}3、输入学生成绩判断是否良好问题规定学生综合成绩在80分和90分之间属于良好,90分及以上属于优秀。输入某学生各项成绩后,如何判断此学生综合成绩(score)是否良好呢?daily_perf*0.3+mid_test*0.1+final_exam*0.6良好:80~90定义变量用户给数据赋值计算判断1234延迟符计算机的处理过程输出良好输出不是良好分支结构#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf,mid_test,final_exam;/*定义整形变量并赋值*/ floatscore;/*定义实型变量*/ printf("Inputdaily_perfmid_testfinal_exam:\n"); scanf("%d%d%d",&daily_perf,&mid_test,&final_exam); score=daily_perf*0.3+mid_test*0.1+final_exam*0.6;

/*判断是否良好,并输出提示*/ return0;}延迟符C语言相关知识点——6种关系运算符<小于<=小于或者等于>大于>=大于或者等于==等于!=不等于延迟符C语言相关知识点——部分运算符优先级3、输入学生成绩判断是否良好问题规定学生综合成绩在80分和90分之间属于良好,90分及以上属于优秀。输入某学生各项成绩后,如何判断此学生综合成绩(score)是否良好呢?daily_perf*0.3+mid_test*0.1+final_exam*0.6良好:80~9080<=score<90?#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf,mid_test,final_exam;/*定义整形变量并赋值*/ floatscore;/*定义实型变量*/ printf("Inputdaily_perfmid_testfinal_exam:\n"); scanf("%d%d%d",&daily_perf,&mid_test,&final_exam); score=daily_perf*0.3+mid_test*0.1+final_exam*0.6; if(80<=score<90)printf(“Yes\n”);elseprintf(“No\n”); return0;}能否得到正确结果?延迟符C语言相关知识点——逻辑运算符!(逻辑非)&&(逻辑与)||(逻辑或)aba&&ba||b!a00001010111001011110#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf,mid_test,final_exam;/*定义整形变量并赋值*/ floatscore;/*定义实型变量*/ printf("Inputdaily_perfmid_testfinal_exam:\n"); scanf("%d%d%d",&daily_perf,&mid_test,&final_exam); score=daily_perf*0.3+mid_test*0.1+final_exam*0.6; if(80<=score<90)printf(“Yes\n”);elseprintf(“No\n”); return0;}80<=score&&score<90#include<stdio.h>/*预处理命令,表明需要使用stdio.h中的库函数*/intmain(){ intdaily_perf,mid_test,final_exam;/*定义整形变量并赋值*/ floatscore;/*定义实型变量*/ printf("Inputdaily_perfmid_testfinal_exam:\n"); scanf("%d%d%d",&daily_perf,&mid_test,&final_exam); score=daily_perf*0.3+mid_test*0.1+final_exam*0.6; if(80<=score&&score<90)printf(“Yes\n”);elseprintf(“No\n”); return0;}延迟符C语言相关知识点——部分运算符优先级本章小结延迟符计算思维的培养算法语言顺序结构分支结构变量的命名规则;变量的类型与赋值;算术运算符;赋值运算符;格式输出函数;转义字符1OPTION3OPTION格式输入函数关系运算符;逻辑运算符2OPTION熟能生巧2020加油怎样解决生活中的选择问题第三章目录CONTENTS1各科不及格人数问题求解2补考提示问题如何判断一个学生是否不及格从而得到不及格人数?如何判断一个学生是否不及格从而输出补考提示?这里,我们就需要使用选择结构来实现。前言preface各科不及格人数问题求解Part1问题阐述算法设计代码实现一、问题阐述输入3名学生的4门成绩:能够判断该分数是否及格(我们以60分作为及格标准);能够分别统计输出这4门课程不及格的人数。【问题简化】输入3名学生的1门课程成绩,统计这门课程不及格的人数。X同学科目1科目2科目3科目4Y同学科目1科目2科目3科目4Z同学科目1科目2科目3科目4二、算法分析问题:统计第一门课程不及格学生的人数。步骤:①设这门课程不及格的初始人数为0,即n1=0;并设置变量x,y,z用来存放第一门课3个同学的成绩。②通过单分支选择结构,判断x是否小于60:x<60,则用来统计该课程不及格人数的变量n1的值加1;x>=60,则不做任何处理。二、算法分析③重复步骤②,判断该课程第二个同学的分数y是否小于60,并对n1进行相应处理;④重复步骤②,判断该课程第三个同学的分数z是否小于60,并对n1进行相应处理;⑤n1此时的值则是第一门课程不及格学生的人数。三、代码实现(1)知识点阐述要实现上述算法,我们所用到单分支if语句,其基本格式如下:if(表达式)

语句首先判断表达式的值,然后:如果表达式的值为“真(非0)”,则执行语句;如果表达式的值为“假(0)”,则不执行该语句。三、代码实现#include<stdio.h>main(){

/*第一步:定义变量*/ intn1;/*用来保存不及格人数*/ floatx,y,z;/*x,y,z分别表示三名同学的成绩*/

/*第二步:提示用户,从键盘上输入学生的成绩*/ printf("请输入三名学生的成绩:"); scanf("%f%f%f",&x,&y,&z);

/*第三步:计算各门课程不及格人数*/ n1=0;/*变量初始为0*/ if(x<60) n1++; if(y<60) n1++; if(z<60) n1++;

/*第四步:输出不及格人数*/ printf("该课程不及格人数是:%d\n",n1); getch();}运行结果:补考提示问题Part2问题阐述算法设计代码实现一、问题阐述要求:输入一名学生成绩。判断学生成绩是否小于60分。若是,则输出补考提示;否则,提示考试通过。二、算法分析

补考提示问题三、代码实现1、知识点阐述要实现上述算法,我们所用到双分支if语句,其基本格式如下:

if(表达式)语句1else

语句2首先判断表达式的值,然后:如果表达式的值为“真(非0)”,则执行语句1如果表达式的值为“假(0)”,则执行语句2

补考提示问题三、代码实现几点说明:(1)对于所有if语句(含单分支、双分支)后面的“表达式”类型:逻辑表达式或关系表达式——最常见

例如:if(score>=60)printf(“成绩及格”);elseprintf(“成绩不及格”);

补考提示问题三、代码实现几点说明:(1)对于所有if语句(含单分支、双分支)后面的“表达式”类型:逻辑表达式或关系表达式——最常见赋值表达式

例如:if(password=123456)printf(“密码正确!”);

补考提示问题三、代码实现几点说明:(1)对于所有if语句(含单分支、双分支)后面的“表达式”类型:逻辑表达式或关系表达式——最常见赋值表达式

补考提示问题说明:初学者在使用“==”时经常与赋值符号(=)混淆,以上的例子中,如想要判断密码password与123456是否相等,则应该写成右边的形式。例如:if(password=123456)printf(“密码正确!”);例如:if(password==123456)printf(“密码正确!”);恒为真——“非0即真”三、代码实现几点说明:(1)对于所有if语句(含单分支、双分支)后面的“表达式”类型:逻辑表达式或关系表达式——最常见赋值表达式任意的数值类型(包括整型、实型、字符型、指针型数据)。例如:if(6)语句if('A')语句实际上,只要表达式的值为非0,则表达式的值就为“真”;否则,其值为“假”。

补考提示问题三、代码实现几点说明:(2)if语句后面的表达式必须用括号括起来并且之后不能有分号,但是语句后面的分号不可省。(3)对于双分支if语句,else子句不能单独使用,它必须是if语句的一部分,与if语句配对使用。

补考提示问题三、代码实现几点说明:(4)关键词if、else后面的语句,可以为复合语句,即用一对{}括起来的若干个语句集合。需要注意的是,在“{}”后面不能再加分号。例如:if(a>b)

{a++;b--;}else

{a--;b++;}

补考提示问题三、代码实现C语言的“语句”——类型角度1、表达式语句如a++;x=a+b;2、函数调用语句如printf(“goodmorning”);Scanf(“%d”,&a);3、空语句

;4、复合语句如{a++;x=a+b;}。。。。。。

补考提示问题三、代码实现C语言的“语句”——格式角度1、简单语句如a++;x=a+b;如printf(“goodmorning”);Scanf(“%d”,&a);;2、复合语句如{a++;x=a+b;}

补考提示问题三、代码实现2、代码实现#include<stdio.h>main(){ floatscore; printf("请输入学生成绩:"); scanf("%f",&score); if(score<60) printf("不及格,需要补考"); else printf("考试通过"); getch();}运行结果:

补考提示问题main(){ inta=8; if(a=10) printf("=="); else printf("!="); getch();}^_^小测试main(){ inta=3,b=4; if(a>b) a=0;b=0; printf("%d,%d\n",a,b); getch();}^_^小测试main(){ inta=3,b=4; if(a>b) { a=0;b=0; } printf("%d,%d\n",a,b); getch();}^_^小测试main(){ inta=3,b=4; if(a>b); a=0;b=0; printf("%d,%d\n",a,b); getch();}^_^小测试从键盘上输入一个三位数,写程序判断是否为回文数。是则输出“yes”,不是则输出“no”。(例如:232、171、363等是回文数)。输入一个三位数得到个位数ge得到百位数baige==bai输出”是回文数”输出”不是回文数”结束真假思考课程最高分问题求解Part3问题阐述算法设计代码实现提高篇最高分最高分最高分最高分一、问题阐述【问题简化】

对于我们输入3名学生的某门课程成绩,要求输出这门课程的最高分。X同学科目1科目2科目3科目4Y同学科目1科目2科目3科目4Z同学科目1科目2科目3科目4

对于我们输入3名学生的4科成绩,要求输出这4门课程的最高分。二、算法分析(1)找出第一门课程的最高分是多少,其步骤如下:①设定存放第一门课程最高分的变量max1;②看第X同学该课程分数x1是否比Y同学该课程分数y1高如果是,跳转至第③步;如果不是,跳转至第④步。第③步第④步二、算法分析③看X同学的分数x1是否比Z同学的分数z1高如果是,则最高分为X同学的分数x1否则最高分为Z同学的分数z1④看第Y的分数y1是否比Z同学的分数z1高如果是,则最高分为Y同学的分数y1否则最高分为Z的分数z1第③步第④步二、算法分析(2)找出第二门课程的最高分是多少,算法思路同第一门课程;(3)找出第三门课程的最高分是多少,算法思路同第一门课程;(4)找出第四门课程的最高分是多少,算法思路同第一门课程。三、代码实现#include<stdio.h>main(){

//第一步:定义变量

floatmax1,max2,max3,max4; //用来保存各课程最高分

floatx1,x2,x3,x4,y1,y2,y3,y4,z1,z2,z3,z4,a1,a2,a3;三、代码实现//第二步:从键盘上输入学生的成绩

printf("请输入第一名学生的四门成绩:"); scanf("%f%f%f%f",&x1,&x2,&x3,&x4); printf("请输入第二名学生的四门成绩:"); scanf("%f%f%f%f",&y1,&y2,&y3,&y4); printf("请输入第三名学生的四门成绩:"); scanf("%f%f%f%f",&z1,&z2,&z3,&z4);三、代码实现

/*第三步;计算各课程最高分*/

//第1门课程

if(x1>y1)if(x1>z1) max1=x1; else max1=z1;

else if(y1>z1) max1=y1; else max1=z1;三、代码实现

//第2门课程

if(x2>y2) if(x2>z2) max2=x2; else max2=z2;

else if(y2>z2) max2=y2; else max2=z2;三、代码实现//第3门课程

if(x3>y3) if(x3>z3) max3=x3; else max3=z3;

else if(y3>z3) max3=y3; else max3=z3;三、代码实现

//第4门课程

if(x4>y4) if(x4>z4) max4=x4; else max4=z4;

else if(y4>z4) max4=y4;else max4=z4;三、代码实现

//第四步:输出各门课程的最高分

printf("第1门课程的最高分是:%.1f\n",max1); printf("第2门课程的最高分是:%.1f\n",max2); printf("第3门课程的最高分是:%.1f\n",max3); printf("第4门课程的最高分是:%.1f\n",max4);}运行结果:熟能生巧2020加油怎样解决生活中的重复问题(二)第四章目录一、多个学生成绩输入问题求解二、单门课程成绩平均分计算问题求解三、多门课程成绩平均分计算问题求解完成一个班级学生的多门课程成绩输入,并求出每门课程成绩的平均分,请问要如何处理?问题单门课程成绩平均分计算问题求解Part2问题阐述算法分析代码实现一、问题阐述根据上讲课程知识,假定我们已经完成班级学生语文成绩的输入,现在需要求出该班语文成绩的平均分,请问要如何处理?二、算法分析为了求出语文成绩的平均分,可将每个学生的该门成绩累加起来,然后除以人数N,即得平均分。具体来说,采用一维实型数组stuGrade来存放N个学生的语文成绩,利用计数器i控制数据的输入和累加,利用累加器sum保存各个语文成绩的和。二、算法分析算法具体步骤如下:①定义计数器i和累加器sum,0=>i,0=>sum;②定义数组stuGrade;③判断i<N是否成立。若成立,转第④步;否则,转第⑥步;④输入第i个学生的语文成绩,将之存入数组元素stuGrade[i]中;⑤sum+stuGrade[i]=>sum;⑥i+1=>i,转第③步;⑦输出sum/N的值;⑧输入结束。二、算法分析作业:利用while循环编程实现该算法。(10分钟)三、代码实现(1) 程序设计相关知识for循环语句的定义和使用(2) C语言编程实现3.1程序设计相关知识(1)for循环语句适用场合:for循环的使用最灵活。当循环次数已知时,用for循环实现最简单、清晰。for循环也可以用于循环次数不确定以及循环结束条件未知的情况。一般格式如下:for(表达式1;表达式2;表达式3){

循环体;}3.1程序设计相关知识for循环的执行过程如下:①先求解表达式1;②求解表达式2,若其值为真(非0),则执行内嵌语句,然后执行第3步;否则,跳转到第5步;③求解表达式3;④转回上面第2步继续执行;⑤循环结束,执行for语句下面的一个语句。图4-12for循环程序执行流程图一般格式如下:for(表达式1;表达式2;表达式3){

循环体;}for循环执行过程说明:①“表达式1”在循环执行过程中只执行一次,通常用来设置循环控制变量初值;②“表达式2”的作用是判断循环结束的条件,其一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,通常用于决定什么时候退出循环;③“表达式3”通常用来改变控制变量的值,定义循环控制变量每循环一次后按什么方式变化;④以上三个表达式之间用“;”分隔。for(循环变量赋初值;循环条件;改变循环变量){

循环体;}3.1程序设计相关知识【回顾】【例4.1】用while循环实现功能:计算10!并显示结果。/*p4_1.c*/#include<stdio.h>main(){ inti,p; p=1; i=1;

while(i<=10) { p=p*i; i+=1; } printf("10!=%d\n",p);}3.1程序设计相关知识【例4.5】计算10!并显示结果,用for循环实现。/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;for(i=1;i<=10;i++){ p=p*i;}printf("10!=%d\n",p);}

求n!程序流程图/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;/*简化形式*/for(i=1;i<=10;i++) p=p*i;printf("10!=%d\n",p);}注意事项:①“表达式1”在循环执行过程中,只执行一次,可以是与循环控制变量无关的其他表达式。如例4.5所示,main函数可以写成如下形式:#include<stdio.h>main(){inti,p;for(p=1,i=1;i<=10;i++)

p=p*i;printf("10!=%d\n",p);}/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;/*简化形式*/for(i=1;i<=10;i++) p=p*i;printf("10!=%d\n",p);}逗号表达式②“表达式1”、“表达式2”、“表达式3”都是可选项,即三个表达式可以省略其中一个或两个或全部省略,但“;”不能省略。例4.5中,省略“表达式1”,表示在for循环中不对控制变量赋初值。例如:#include<stdio.h>main(){inti,p;p=1;i=1;for(;i<=10;i++) p=p*i;printf("10!=%d\n",p);}/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;/*简化形式*/for(i=1;i<=10;i++) p=p*i;printf("10!=%d\n",p);}省略“表达式2”,表示不判断循环条件,循环将无限执行下去,也就认为“表达式2”的值始终为“真(非0)”。此种情况下,需要在循环体中设置结束循环的语句,否则程序将陷入死循环。/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;/*简化形式*/for(i=1;i<=10;i++) p=p*i;printf("10!=%d\n",p);}/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;for(i=1;;i++) p=p*i;printf("10!=%d\n",p);}死循环!省略“表达式3”,表示不改变循环控制变量的值。例4.5中,如果省略“表达式3”,则“表达式3”直接放在循环体内的最后一条语句即可。例如右侧代码所示。main(){inti,p;p=1;for(i=1;i<=10;){ p=p*i;

i++;}printf("10!=%d\n",p);}③“表达式1”和“表达式3”可以是一个简单表达式也可以是逗号表达式。在逗号表达式内按从左到右的顺序计算,其返回值和类型是最右边表达式的值和类型。#include<stdio.h>main(){inti,p;for(p=1,i=1;i<=10;i++)

p=p*i;printf("10!=%d\n",p);}逗号表达式#include<stdio.h>main(){inti,p;for(p=1,i=1;i<=10;i++,p=p*i);printf("10!=%d\n",p);}3.2C语言编程实现求解语文成绩的平均分,做出如下编程实现:/*p4_10.c*/#include<stdio.h>#defineN40intmain(){ inti; //设置计数器i,指示当前要处理的第i个学生

floatsum; //设置累加器

floatstuGrade[N]; //存放N个学生的语文成绩

floatave; //存放语文平均成绩

for(i=0,sum=0;i<N;i++) { scanf("%f",&stuGrade[i]); //输入第i个学生的语文成绩

sum+=stuGrade[i]; //累加第i个学生语文成绩

} ave=sum/N; //求得语文课程的平均成绩

printf("AveragegradeofChineseCourseis:%6.1f\n",ave); return0;}3.2C语言编程实现程序说明:①利用数组stuGrade[N]存放N个学生的语文成绩,利用变量sum存放已累加的语文成绩之和,利用变量ave存放语文课程平均成绩;②由于C语言中数组下标从0开始,因此计数器变量i的初始值为0,指示当前要处理的第i个学生;③利用for循环语句处理该班的每个学生语文成绩,由计数器变量i来控制循环体的进行,每处理完一个学生,则i的值自动加1;④为了提高程序的可读性和可维护性,采用宏定义的形式规定学生的人数N。采用while语句也能实现该程序的功能,但采用for语句的实现方式显得更为精简。/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;for(i=1;;i++) p=p*i;printf("10!=%d\n",p);}死循环!3.3break语句解决“死循环”问题

求n!程序流程图break语句break语句的作用是使程序的执行流程从一个语句块内部转移出去。在while、do…while循环结构中break语句通常与if语句一起使用,实现当满足某条件时使程序立即退出该循环结构,转而执行该循环结构后的第一条语句。#include<stdio.h>main(){inti,p;p=1;for(i=1;;i++){if(i>10)break; p=p*i;}printf("10!=%d\n",p);}3.3break语句解决“死循环”问题

求n!程序流程图【例4.7】自然数n的阶乘小于10000,而且最接近10000,求n的值。/*p4_11.c*/#include<stdio.h>main(){ inti=1,t=1; while(1)//由于结束条件不明确,先用死循环

{ t=t*i;

if(t>10000) break;//当t>10000,退出循环

i++; } printf("满足条件的n值为:%d\n",i-1);}注意事项:①break只能跳出当前循环。如果是嵌套循环,break只能跳出break语句所在层的循环;②程序在输出结果应为i-1而不是i。因为程序在运行break时阶乘的值已经不满足条件,也就是已经多乘了一个数,所以,结果应该为i-1,这是编程时需要注意的边界值问题。谢谢!计算思维与算法设计基础怎样解决生活中的重复问题(三)第四章目录一、多个学生成绩输入问题求解二、多个学生学号输入问题求解三、课程成绩平均分计算问题求解四、学生成绩查询问题求解完成一个班级学生的学号和语文成绩的输入,并求出语文成绩的平均分,然后根据某个学生的学号来查询该生的语文成绩,请问要如何处理?问题课程成绩平均分计算问题求解Part3问题阐述算法分析代码实现一、问题阐述根据本章前两节知识,假定我们已经完成班级学生的学号和语文成绩的输入,现在需要求出该班语文成绩的平均分,请问要如何处理?3二、算法分析为了求出语文成绩的平均分,可将每个学生的该门成绩累加起来,然后除以人数N,即得平均分。结合前面所学知识,可在4.1.2节所述算法的基础上,将所有学生语文成绩累加求平均值即可。具体来说,采用一维实型数组stuGrade来存放N个学生的语文成绩,利用计数器i控制数据的输入和累加,利用累加器sum保存各个语文成绩的和。3二、算法分析算法具体步骤如下:①定义计数器i和累加器sum,0=>i,0=>sum;②定义数组stuGrade;③判断i<N是否成立。若成立,转第④步;否则,转第⑥步;④输入第i个学生的语文成绩,将之存入数组元素stuGrade[i]中;⑤sum+stuGrade[i]=>sum;⑥i+1=>i,转第③步;⑦输出sum/N的值;⑧输入结束。3二、算法分析图4-11学生成绩平均分求解流程图根据根据上述步骤,绘制算法流程图如图4-11所示。3三、代码实现C语言中的for循环语句因其使用简单、灵活的特点而被广泛使用。为此,要求课程成绩平均分,需要掌握如下知识点:(1) 程序设计相关知识for循环语句的定义和使用(2) C语言编程实现33.1程序设计相关知识(1)for循环语句for循环的使用最灵活,当循环次数已知时,用for循环实现最简单、清晰,for循环也可以用于循环次数不确定以及循环结束条件未知的情况。for循环语句的一般格式如下:for(表达式1;表达式2;表达式3){

循环体;}33.1程序设计相关知识for循环的执行过程如下:①先求解表达式1;图4-12for循环程序执行流程图②求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3步;若其值为假(0),则结束循环,转到第5步;③求解表达式3;④转回上面第2步继续执行;⑤循环结束,执行for语句下面的一个语句。图4-12for循环程序执行流程图33.1程序设计相关知识针对for循环的执行过程,作如下说明:①“表达式1”在循环执行过程中只执行一次,它可以用来设置循环控制变量初值;②“表达式2”的作用是判断循环结束的条件,其一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,通常用于决定什么时候退出循环;③“表达式3”的作用是改变控制变量的值,定义循环控制变量每循环一次后按什么方式变化;④以上三个表达式之间用“;”分隔。因此,对于for循环语句的最简单应用形式也可以理解为如下的形式:for(循环变量赋初值;循环条件;改变循环变量){

循环体;}33.1程序设计相关知识【例4.5】计算10!并显示结果,用for循环实现。/*p4_8.c*/#include<stdio.h>main(){inti,p;p=1;for(i=1;i<=10;i++){ p=p*i;}printf("10!=%d\n",p);}

求n!程序流程图33.1程序设计相关知识注意事项:①“表达式1”在循环执行过程中,只执行一次,它可以是设置循环控制变量初值的赋值表达式,也可以是与循环控制变量无关的其他表达式。如例4.5所示,main函数可以写成如下形式:main(){inti,p;for(p=1,i=1;i<=10;i++)…}将p=1这条独立语句放入for循环的表达式1中,并与i=1构成一个逗号表达式。②“表达式1”、“表达式2”、“表达式3”都是可选项,即三个表达式可以省略其中一个或两个或全部省略,但“;”不能省略。33.1程序设计相关知识例4.5中,省略“表达式1”,表示在for循环中不对控制变量赋初值。例如:main(){inti,p;p=1;i=1;for(;i<=10;i++)…}省略“表达式2”,表示不判断循环条件,循环将无限执行下去,也就认为“表达式2”的值始终为“真(非0)”。此种情况下,需要在循环体中设置结束循环的语句,否则程序将陷入死循环。33.1程序设计相关知识省略“表达式3”,表示不改变循环控制变量的值。例4.5中,如果省略“表达式3”,则“表达式3”直接放在循环体内的最后一条语句即可。例如右侧代码所示:③“表达式1”和“表达式3”可以是一个简单表达式也可以是逗号表达式。在逗号表达式内按从左到右的顺序计算,其返回值和类型是最右边表达式的值和类型。main(){inti,p;p=1;for(i=1;i<=10;){ p=p*i; i++;}printf("10!=%d\n",p);}33.1程序设计相关知识【例4.6】编写程序求一个3行4列矩阵的转置矩阵。矩阵A的转置矩阵用矩阵B表示,显而易见矩阵B是由矩阵A的行列互换后得到的,这时两个矩阵元素的关系可表示为:a[i][j]=b[j][i]。用嵌套的for循环即可完成此任务。3/*p4_9.c*/ #include<stdio.h>main(){ inti,j,a[3][4],b[4][3]; /*输入数组a中各元素*/ printf("\nPleaseentertheelememntsofmatrixa(3*4):\n"); for(i=0;i<3;i++) //处理数组a中的一行中各元素

for(j=0;j<4;j++) //处理数组a中某一列各元素

scanf("%d",&a[i][j]); //输入数组a各元素

/*求得数组a的转置矩阵数组b*/ for(i=0;i<3;i++) //处理数组a中的一行中各元素

for(j=0;j<4;j++) //处理数组a中某一列各元素

b[j][i]=a[i][j]; //将数组a中元素值赋给数组b中相应元素

/*输出数组b中各元素*/ printf("ThetransposematrixA:"); for(i=0;i<4;i++) { printf("\n"); for(j=0;j<3;j++) printf("%4d",b[i][j]); } printf("\n");}33.2C语言编程实现为了求出语文成绩的平均分,按照参见图4-11所给出的算法流程,做出如下编程实现:/*p4_10.c*/#include<stdio.h>#defineN40intmain(){ inti; //设置计数器i,指示当前要处理的第i个学生

floatsum; //设置累加器

floatstuGrade[N]; //存放N个学生的语文成绩

floatave; //存放语文平均成绩

for(i=0,sum=0;i<N;i++) { scanf("%f",&stuGrade[i]); //输入第i个学生的语文成绩

sum+=stuGrade[i]; //累加第i个学生语文成绩

} ave=sum/N; //求得语文课程的平均成绩

printf("AveragegradeofChineseCourseis:%6.1f\n",ave); return0;}33.2C语言编程实现程序说明:①利用数组stuGrade[N]存放N个学生的语文成绩,利用变量sum存放已累加的语文成绩之和,利用变量ave存放语文课程平均成绩;②由于C语言中数组下标从0开始,因此计数器变量i的初始值为0,指示当前要处理的第i个学生;③利用for循环语句处理该班的每个学生语文成绩,由计数器变量i来控制循环体的进行,每处理完一个学生,则i的值自动加1;④为了提高程序的可读性和可维护性,采用宏定义的形式规定学生的人数N。采用while语句也能实现该程序的功能,但采用for语句的实现方式显得更为精简。3学生成绩查询问题求解Part4问题阐述算法分析代码实现一、问题阐述根据本章前三节知识,假定我们已经完成班级学生的学号和语文成绩的输入,并求出语文成绩的平均分,现在需要根据某个学生的学号来查询该生的语文成绩,请问要如何处理?4二、算法分析基于本章前面所述内容,可以采用一维数组来存放学生语文成绩,采用二维数组来存放学生学号信息。由于学生学号在计算机中通常采用字符串来表示,因此要解决上述问题的关键是判别所给定的学号(字符串)是否存在于存放所有学生学号信息的二维数组中。4二、算法分析为此,采用一维字符数组numCheck[20]来存放待查学生学号,采用二维字符数组stuNum[N][20]来存放该班的N个学生学号。将numCheck所存字符串与stuNum[i](0≤i≤N-1)所存字符串进行比较,判断当前第i个学生的学号是否与待查学号相等。若相等,表示存在待查学号信息,则输出该生的语文成绩,查询结束;否则,i的值加1,继续比较numCheck所存字符串与stuNum[i]所存字符串是否相等。如此循环下去,直到找到待查学号或者搜索完毕全部已输入的学生学号。4二、算法分析算法具体步骤如下:①输入N个学生的学号和语文成绩,分别存入二维数组stuNum和一维数组stuGrade当中;②定义计数器i,0=>i;③输入待查询的学号,并存入一维字符数组numCheck;④判断i<N是否成立。若成立,转第⑤步;否则,转第⑥步;⑤比较numCheck所存字符串与stuNum[i]所存字符串是否相等。若相等,则输出第i个学生的语文成绩,查询结束;否则,i的值加1,转第④步;⑥输出没有找到该生成绩,查询结束。4二、算法分析图4-13根据学号查询成绩的流程图根据上述步骤,绘制算法流程图4-13如图。需要指出的是,由于本章前2节已经阐述如何输入和存储N个学生学号和语文成绩,故对上述步骤①进行了简化处理。4三、代码实现为了利用C语言来实现图4-13所示的算法,需要学习C语言程序设计中的字符串比较函数strcmp,以及break语句。需要掌握如下知识点:(1) 程序设计相关知识字符串比较函数strcmpbreak语句(2) C语言编程实现44.1程序设计相关知识(1)字符串比较函数strcmp由于C语言不提供字符串类型,所以对字符串的处理必须借助字符串函数来完成,C语言为用户提供了丰富的字符串处理函数,大致可分为以下几类:字符串输入输出函数、连接函数、比较函数、复制函数等。使用这些函数可大大减轻编程的负担,用于输入输出的字符串函数,需在使用前包含头文件“stdio.h”;使用其他字符串函数则应包含头文件“string.h”。下面阐述本节所需的字符串比较函数strcmp:格式:strcmp(strl,str2);功能:按照ASCII码顺序比较两个字符数组str1和str2中的字符串,并由函数的返回值返回比较结果,其返回值含义如表4-1所示:44.1程序设计相关知识两字符串的关系返

值str1==str20str1>str2>0str1<str2<0表4-1字符串比较结果要特别注意的是:两个字符串的比较不能使用关系运算符,只能通过比较函数进行两个字符串的比较。例如:……charch1[]=”student”;charch2[]=”students”;……strcmp(ch1,ch2);/*正确的字符串比较方式*/……而不能写成ch1==ch2或ch1>ch2或ch1<ch2等形式。44.1程序设计相关知识此外,其他常用的字符串处理函数有:字符串输入函数gets()、字符串输出函数puts()、字符串长度计算函数strlen、字符串拷贝函数strcpy、字符串连接函数strcat、字符串字母

温馨提示

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

评论

0/150

提交评论