计算机程序设计:从理论到实践(微课版)课件全套 郭卫斌 第1-10章 引言、程序设计基础-磁盘数据组织与处理_第1页
计算机程序设计:从理论到实践(微课版)课件全套 郭卫斌 第1-10章 引言、程序设计基础-磁盘数据组织与处理_第2页
计算机程序设计:从理论到实践(微课版)课件全套 郭卫斌 第1-10章 引言、程序设计基础-磁盘数据组织与处理_第3页
计算机程序设计:从理论到实践(微课版)课件全套 郭卫斌 第1-10章 引言、程序设计基础-磁盘数据组织与处理_第4页
计算机程序设计:从理论到实践(微课版)课件全套 郭卫斌 第1-10章 引言、程序设计基础-磁盘数据组织与处理_第5页
已阅读5页,还剩631页未读 继续免费阅读

下载本文档

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

文档简介

计算机程序设计01计算机系统的工作原理硬件软件系统软件:OS、编译系统应用软件计算机系统CPU、内存外存输入/输出设备计算机系统的工作原理计算机硬件系统计算机软件系统CPU输入设备键盘、鼠标触摸屏扫描仪输出设备显示器打印机音箱外存光盘、硬盘、U盘、磁带程序/数据程序/数据运行结果运行结果主存计算机系统的工作过程内

存内存的组织——存储单元内存的功能——数据存入和取出存储的数据类型——二进制数据内存的组织存储单元(1byte)存储单元地址线性排列存储的内容程序指令数据计算结果内存地址010000010x10010x10020x10030x10040x10050x10060x10070x1008地址内容二进制1bit0或11Byte=8bits00000000~111111111KB(Kilobyte)=1024bytes=210B

1MB(Megabyte)=1024KB=220B

1GB(Gigabyte)=1024MB=230B1TB(Terabyte)=1024GB=240B1PB(Petabyte)=1024TB=250B1EB(Exabyte)=1024PB=260B1ZB(Zettabyte)=1024EB=270B1YB(Zettabyte)=1024ZB=280B二进制数据解释假设1Byte内容为:01000001。对该内容,计算机可有多种不同的解释:一个整数—01000001表示十进制整数65,直接进行二进制到十进制的转换,一个字母—01000001编码表示字符‘A’,计算机使用ASCII编码表示字符。一条指令—01000001也许告诉计算机两个数相加如何解释一个比特流取决于计算机在做什么?存储和取出开机后,内存单元中每一位的状态并不是0,而是不可控制、随机的。信息的存储:重新设置存储单元的每一位为0或1。信息的取出:复制存储单元的内容到另一个存储位置,例如CPU的寄存器。02计算机问题求解计算机问题求解的步骤又叫程序思维(ProgramminThinking)“理解问题-找出路径”的思维过程,包含分解、识别、抽象、算法四个步骤将复杂问题拆分若干个相对容易的小问题,对每个小问题单独进行考察,找到合适的解决方案模板。然后,聚焦到几个重要节点,忽略细枝末节,形成问题的初步解决思路。最后设计出具体的解题步骤编程思维是一种解决问题的思维方式,其核心在于如何分解问题,从中发现规律性,建立解决问题的模型并映射到合适的数据结构和解题方法上,最终形成相应的算法编程思维步骤:分析问题设计算法编写程序调试运行分析问题

计算机角度输入输出解题方法数学角度已知条件求解对象解题思路阶段成果:数学模型设计算法

计算机求解问题的关键之一在于算法,算法提供了利用计算工具求解问题的技术。对同一个问题,可有不同的解题方法和步骤广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”(Algorithm)第一步:拿出茶杯,用沸水洗干净;第二步:抓取少许茶叶倒入茶杯内;第三步:往茶杯内倒入适量的沸水;第四步:放置至温度合适即可饮用。例:求解实数方程ax+b=0,其中参数a和b由键盘上输入。

第1步:输入a和b的值;第2步:若a≠0,则方程的解为x=-b/a。转入第4步;第3步:若a=0,这时不能简单弃之不理,还需要对b进行讨论:(1)如果b=0,方程的解为全体实数;(2)如果b≠0,方程没有实数解。第4步:输出方程的解;第5步:结束。算法有优劣之分。为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法(方法简单,运算步骤少)。方法1:1+2,+3,+4,一直加到10099次加法方法2:100+(1+99)+(2+98)+…+(49+51)+50=100+49×100+50

50次加法例:求

算法的特点有穷性:包含有限的操作步骤确切性:算法中的每一个步骤都应当是确定的有效性:算法中的每一个步骤都应当能有效地执行,并得到确定的结果输入项:输入是指在执行算法时需要从外界取得必要的信息。有零个或多个输入输出项:算法的目的是为了求解,“解”就是输出。有一个或多个输出

算法包含的操作算术运算:加、减、乘、除、求余数…关系运算:大于、小于、等于、不等于…逻辑运算:逻辑与、逻辑或、逻辑非数据传输:输入、输出、赋值…其他运算数值运算算法:主要是求数值解,如公式求值、求方程的根、计算函数的定积分等非数值运算算法:主要应用于数据管理、事务管理、实时控制、过程控制、定理证明等诸多领域

算法的分类描述算法的工具自然语言流程图N-S流程图PAD图伪代码…自然语言就是人们日常使用的语言用自然语言表示通俗易懂。但文字冗长,容易出现“歧义性”南京市长江大桥自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时不方便除了极简单问题外,一般不用自然语言描述算法自然语言美国国家标准化协会ANSI(AmericanNationalStandardInstitute)规定了一些常用的流程图符号:流程图例:用流程图表示求1+2+3+…+100的算法传统流程图的弊端传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制使用者可以毫不受限制地使流程随意地转向,使流程图变得毫无规律,阅读者要花很大精力去追踪流程:这种如同乱麻一样的算法称为BS型算法(ABowlofSpaghetti),乱无头绪。缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证解决办法:限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去

1972年由美国学者I.Nassi和B.Shneiderman提出,是一种新的流程图形式在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框N-S流程图例:用N-S图表示求1+2+3+…+100的算法N-S流程图表示算法的优点比文字描述直观、形象、易于理解,比传统流程图紧凑易画废除了流程线,流程不可能出现无规律的跳转,流程图中的上下顺序就是执行时的顺序整个算法由各个基本结构按顺序组成的,用N-S流程图表示的算法都是结构化的算法问题分析图,1973年由日本日立公司创立,其用二维树形结构的图来描述算法。PAD图例:用PAD图表示求1+2+3+…+100的算法概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。特点:它如同一篇文章一样,自上而下地写下来。每一行(或几行)表示一个基本操作。不用图形符号,书写方便、格式紧凑,易懂,便于向程序过渡。用处:适用于设计过程中需反复修改时的流程描述。伪代码例:用伪代码表示求1+2+3+…+10的算法时间复杂性:反映执行当前算法所消耗的时间情况。通常用“大O符号表示法”表示,即T(n)=O(f(n))空间复杂性:反映执行当前算法需要占用的内存空间情况。空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,一般用S(n)来定义,即S(n)=O(f(n))

算法的效率编写程序算法实现变量定义数据输入程序语句结果输出解题算法数学符号获取数据解题步骤求得结果调试运行编译程序链接资源运行程序分析结果华氏温度到摄氏温度的转换

国际上许多国家使用华氏温度为单位,而中国使用摄氏温度为单位,现在希望编写程序以实现华氏温度到摄氏温度的转换。案例:分析问题

设计算法第1步:获得华氏温度的数值第2步:将华氏温度转换成摄氏温度第3步:显示摄氏温度的数值编写程序定义变量两个变量分别表示华氏温度、摄氏温度数据类型:浮点型

数据处理确定华氏度转换数据输出摄氏度/*华氏温度到摄氏温度的转换*/#include<stdio.h>intmain(){floatf,c;//定义f和c为单精度浮点型变量

f=32;//确定f的值

c=(5.0/9)*(f-32);//利用公式计算c的值

printf("f=%f\nc=%f\n",f,c);//按行输出f和c的值

return0;}运行求解03计算机程序需要设计计算机程序简称“程序”,一组计算机能识别和执行的指令序列程序在计算机中是以0、1组成的指令代码来表示的计算机的一切操作都是由程序控制的只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作优秀的程序:逻辑清晰、代码冗余少、可读性好,健壮性、可移植好、执行时间短,内存占用量小……怎样获得优秀的程序?精巧设计数据结构+

算法=程序NiklausWirth1984年度图灵奖获得者、Pascal之父如何设计程序?数据结构:即指定处理数据的类型和存储方式。数学模型中涉及很多数据,需要用恰当的数据结构来进行处理和保存。不同数据结构,性能会有差异算法:指定对数据的操作步骤,即进行控制结构的设计。算法设计时,除了要保证算法的正确性和效果外,还需要考虑算法的复杂性。算法的复杂性包括算法的时间和空间复杂性

除此之外,还必须借助于一个与计算机交互的平台,即程序设计语言和环境

数据结构+算法+程序设计语言=程序程序设计的实质:数据结构的设计与

控制结构的设计程序设计语言也叫计算机语言:人和计算机交流信息的、计算机和人都能识别的语言计算机语言发展阶段:机器语言(由0和1组成的指令)符号语言(用英文字母和数字表示指令)高级语言(接近于人的自然语言和数学语言)面向过程的语言(非结构化的语言、结构化语言)面向对象的语言低级语言算法漫谈中国科学院资深院士张效祥:“计算机科学就是算法的科学”硬件:计算机系统的物质基础软件:计算机系统的上层建筑算法:计算机系统的灵魂计算机领域竞争的焦点就是算法竞争(以中美为例)中国硬件方面:天河系列、神威系列、曙光系列、联想等,但高端的芯片、智能工业机器人等硬件目前几乎不能生产…软件方面:虽然古代数学曾经无比辉煌,现代有TikTok等企业,但全面落后,缺芯少魂:缺少核心算法,原创的操作系统等这些关键软件也要依靠进口,面临卡脖子窘境…美国硬件方面:IBM、Intel、HP、Apple…软件方面:Microsoft、Google、Oracle、IBM…每个中国人在为新中国的伟大成就自豪的同时,应该居安思危、增强忧患意识。危机既是“危”也是“机”。“在危机中育新机、于变局中开新局”习近平“我们不能在这场科技创新的大赛场上落伍,必须迎头赶上、奋起直追、力争超越”科技强则国家强。大学生要肩负起时代重任,关注超越自身的利害、荣辱、成败,将世界、社会、国家、人民的前途命运萦系于心,勇于创新,实现中国梦04初识C语言最好的入门语言C语言是国际上广泛流行的计算机高级语言之一语法结构简洁、灵活方便,功能丰富,表达力强,易于描述问题和算法,程序可读性好,易于调试、修改和移植,代码质量高,非常适合初学者开发语言世界排行榜TIOBE,每月更新一次,其结果反映了业内程序开发语言的热门程度。过去30年中,90%的时间里,C语言都是独领风骚的,仅偶尔被Java或Python超越。在2023年8月公布的TIOBE排行榜中,前四名分别为Python、C、C++和Java为什么是C语言?能够使用户能深入系统底层,目前市面上流行的操作系统,很多都是用C语言写的,如Windows、Unix、Linux、Mac等如果想了解计算机硬件的体系结构,C语言是必须要深刻掌握的语言,它已经把硬件的运行效率压缩到了极致,使得它比C++、Java、Python语言等更接近机器开源代码很多都是基于C语言实现,通过加入开源社区可以学习标准的代码规范,基于开源项目进行软件开发,提升自身的项目经验,了解最前沿的技术发展方向Code::Blocks

20.03集成开发环境VisualC++6.0集成开发环境对源程序***.c中以“#”开头的预处理命令进行处理。C编译系统会将#include命令后面的.h文件内容插入到原来的源程序文件中,形成一个新的源程序文件***.i由编译程序(或编译器)对预处理后得到的源程序文件***.i进行编译(词法分析、语法分析、语义分析、代码生成与优化、存储分配等),生成一个汇编语言源程序文件***.s由汇编程序(或汇编器)对汇编语言源程序文件***.s进行汇编,生成一个可重定位的目标文件***.o(重定位是指重新确定代码和数据的地址并更新指令中被引用符号地址)由链接程序(或链接器,Linker)将多个可重定位目标文件和标准函数库中的可重定位目标文件及其他目标文件等进行组合,装配为一个可执行目标文件***.exe在C环境下运行可执行文件***.exe,系统会用加载器(Loader)复制可执行文件到内存中,启动指令执行,从而得到运行结果HelloWorld.c源程序文件的存放方式要求在屏幕上输出以下一行信息

ThisisaCprogram.解题思路:

在主函数中用printf函数原样输出以上文字。简单的C程序举例#include<stdio.h>int

main

(

){

printf("ThisisaCprogram.\n");return0;}/*文件包含*//*主函数*//*函数体开始*//*输出语句*//*函数体结束*/说明:main-主函数名,void-函数类型每个C程序必须有一个主函数main{}是函数开始和结束的标志,不可省每个C语句以分号结束使用标准库函数时应在程序开头一行写:

#include<stdio.h>#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}函数的名字,表示主函数C程序必须有一个

main函数#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}主函数类型#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

函数体#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

输出函数输出语句#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

输出语句#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

换行符#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

当main函数执行结束前将整数0作为函数值#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

表示语句结束用到函数库中的输入输出函数时中国古代数学“鸡兔同笼”问题设有a只鸡,b只兔a+b=35……………..……(1)2a+4b=94…(2)1.分析问题

分析问题需明确输入,也就是要处理的数据;明确输出,即是结果;解决方案的任何附加需求或约束条件。

问题输入:总头数x=35,总脚数y=94问题输出:鸡数a和兔数b关系公式:a+b=x 2a+4b=y

推导公式:b=(y-2×x)

2

a=x-b2.设计算法鸡兔同笼问题假设:x代表总头数,y代表总脚数,a鸡数,b兔数//程序名:鸡兔.c主要功能:计算鸡兔数

#include<stdio.h>//引入头文件voidmain(){//主函数intx,y,a,b;

//声明4个整型变量

printf("Pleaseinputtotalheadnumber(x)andtotalfootnumber(y):\n");scanf("%d%d",&x,&y);

//输入数据

b=(y-2*x)/2;a=x-b; printf("鸡:%3d兔:%3d\n",a,b);//输出结果}3.编程、实现算法课程学习安排学习目标掌握程序设计的思想、方法和技术培养问题求解能力提高C语言编程能力最终达到专业的程序设计能力

良好的程序设计风格

富有创造力的算法和技巧

学习方法课前—预习,带着问题来听课课堂—认真听讲,积极发言,重在理解课后—总结方法,多读程序,重视编程实践课程考核方法期终考试(笔试闭卷)平时成绩(平时统计)作业+平时实验+实验报告上机+提问+表现第2章

程序设计基础主要内容计算机程序的基本结构程序设计的基本元素程序设计基本方法与技术程序设计的原则与风格2.1计算机程序的基本结构程序结构文件结构函数结构1.程序结构2.文件结构源程序文件一般包括:程序说明部分编译预处理命令外部变量定义、声明等函数定义

程序说明部分在程序的开头部分放置一些说明信息,这些信息可以包括开发环境、程序的开发者、开发时间、许可信息、更新历史,程序的简要功能逻辑结构,所调用的函数库的名称和版本,变量的命名方式等等

编译预处理以#开头的命令,C编译系统对程序进行正常的编译之前,先对这些特殊的命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码C提供的预处理功能:宏、文件包含、条件编译编译预处理命令一般位于程序的开头,每行只能写一条预处理命令宏定义不带参数的宏定义:#define宏名宏体#definePI3.1416带参数的宏定义:#define宏名(参数表)宏体#defineMAX(x,y)x>y?x:y终止宏定义的作用域:#undef(宏名)#undef(PI)文件包含是指一个源文件可以将另一个源文件的全部内容包含进来两种文件包含形式:#include<文件名>#include“文件名”把指定的文件内容嵌入到另一个文件中通常把一些常数和宏定义编写成.h文件,并用#include命令放置到任何需要的源文件中条件编译对源程序中某一部分内容只在满足一定条件时才进行编译#if常量表达式

程序段1[#else

程序段2]#endif#if常量表达式1

程序段1#elif常量表达式2

程序段2#else

程序段3#endif#ifdef标识符

程序段1[#else

程序段2]#endif#ifndef标识符

程序段1

[#else

程序段2]#endif#include<stdio.h>#defineFLAG1intmain(){intn;#ifFLAGn=1;printf("FLAGhasbeendefined,thevalueofnis%d.\n",n);#elsen=0;printf("FLAGhasnotbeendefined,thevalueofnis%d.\n",n);#endifreturn0;}

外部变量定义、声明在文件中、所有函数之外,进行全局变量的定义或声明。如果是在程序开头、函数之前进行定义或声明,则该变量在定义或声明点之后到整个源程序文件的结束处均有效,否则从定义或声明点到本文件结束有效定义指的是从无到有确立该变量且按该变量的类型分配相应大小的存储空间,而声明则用于提供类型信息,是指该变量已在别处定义过,如果希望在本文件中利用该变量无需专门定义,只要在程序中进行“说明”以通知编译系统

函数定义即确立函数的功能函数定义主要说明函数的名字、信息的传递方式,在函数中用到的局部变量,以及通过顺序、选择和循环等控制结构实现的不同操作等3.函数结构函数首部{

定义及声明部分

执行部分//由基本语句或控制语句组成}执行部分:三种基本结构(1)只有一入口、一个出口(2)结构内的每一部分都有机会被执行到(3)结构内不存在”死循环”(无终止的循环)

顺序结构顺序结构:由语句序列组成,程序执行时,按照从上而下顺序,一条一条地顺序执行流程图N-S图选择结构:根据一定的条件决定执行哪一部分的语句序列N-S图流程图循环结构:使同一个语句组根据一定的条件执行若干次直到型(until型)循环当型(while型)循环流程图N-S图小结:由三种基本结构组成的程序结构,可以解决任何复杂的问题由基本结构所构成的程序属于“结构化”程序,它不存在无规律的转向,只在本结构内才允许存在分支和向前或向后的跳转例:中国古代数学“鸡兔同笼”问题“今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何”1.分析问题

分析问题需要明确输入,也就是要处理的数据;明确输出,也就是结果;解决方案的任何附加要求或约束条件

问题输入:总头数a,总脚数b问题输出:鸡数x和兔数y关系公式:x+y=a 2×x+4×y=b

推导公式:

y=(b-2×a)

2

x=a-y2.设计算法鸡兔同笼问题假设:a代表总头数,b代表总脚数,x鸡数,y兔数3.编写程序/*文件名:鸡兔.c主要功能:计算鸡兔数

*/

#include<stdio.h>//包含头文件inta,b,x,y;

//定义4个外部变量voidmain(){//主函数

Input_jitu();

y=(b-2*a)/2;//计算兔子数

x=a-y;//计算鸡数

Output_jitu();

//输出结果}#include<stdio.h>//鸡兔input.cexterninta,b;voidInput_jitu(){printf("Head(a)andfootnumbers(b):");scanf("%d%d",&a,&b);//输入数据}#include<stdio.h>

//鸡兔Output.cexternintx,y;voidOutput_jitu(){printf("鸡:%3d兔:%3d\n",x,y);//输出结果}4.调试运行2.2程序设计的基本元素(1)标识符(2)常量、变量(3)运算符(4)表达式(5)语句(6)注释(1)标识符命名规则字母(a~z、A~Z)、数字(0~9)、下划线(_)组成,且必须由字母或下划线开头不能把C语言的关键字(如if、for、while)作为标识符对大小写敏感应“见名知意”(2)常量、变量常量在程序运行过程中值不能被改变的量。例如:整型常量:如12345,023,0x12,-345,3L实型常量十进制小数形式:如0.34,-56.79,0.0,3.1415f指数形式:如12.34e3(代表12.34

103)字符常量:如‘?’转义字符:如‘\n’,‘\r’’,‘\a’字符串常量:如

“Shanghai”符号常量:#definePI3.14159265变量

用以存储数据,且在程序运行期间值可以改变的量

例如:floatf=123.45;变量的属性名称数据类型存储位置值作用域生存期ffloat123.450x0013ff7c变量的定义

变量必须先定义,后使用;定义变量时指定该变量的名字(符合标识符的命名规则)和类型数据类型变量表floatf;//以华氏度表示的温度

floatc;//以摄氏度表示的温度定义通常放在函数起始处,在任何可执行语句之前变量的初值—随机值变量的初始化floatf=32;floatf,c;//VC++6.0#include<stdio.h>intmain(){intx;floaty;charz;printf("x=%d,y=%f,z=%c\n",x,y,z);return0;}变量的操作将数据存入变量:f=32;取得变量中保存的值:c=5.0/9*(f-32);求变量的地址(指针):&f变量名实际上是以一个名字代表的一个存储地址从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据

32.0f&f

0x0013ff7c(3)运算符C运算符(34个)1)算术运算符

(+-*/%++

--)2)赋值运算符

(=及其扩展赋值运算符)3)强制类型转换运算符

(类型))4)关系运算符

(>

<

==

>=

<=

!=)5)逻辑运算符

(!&&

||)6)位运算符

(<<>>~|∧

&)7)条件运算符

?:

)如:a=3<5?3:58)逗号运算符

(,)9)指针运算符

(*和&)10)求字节数运算符

(sizeof)11)成员运算符

(.

->)12)下标运算符

([])13)其他

(如函数调用运算符())

说明:对于“/”运算符,如果两个操作数都为整数,执行整数的除法。而只要除数和被除数中有浮点数,执行的就是浮点数的除法运算符“%”的两个操作数必须为整数,结果为整除之后的余数。不允许出现浮点型,余数正负取决于被除数正负位运算的操作数必须是整数逻辑运算具有截断特性:“&&”左边为假时,右边不再向后计算;“||”左边为真时,右边不再向后计算

运算符的优先级和结合性混合运算中谁先谁后由优先级确定同等优先级下,从左向右计算还是从右向左计算由结合性确定不同类型数据间的混合运算:1)+、-、*、/运算的两个数中有一个数为float或double型,结果是double型。系统将float型数据都先转换为double型,然后进行运算2)如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型3)字符型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算(4)表达式

用运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C的表达式1)算术表达式2)赋值表达式3)关系表达式4)逻辑表达式5)位运算表达式6)逗号表达式7)条件表达式(5)语句程序的主体部分是由语句组成的,程序的功能也是由执行语句实现的;语句也是函数的组成单位。语句的标志是分号1)控制语句:if、switch、for、while、do…while、continue、break、return、goto等2)函数调用语句3)表达式语句4)复合语句5)空语句(6)注释注释是程序设计中一项非常重要的内容。程序中常用的注释内容1)程序的名称2)程序的功能3)程序的设计思路与特点4)编程人及其合作者5)程序的编写时间、版本6)其他需要说明的信息C语言中注释的方法:(1)块注释/*注释内容,可以跨行书写*/(2)行注释//注释内容,不能跨行书写注:块注释不能嵌套,但块注释中可以嵌套行注释

例如,/*

//此处嵌入了行注释

*/2.3计算机程序设计基本方法与技术1.计算机程序设计方法结构化程序设计方法面向对象程序设计方法结构化程序设计方法面向过程的程序设计是一种以过程为中心的程序设计思想,它将解题的过程视为数据被加工处理的过程。程序易读、易懂、易于调试和维护、正确性能得到保证。但程序的可修改性和移植性差的缺点,如果解题过程发生变化,则一连串的步骤都得改动,工作量较大结构化程序设计是指程序的设计、编写及测试等都采用规定的组织形式进行,是一种以模块功能和过程设计为主的用于详细设计的基本原则面向对象程序设计方法将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的可复用性、灵活性和扩展性OOP方法建立在“对象”概念基础上、以对象为中心,以类和继承为构造机制,类通过一个简单的接口与外界发生关系,对象之间通过发送消息进行通信当采用面向过程方法时,若解题过程发生变化,则一连串的步骤都得改动,工作量较大。如果采用面向对象的方法,只要改动对象即可名称设计机理穷举技术划定范围、逐个验证嵌套技术内外有别、逐层推进缩减技术结构递归、规模递减二分技术有分有合、规模减半递归技术以退为进、以简御繁2.程序设计基本技术穷举技术EnumerationTechnique,也称枚举技术、暴力技术基本思想:

选定范围、逐个验证选定范围明确问题的解的范围,将所有可能解全部列举出来逐个验证根据约束条件逐个筛选满足条件的解模式:区间枚举、递增枚举适用于循环+判断结构

例:取一个值各位上的数字、求素数、因式分解…使用条件能够预先确定解的范围,并能以合适的方法列举能够对问题的约束条件进行精确描述性能特点比较直观,易于理解,正确性容易证明需要一一列举各种可能性,效率较低例:中国古代数学“鸡兔同笼”问题“今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何”(

《孙子算经》)#include<stdio.h>voidmain(){inti,j;for(i=0;i<=35;i++)for(j=0;j<=35;j++)if(i+j==35&&4*i+2*j==94)printf("\nRabbit=%dchichken=%d\n\n",i,j);}思考:百钱买百鸡“公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少?

)嵌套技术NestedTechnique基本思想:内外有别、逐层推进内外有别外层结构包含了对内层的调用或完整的内层结构,不会出现结构之间相互包含的情形逐层推进由外向内、先内后外性能特点自顶向下、逐步细化策略的实际应用应用于函数嵌套调用结构体类型的嵌套定义三种基本结构之间的相互嵌套…函数的嵌套调用C语言的函数定义是互相平行、独立的,即即函数不能嵌套定义,但可嵌套调用函数,即调用一个函数的过程中,又可调用另一个函数main函数①调用a函数⑨结束a函数③调用b函数⑦②⑧b函数⑤④⑥结构体类型的嵌套定义C语言中当定义结构体类型时,其中的成员又是一个结构体类型,或成员指向该种类型的指针structDate

{intmonth;

intday;intyear;

};structStu{intnum;charname[20];charsex;intage;

structDatebirthday;

charaddr[30];

};structstudent{intnum;intscore;structstudent*next;

//下一结点的地址};基本结构之间的相互嵌套是指结构化程序设计的三种基本结构中包含另外一个完整的结构,形成多层的结构缩减技术ReductionTechnique基本思想:结构递归、规模递减结构递归将问题加工成规模压缩了的同类问题,具有清晰的迭代递推结构规模递减每一步加工后的问题规模相比之前小1适用于递推、迭代等过程顺推

累加、累乘、多项式求值(秦九韶算法)、数列求和(斐波那契数列)…

逆推猴子吃桃、上台阶问题

迭代方程求根…for(i=1,sum=0;i<=100;i++)sum=sum+i;……for(i=1,prod=1;i<=10;i++)prod=prod*i;…#include<stdio.h>#include<math.h>voidmain(){intsign=1;doublepi=0,n=1,term=1;while(fabs(term)>=1e-6){pi=pi+term;n=n+2;sign=-sign;term=sign/n;}printf("pi=%10.8f\n",pi*4);}…floatf=0;for(i=0;i<=n;i++)f=f*x+a[i];…秦九韶算法#include<stdio.h>intmain(){inti,n=1;for(i=9;i>=1;i--)n=(n+1)*2;printf("Peach=%d\n",n);return0;}例:猴子吃桃问题“一只猴子摘了若干桃子,每天吃现有桃子的一半多一个,到第10天只有一个桃子,问桃子有多少个?二分技术BisectionTechnique基本思想:有分有合、规模减半分指一分为二,将问题规模压缩到原来的一半合是指将两部分的解合二为一,形成问题的整体解例:编程求解xn(n为正整数)如果n是偶数,则有xn=(xn/2)2;如果n是奇数,则有xn=x*xn-1#include<stdio.h>voidmain(){intn,nn;floatx,y,z;printf("Inputx,n:");scanf("%f%d",&x,&n);y=1;z=x;while(n>0)if(n%2==0){z=z*z;n=n/2;}else{y=y*z;n=n-1;}printf("%g^%d=%g\n",x,nn,y);}递归技术函数的递归调用:Recursion,在调用函数的过程中又出现直接或间接地调用该函数本身intfun(intx){inty,z;z=fun(y);return(2*z);}

fun函数调用fun函数直接调用本函数151fac(5)=5*fac(4)fac(4)=4*fac(3)fac(3)=3*fac(2)fac(2)=2*fac(1)fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120“递”阶段“归”阶段例基本思想:以退为进、以简驭繁以退为进向下传递:直接求解有困难,故先逐次向下传递,一直传递到“最简单”的操作(能方便完成的操作)向上回归:利用已知条件逐个返回替代未知一递一归,有去有回,正反融合,你中有我、我中有你以简驭繁以简单的递归公式替代原先复杂而抽象的计算把问题转换为规模缩小了的同类问题的子问题性能特点递归技术是分治策略的最好应用,以有限定义无限是一种比迭代循环更简单、更好用的结构,但时间复杂性和空间复杂性比循环结构高“递”环节需保护现场,开辟运行资源“归”环节需要回收资源占用大量的时间和空间,递归的深度受到限制必须有明确的递归结束条件适用于当问题需要“后进先出”的操作树的遍历、图的深度优先搜索、汉诺塔、八皇后…intfac(intn){intf;if(n<0)printf("n<0,error!");elseif(n==0||n==1)f=1;elsef=n*fac(n-1);return(f);}#include<stdio.h>intmain(){intfac(intn);inty,n=5;y=fac(n);printf("%d!=%d\n",n,y);return0;}#include<stdio.h>intmain(){intfac(intn);inty,n=100;y=fac(n);printf("1+2+…+%d!=%d\n",n,y);return0;}intfac(intn){intf;if(n<=0)printf("n<0,error!");elseif(n==1)f=1;elsef=n+fac(n-1);return(f);}2.4程序设计的原则与风格

</Test>。。。可读可维护安全可移植可测试

其它优秀的代码</>

新写代码缺陷修补特性扩展新人学习代码80%的时间被阅读命名规范注释规范头文件函数规范宏定义变量规范编程实践编程规范程序文档化原则

软件=程序+数据+文档标识符做到见名知义程序应适当加以注释视觉形式上简洁清晰程序构造原则提倡采用IPO结构进行程序的构造IPO结构是结构化程序设计中最基本、也是最重要的结构,最早由美国IBM公司提出,倡导每个程序都有一个统一的构架模式,即由数据的输入(Input)、处理(Processing)和输出(Output)三部分组成在一个程序中,I、P和O不是必须同时存在,但输出(O)则是程序的必备成分语句构造原则语句构造应该尽可能简单直观,不要一味为追求效率而使代码复杂化提高模块及语句的内聚性,减小语句的规模为了便于阅读和理解,尽量每行放置一个语句避免使用多分支语句、复杂的判定条件以及多重循环的嵌套数据说明原则数据说明顺序应规范,应易于理解便于查阅尽量不使用或少使用全局数据信息(变量),如果必须使用全局变量,应将其限定在尽可能小的作用域范围内,适当加注关键字static,禁止跨文件引用全局变量。不留未用变量在同一个语句中定义或声明多个变量时,一般按字典序排列对于复杂数据结构,应注释说明其功能、属性及结构特点输入输出原则输入操作步骤和输入格式尽量简单输入数据时应进行安全性检查(在屏幕上提供可选项或边界值),确保输入数据的合法及有效性,必要时回显输入数据内容,及时报告程序的状态信息及错误信息内容。并提倡使用数据或文件结束标志作为输入结束标志。输出清晰易懂,可采用数据表格化、图形化等多种输出方式追求效率原则应优先保证程序的正确性和健壮性,再提高程序效率效率能满足用户需求即可,不应以牺牲程序的清晰性和可读性来换取不必要的高效率追求效率(运行时间短、存储空间小)的目标达成,应通过选择优秀的设计方法、合理的数据结构算法来实现程序多平台支持随着芯片平台的增加,如x86,arm,RISC-V架构,如何做到一套源码支持多种架构?通常人工迁移过程中,有人工分析投入大、准确率低、整体效率低下等缺点。针对以上问题,鲲鹏开发套件DevKit提供迁移工具,用于程序源码的问题检测,通过该工具能够自动分析并输出指导报告;也解决了用户代码兼容性人工排查困难、迁移经验欠缺、反复依赖编译调错定位等痛点。迁移依赖库文件需移植源文件需迁移代码行数迁移工作量预估分析扫描源代码迁移openEuler、CentOS、等16+主流操作系统支持覆盖C/C++/Fortran/汇编Top10语言聚合管理160万so库,一键下载替换源代码修改建议一键修改程序多平台支持-平台相关宏介绍从平台兼容性角度看,例如,系统中的宏可分类为x86宏、ARM宏、x86和ARM都支持的宏、以及其它平台相关的宏,其中windows系统不支持x86宏,所以WIN32相关宏作为x86特殊宏进行处理,如果不属于这几种情况,则归属于未定义宏。平台宏举例ARM平台宏x86平台宏ARM和x86都支持Other__arm____amd64____STDC_HOSTED____alpha____thumb____WIN32____INT64_TYPE____370____ARM_ARCH_4T____k8___LP64__mips__aarch64____SSE2____WCHAR_MAX____MIPS___ARM__x86_64____WINT_TYPE____s390__程序思维在本质上是计算机的思维,建立程序思维意识对于程序设计非常重要程序设计过程中要遵守基本规范凡事三思而后行,讲究方式方法,灵活运用程序设计技术和相关原则,切忌墨守成规程序设计要富有创新精神,善于变通第

3

程序设计的数据基础主要内容3.1数据类型的概念3.2C语言中的数据类型3.3C语言中数据的组织与处理基础3.1数据类型的概念不同数据间的相互运算,在机器内部的执行方式是不一样的。这就要用户先定义数据的特性再进行操作,这里的特性也就是数据类型。数据类型是编程语言中为对数据进行描述而定义的定义数据类型是为了把数据分成所需内存大小不同的数据,以便充分利用内存不同的类型分配不同的长度和存储形式。因此,数据类型就是对数据分配存储单元的安排,包括数据的存储形式以及编译系统为其分配的存储单元的长度(字节)综上,数据类型是一个值的集合以及定义在这个值集上的一组操作数据类型与程序的可移植性数据类型与计算机系统结构密不可分16、32位编译器:int、short型变量分配2个字节空间64位编译器:short2个字节,int型变量分配4个字节空间int型变量a,若a=60000,在64位的机器上是没问题的,但是当运行在16或32位的机器上时就会出错为增加程序的可移植性,定义变量时需斟酌尽量使用标准库函数尽可能使程序适用于所有的编译器必要时使用#ifdef指令将不可移植的代码分离出来数据类型与计算精度数据类型决定变量存储空间的大小数据类型决定变量的取值范围

#include<stdio.h>voidmain(){shortinta=32767,b;b=a+1;printf("a=%db=%d\n",a,b);}01111111111111111000000000000000变量a、a+1在内存中的存储方式数据类型决定数据的存储方式及运算种类不同类型数据的存储方式不同,数据类型对应具体的存储方式对不同类型的数据,能够实施的运算种类不同不同类型数据的有效数字不同为减少舍入误差,保证数据的准确性,在定义变量时需要仔细考虑变量的数据类型C语言中,单精度浮点型数据(float)有6~7位有效数字,双精度浮点型数据(double)有15~16位有效数字,longdouble则有18~19位有效数字3.2C语言中的数据类型3.3C语言中数据的组织与处理基础3.3.1基本类型数据的组织与处理3.3.2构造类型数据的组织与处理3.3.1基本类型数据的组织与处理序号类型名含义字节数取值范围1[signed]int有符号基本整型4-231~(231-1),即-2147483648~21474836472[signed]short[int]有符号短整型2-215~(215-1),即-32768~327673[signed]long[int]有符号长整型4-231~(231-1),即-2147483648~21474836474[signed]longlong[int]有符号双长整型8-263~(263-1),即-9223372036854775808~92233720368547758075unsignedint无符号基本整型40~(232-1),即0~42949672956unsignedshort[int]无符号短整型20~(216-1),即0~655357unsignedlong[int]无符号长整型40~(232-1),即0~42949672958unsignedlonglong[int]无符号双长整型80~(264-1),即0~184467440737095516159[signed]char有符号字符型1-27~(27-1),即-128~12710unsignedchar无符号字符型10~(28-1),即0~25511float单精度浮点型4-3.402823×1038~-1.175494×10-38,0,1.175494×10-38~3.402823×103812double双精度浮点型8-1.797693×10308~-2.225074×10-308,0,2.225074×10-308~1.797693×1030813longdouble长双精度浮点型8、12或16-1.1×104932~-3.4×10-4932,0,3.4×10-4932~1.1×1049321.整型数据的表示三种表现形式:十进制整数:正、负号,0~9,首位不是0例:10,123八进制整数:正、负号,0~7,首位是0例:010,0123十六进制整数:正、负号,0~9,a~f,A~F,前缀是0x,或0X例:0x10,0X123-0xB123→1111011(2)→0173(8)→0x7B(16)基本类型数据的表示与存储

思考:

inta=-0x12;printf("十进制:%d八进制:%o十六进制:%x\n",a,a,a);2.字符型数据字符是按其代码(整数)形式存储的C99把字符型数据作为整数类型的一种C语言中,字符型数据采用了ASCII字符集ASCII码表转义字符字符‘3’和整数3字符‘3’只是代表一个形状为‘3’的符号,在需要时按原样输出,在内存中以ASCII码(51)形式存储,占1个字节整数3是以整数存储方式(二进制补码方式)存储的,占2个或4个字节001100110000000000000011

字符变量

用类型符char定义字符变量charch=‘?’;

系统把“?”的ASCII代码63赋给变量chprintf(“%d%c\n”,ch,ch);输出结果是:3.浮点型数据单精度浮点型

float双精度浮点型double长双精度型

longdoublefloat、double类型数据的存储结构数据精度和取值范围数据精度与取值范围是两个不同的概念:floatx=1234567.89;//虽在取值范围内,但无法精确表达floaty=1.2e55;

//表示无穷大(infinity的缩写)//y的精度要求不高,但超出取值范围不是所有浮点数都能在机器中精确表示浮点型常量浮点数的表示浮点表示法:0.123123.412..12科学计数法:1.23E-41.2e+31E-2浮点数的类型

计算机中的浮点数都是double型,C编译系统把浮点型常量按双精度处理基本类型数据的输入输出所谓输入输出是以计算机主机为主体而言的从计算机向输出设备(如显示器、打印机等)传输数据称为输出从输入设备(如键盘、磁盘、光盘、扫描仪等)向计算机传输数据称为输入输入和输出操作是由库函数来实现的printf和scanf是C语言的库函数的名字,用这两个函数时,必须指定其格式getchar、putchar、gets、puts在使用输入输出函数时,要在程序文件的开头用预编译指令

#include<stdio.h>或

#include″stdio.h″

#include<string.h>printf函数的一般格式printf(″格式控制字符串″,输出表列);%[标志][宽度][.精度][类型长度]类型控制符printf函数printf(″格式控制字符串″,输出表列);例如:printf(″i=%d,c=%c\n″,i,c);普通字符可以是常量、变量或表达式输出格式常用格式字符常用的类型控制符标志符d格式符。输出有符号的十进制整数可指定输出数据的域宽printf(“|%5d%5d|\n”,12,-345);%d输出int型数据%ld输出long型数据c格式符。用来输出一个字符charch='a';printf("%c--%5c",ch,ch);s格式符。用来输出一个字符串

printf("%s","CHINA");

f格式符。用来以小数形式输出doublea=10;printf("%f\n",a/7);用%m.nf指定数据宽度和小数位数printf("%15.13f\n",a/7);printf("%.0f\n",1000/7.0);用%-m.nf使输出的数据向左对齐

printf("|%-10.3f|\n",1000/8.0);e格式符。指定以指数形式输出实数%e//VC++中小数位数为6位,指数部分占5列//小数点前必须有而且只有1位非零数字printf("%e",12.345);%m.neprintf("%11.2e",12.345);scanf函数scanf函数的一般形式scanf("格式控制字符串",地址表列);scanf("%c%d%f",&x,&y,&z);含义同printf函数可以是变量的地址,或字符串的首地址使用scanf函数时应注意的问题scanf("%d%d%d",a,b,c);scanf("%d%d%d",&a,&b,&c);scanf("x=%c,y=%d,z=%f",&x,&y,&z);

a12↙

x=ay=1z=2↙

x=a,y=1,z=2↙

scanf(“%c%c%c”,&c1,&c2,&c3);

ABC↙

ABC↙

字符数据的输入输出用getchar函数输入一个字符向计算机输入一个字符一般形式:c=getchar();用putchar函数输出一个字符从计算机向显示器输出一个字符一般形式:

putchar(c);或putchar('A');字符串数据的输入输出头文件string.h用gets函数输入一串字符向计算机输入一串字符一般形式:

gets(s);//s为字符数组名用puts函数输出一串字符从计算机向显示器输出一串字符一般形式:

puts(s);或puts("Shanghai");批量数据的组织与处理混合数据的组织与处理动态数据的组织与处理磁盘数据的组织与处理3.3.2构造类型数据的组织与处理1.批量数据的组织与处理存放一个数据:1个变量存放100个相同类型的数据:100个变量?结论:基本数据类型已无法满足需要,需利用构造数据类型之一:数组数组是变量的一个有序集合,其中所有变量(数组元素)具有同一类型。数组可以表示向量、矩阵、一行文字…数组元素类型称为数组的基础类型:可以是任意类型(基本类型、结构体/共用体类型、指针类型、数组类型…)认识数组数组类型的构造方法:把固定数目的数据顺序排成一个表格,每个数据是元素类型的一个值。所有元素值顺序排成的表示数组类型的一个值数组类型的每个元素都有一个唯一的编号:称为“下标”用数组名和下标区分不同的数组元素如果数组元素又是一个数组,则该数组称为多维数组多维数组用数组名和多个下标区分不同的元素访问数组元素遍历数组删除一个数组元素增加一个数组元素数组的操作C语言中的数组例:inta[5];19734-517967

内存用户数据区0x61fe000x61fe040x61fe080x61fe0c0x61fe1001234a数组元素数组名:地址常量,表示数组首地址。下标偏移量内存地址例:将一任意十进制数转换成三进制并输出分析:

用整除3求余法:1)十进制数整除3得到的余数就是对应的三进制数的最低位,得到的商所对应的三进制数,恰好等于原三进制数去掉最低位后的剩余部分;2)再用上述方法可得到三进制数的次低位;3)反复上述过程即可得到三进制数的所有位。

三进制的各位数字用数组存放。#include<stdio.h>intmain(){inti=0,x,d[20];scanf("%d",&x);while(x>0){

d[i++]=x%3; x=x/3;}for(i--;i>=0;i--)pr

温馨提示

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

评论

0/150

提交评论