版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章
C语言入门与开发环境配置走进C语言世界:从代码到运行目录CONTENTS01程序设计与程序设计语言02C语言的发展及其特点03简单的C语言程序04C语言程序的结构和运行过程05词法记号06开发环境搭建07调试与容器化08本章小结问题导入通义灵码实现功能“打印10个*号”时,反复出现语法错误却找不到原因,通义灵码(AI编程助手)能帮我们做什么?VSCode的调试功能又如何一步步定位“累加和结果不正确”等问题?Docker为什么在自己电脑上编译通过的“打印‘欢迎学习C语言!’”程序,拷贝到实验室电脑后却提示“编译环境缺失?”如何通过Docker快速搭建一套“无论在哪台电脑都能直接用”的C语言开发环境?01程序设计与程序设计语言程序设计的基本概念问题分析明确问题需求,确定输入输出及约束条件,如计算1到100累加和,输入为范围,输出为总和,需保证逻辑正确。基本概念程序设计(Programming)是指通过规划、设计和编写指令序列,让计算机按预定逻辑解决特定问题的过程。简单来说,就是“教计算机做事”的方法。编码实现用程序设计语言将算法转化为代码,遵循语法规则,如用C语言实现累加算法。测试优化运行程序验证结果,修改逻辑漏洞、优化性能,直至满足需求。算法设计将问题分解为可执行步骤,如累加算法从1开始依次加到100,记录总和,是程序的‘灵魂’。核心目标:将人类解决问题的思路转化为计算机可执行的步骤。关键阶段
程序设计语言的发展机器语言由二进制指令(0和1)组成,执行效率高,但可读性极差,依赖硬件架构,直接编写几乎不可能。汇编语言用助记符(如ADD表示加法、MOV表示数据移动)替代二进制指令,保留机器语言高效性,但代码与硬件绑定,可移植性差。高级语言接近自然语言,语法直观,可读性和可移植性强,C语言是其中经典,兼顾高效性与灵活性。人与计算机沟通的“桥梁”:程序设计语言经历了从低级到高级的演进,可分为三大类:ADDA,B表示“将A和B的值相加”。某计算机用“10001001”
表示“加法操作”。用sum=a+b即可表示加法,无需关注计算机底层如何实现。02C语言的发展及其特点从B到C:UNIX催生的瑞士军刀C语言诞生背景1972年,丹尼斯·里奇为移植UNIX操作系统,在贝尔实验室基于B语言设计出C语言。C语言设计目标保留指针、简洁关键字、直接映射硬件等特性,实现‘一次编写、多平台运行’。C的五大核心特征简洁高效,贴近硬件仅32个关键字,编写的代码紧凑直观,执行效率极高,接近汇编语言。底层控制支持指针操作,可直接访问内存地址,实现对底层硬件的精细控制。跨平台兼容
通过ANSIC等标准规范,C代码在不同硬件和操作系统上可编译运行。结构化编程支持顺序、分支、循环等基本控制结构,使程序逻辑清晰、可读性强。功能灵活
可通过标准库和第三方库扩展强大功能,应用领域广泛。03简单的C语言程序简单的C语言程序1欢迎学习C语言预处理指令#include<stdio.h>引入标准输入输出库,让程序能使用printf等函数。#include<stdio.h>//引入输入输出工具库intmain()//程序的入口,类似任务的开头{printf("欢迎学习C语言!");//输出内容,类似具体任务return0;//表示程序正常结束,类似任务完成的信号}输出语句printf("Hello,World!");完成输出功能。程序结束return0;向操作系统报告程序正常结束。主函数intmain()是程序的唯一入口,程序从这里开始执行。运行结果:2矩形面积计算变量定义floatlength,width,area;定义存储长、宽、面积的变量。输入与计算scanf读取用户输入,通过表达式计算结果。输出printf语句输出结果。#include<stdio.h>intmain(){floatlength,width,area;//定义存储长、宽、面积的变量printf("请输入矩形的长:");scanf("%f",&length);//接收用户输入的长printf("请输入矩形的宽:");scanf("%f",&width);//接收用户输入的宽area=length*width;//计算面积printf("矩形的面积为:%f\n",area);//输出面积return0;}运行结果:3分支结构变量定义intnum;定义一个整数变量。输入scanf读取用户输入。条件结构if...elseif...else语句。#include<stdio.h>intmain(){intnum;//定义一个整数变量printf("请输入一个整数:");scanf("%d",&num);//接收用户输入的整数if(num>0){printf("%d是正数\n",num);}elseif(num<0){printf("%d是负数\n",num);}else{printf("%d是零\n",num);}return0;}运行结果:04C语言程序的结构和运行过程C语言程序的结构和运行过程C源程序五大组成部分预处理指令以#开头,用于在编译前对源代码进行处理。主函数(main函数)每个C语言程序有且仅有一个main函数,其格式为intmain()。变量定义
变量就像一个个存储数据的容器,需要指定数据类型(如int表示整数、float表示浮点数)和变量名(如num、length)语句完成具体操作的指令,包括输入输出语句、运算语句、控制语句等。注释
以//(单行注释)或/**/(多行注释)开头,用于对程序代码进行解释说明,方便他人阅读和理解代码,注释内容不会被计算机执行。#include<stdio.h>,其作用是引入标准输入输出库,让程序能够使用printf、scanf等输入输出函数。程序的“指挥中心”函数是C语言程序的主要组成部分程序模块化与编译过程将程序分成多个模块,每个模块通常包含一个或多个相关的函数。每个模块会被写成一个独立的源文件(例如.c文件)。在编译过程中,每个源文件会被单独编译成目标文件(.o或.obj文件),然后通过链接器将这些目标文件链接成一个最终的可执行程序。函数的构成函数首部:是函数的第一行,包含返回类型、函数名称和参数列表。函数体:包含函数的具体操作,通常由一对大括号{}包围。
函数体分为声明部分和执行部分。声明部分:执行部分:returna+b;intadd(inta,intb);intnum1,num2,result;函数是C语言程序的主要组成部分main函数与程序执行一个程序只能有一个main函数。main函数的声明通常如下:即使main函数可以出现在文件的任意位置,但它始终是程序的入口点,程序从这里开始执行。intmain(void)//或intmain(),两者都可以源文件到可执行四步曲C程序的运行过程3连接链接器将目标文件与库文件组合,生成可执行文件。2编译编译器将.c文件转化为目标文件,包含预处理、编译、汇编三个子阶段。4执行操作系统加载可执行文件到内存,CPU执行指令完成程序功能。1编辑用文本编辑器编写C源代码,生成.c文件。工具:Dev-C++、VSCode、记事本、Vim等文本编辑工具。核心任务:由编译器将.c源文件转化为机器可识别的二进制目标文件(通常以.o或.obj为扩展名)。核心任务:由链接器(Linker)将多个目标文件(.o)和所需的库文件(如C标准库)组合。CompilerExplorer查看汇编指令CompilerExplorer是一款实用的在线编程工具,它能实时将C代码转换为对应的汇编指令,帮助我们直观地跟踪代码运行的底层细节。工具特点与优势
实时转换输入C代码后,工具会立即显示对应的汇编指令。多编译器支持可选择不同版本的GCC、Clang等编译器,对比不同编译选项对汇编代码的影响。代码关联汇编指令与C源代码逐行对应,便于跟踪代码执行逻辑。轻量便捷无需配置本地开发环境,通过浏览器即可使用。01030204CompilerExplorer查看汇编指令如何使用CompilerExplorer理解变量存储
#include<stdio.h>intmain(){inta=10;intb=20;intc=a+b;printf("c=%d\n",c);return0;}示例:通过工具观察变量在内存中的存储方式。.LC0:
.string"c=%d\n"main:
push
rbp
mov
rbp,rsp
sub
rsp,16
mov
DWORDPTR[rbp-4],10
mov
DWORDPTR[rbp-8],20
mov
edx,DWORDPTR[rbp-4]
mov
eax,DWORDPTR[rbp-8]
add
eax,edx
mov
DWORDPTR[rbp-12],eax
mov
eax,DWORDPTR[rbp-12]
mov
esi,eax
mov
edi,OFFSETFLAT:.LC0
mov
eax,0
call
printf
mov
eax,0
leave
ret汇编指令在CompilerExplorer中选择GCC编译器(如x86-64gcc15.2),会生成类似右边的汇编指令(简化版)。变量abc被存储在栈内存中,通过栈基址寄存器rbp的偏移量(-4-8-12)定位,这与“数据在计算机中的存储方式”中栈内存的动态分配特性完全一致。CompilerExplorer查看汇编指令如何使用CompilerExplorer理解函数调用栈
#include<stdio.h>intadd(intx,inty){returnx+y;}intmain(){inta=5;intb=3;intsum=add(a,b);printf("sum=%d\n",sum);return0;}示例:使用CompilerExplorer理解函数调用栈。CompilerExplorer查看汇编指令对应的汇编指令(简化版)展示了函数调用栈的工作过程。
add(int,int):
push
rbp
mov
rbp,rsp
mov
DWORDPTR[rbp-4],edi
mov
DWORDPTR[rbp-8],esi
mov
edx,DWORDPTR[rbp-4]
mov
eax,DWORDPTR[rbp-8]
add
eax,edx
pop
rbp
ret.LC0:
.string"sum=%d\n"main:
push
rbp
mov
rbp,rsp
sub
rsp,16;变量a入栈
mov
DWORDPTR[rbp-4],5
;变量b入栈
mov
DWORDPTR[rbp-8],3;传递参数b
mov
edx,DWORDPTR[rbp-8]
;传递参数a
mov
eax,DWORDPTR[rbp-4]
mov
esi,edx
mov
edi,eax
;调用add函数,压入返回地址call
add(int,int)
;存储返回值到summov
DWORDPTR[rbp-12],eax
mov
eax,DWORDPTR[rbp-12]
mov
esi,eax
mov
edi,OFFSETFLAT:.LC0
mov
eax,0
call
printf
mov
eax,0
leave
ret调用add函数前,参数a、b通过寄存器传递到栈中;call指令执行时,将下一条指令的地址(返回地址)压入栈;add函数内部通过rbp偏移量访问参数,执行完成后通过ret指令弹出返回地址,回到main函数继续执行。【汇编指令】05词法记号C源代码的六大词法单元01标识符用于给变量、函数等命名,由字母、数字和下划线组成,必须以字母或下划线开头。02关键字C语言预先定义的保留字,具有特定语法含义,如int、if等。03常量程序中直接出现的固定值,包括整数、浮点数、字符和字符串。04运算符用于表示运算关系,如+、-、*、/等。05分隔符用于分隔代码中的不同元素,如括号、分号等。06空白符包括空格、制表符、换行符等,主要用于分隔其他词法记号。06开发环境搭建Dev-C++的安装与使用Dev-C++的安装与使用下载安装:访问官方渠道下载Dev-C++,运行安装程序完成安装。选择安装语言许可证协议选择组件选择安装位置安装进度安装完成Dev-C++的安装与使用初次配置选择语言选择主题配置成功Dev-C++界面VSCode的安装与使用VSCode的安装与使用下载安装:访问官方渠道下载VSCode,运行安装程序完成安装。许可协议选择目标位置选择开始菜单文件夹选择附加任务界面正在安装界面安装完成VSCode的安装与使用配置编译器为了编译C语言程序,你需要安装一个C编译器。这里是在Windows上安装MinGW。配置环境变量新建环境变量(1)下载MinGW并安装访问官方渠道下载MinGW,也可以从本书软件资源中得到已经下载好的文件“mingw64.rar”,解压文件“mingw64.rar”即可使用(2)在系统环境变量中添加MinGW的bin目录到PATH。VSCode的安装与使用安装C/C++扩展:VSCode的强大之处在于其丰富的扩展生态系统。对于C语言开发,你需要安装Microsoft提供的C/C++扩展。安装C/C++扩展打开VSCode,转到侧边栏的扩展视图,在搜索框中输入
C++,然后从搜索结果中选择由Microsoft提供的C/C++扩展,点击“安装”按钮。使用VSCode创建和编译程序创建和编写C文件创建和编写C文件运行图标选择调试配置运行结果1234安装AI大模型编程助手:通义灵码(Lingma)01安装与登录在VSCode中安装通义灵码扩展,登录阿里云账号。安装通义灵码成功登录通义灵码(Lingma)安装AI大模型编程助手:通义灵码(Lingma)02生成代码在VSCode中安装通义灵码扩展,登录阿里云账号。通义灵码辅助编程(1)通义灵码辅助编程(2)安装AI大模型编程助手:通义灵码(Lingma)02生成代码复制AI大模型生成的参考代码,运行后即可完成操作。通义灵码生成的代码
通义灵码查找错误安装AI大模型编程助手:通义灵码(Lingma)03优化
借助通义灵码优化代码,修复语法错误,提升编程效率。通义灵码的优化代码功能VSCode工具汉化为便于操作,可通过安装Chinese(Simplified)插件对开发工具进行汉化。安装成功后,点击右下角弹出的对话框按钮“ChangeLanguageandRestart”,重启VSCode后,界即可变成中文状态。重启VSCode完成工具汉化生效07调试与容器化使用VSCode自带调试功能追踪程序运行配置调试环境点击左侧导航栏的“运行和调试”图标(形似小虫子的图标),或使用快捷键Ctrl+Shift+D打开调试面板。使用VSCode自带调试功能追踪程序运行启动调试会话点击左侧导航栏的“运行和调试”图标(形似小虫子的图标),或使用快捷键Ctrl+Shift+D打开调试面板。使用VSCode自带调试功能追踪程序运行程序运行控制调试过程中,可通过调试工具栏或快捷键控制程序运行。变量与监视面板调试面板中默认显示“变量”面板,会自动列出当前作用域内的局部变量、函数参数、全局变量等若需要重点关注某个变量或表达式的变化,可在“监视”面板中点击“+”号,输入变量名或表达式(如a+b),面板会持续显示该变量或表达式的值调试功能的核心组件使用使用VSCode自带调试功能追踪程序运行调用栈面板(CallStack)调用栈面板展示了当前程序执行的函数调用层级关系,最顶部为当前正在执行的函数,下方依次为调用它的上级函数。调试功能的核心组件使用调试面板容器化开发环境配置容器化开发环境配置01为什么需要容器化开发Windows与Linux系统的编译器(如gcc)版本差异、库文件路径不同等问题,常导致“代码在本机能运行,换台电脑就报错”。Docker容器技术可将开发环境(编译器、调试工具、依赖库)打包成标准化镜像,实现"一次配置,跨平台运行"。02Docker安装步骤在Docker官网下载DockerDesktop安装包。安装DockerDesktop。容器化开发环境配置安装DockerDesktop配置DockerDesktop安装DockerDesktop的过程安装DockerDesktop成功首次启动DockerDesktop的界面选中推荐设置DockerDesktop欢迎界面容器化开发环境配置启动“DockerDesktopService”服务打开命令提示符测试Docker,输入“dockerversion”,如图所示,表示安装成功。容器化开发环境配置03在Windows系统中安装Ubuntu的步骤在Windows系统中,打开「命令提示符」(建议以管理员身份运行)。输入命令“wsl.exe--list--online”并回车,查看当前可安装的Ubuntu版本。容器化开发环境配置03在Windows系统中安装Ubuntu的步骤选择需要的版本进行安装。最后,输入命令ls/并回车,若能正常显示Linux文件系统的根目录内容,即表示安装成功。容器化开发环境配置04一键部署C语言开发环境(1)Dockerfile(定义环境镜像),文件名为“Dockerfile”,内容如下。#基于Ubuntu22.04构建(轻量且稳定)FROMubuntu:22.04#安装C语言开发工具(gcc编译器、gdb调试器、make构建工具)RUNapt-getupdate&&apt-getinstall-y\gcc\gdb\make\&&rm-rf/var/lib/apt/lists/*#清理缓存,减小镜像体积#设置工作目录(容器内的代码存放路径)WORKDIR/c_projects容器化开发环境配置04一键部署C语言开发环境(2)启动脚本(一键构建并运行容器)。Windows系统中创建文件start_env.bat,内容如下。@echooff#构建镜像(命名为c_dev,标签为v1)dockerbuild-tc_dev:v1.#运行容器(将本地当前目录挂载到容器的/c_projects,方便代码共享)dockerrun-it--rm-v%cd%:/c_projectsc_dev:v1/bin/bash容器化开发环境配置05使用容器开发C程序(1)启动环境。(2)编写与运行代码。#include<stdio.h>intmain(){printf("Hello,Docker!\n");return0;}在容器终端中编译运行。gcchello.c-ohello#编译hello#运行,输出:Hello,Docker!编译并运行C程序容器化开发环境配置05使用容器开发C程序(3)调试代码。
容器内支持gdb调试,例如:gcc-ghello.c-ohello#生成带调试信息的可执行文件gdbhello#启动调试器(按gdb常规命令操作)08本章小结三大核心01程序设计与C语言基础程序设计是将人类解决问题的逻辑转化为计算机可执行步骤的过程,包含问题分析、算法设计、编码实现、测试与优化四个核心阶段。程序设计语言历经机器语言、汇编语言到高级语言的演进,C语言是高级语言的经典代表。02C程序结构与运行机制03开发环境搭建与工具使用C语言程序具有清晰的模块化结构,由预处理指令、主函数、变量定义、执行语句及注释组成。函数包含函数首部和函数体。程序设计语言历经机器语言、汇编语言到高级语言的演进。Dev-C++:轻量级集成开发环境。VSCode:功能强大的跨平台编辑器,需完成编译器(MinGW)安装、环境变量配置、C/C++扩展添加三个核心步骤。容器化开发:实现“一次配置,跨平台运行”。感谢您的观看THANKYOUFORWATCHING汇报人:蒋亚平第2章
算法算法思维:从生活到代码目录CONTENTS算法的概念算法的表示结构化程序设计方法本章小结01020304问题导入算法的表示方法要给班级30名学生的C语言成绩排序(从高到低),你能想到哪些办法?用“口头描述”“画图”“简单代码片段”三种方式分别怎么表达你的思路?这些不同的表达形式对应算法的哪几种表示方法?算法性能图书馆要从1000本图书中找到某本指定ISBN的书,“逐本翻找”和“按书架编号定位”哪种更快?这两种方式的差异,其实对应了算法的什么核心属性?01算法的概念算法的概念算法的定义算法是解决特定问题的一系列明确且有序的步骤,它指导计算机完成任务。无论是简单的数值计算还是复杂的人工智能应用,其核心都是由精心设计的算法构成。算法与生活的联系生活中,许多事情的完成都遵循着固定且有序的流程,如看电影、家常炒菜、排队买咖啡等。这些流程都可以抽象为算法,体现了算法的普遍性和实用性。算法的多样性对于同一问题,往往存在多种不同的算法。例如计算1到100的和,可以用数学公式直接计算,也可以通过逐个累加的方式实现,但两者的效率差异显著。算法是解决问题的步骤010203特性的重要性通过泡茶的例子,我们可以看到算法的五大特性在实际应用中的重要性。这些特性帮助我们筛选出高质量的算法,确保算法能够正确、高效地解决问题。算法的五大特性算法必须满足有穷性、确定性、可行性、输入和输出五大特性。这些特性确保算法能够在有限步骤内结束,每个步骤明确无歧义,且可通过有限操作实现。五大特性筛出好算法计算1到100的和加2克盐计算两个数的乘积烧开水→洗茶杯→放茶叶→冲开水→静置3分钟一直烧开水+违反了有穷性02算法的表示算法的表示五种算法表示自然语言流程图N-S图编程语言伪代码问题场景校园内有5个快递点(标记为A、B、C、D、E),各点之间的距离如图2-1所示(单位:米),虚线表示不可达。快递员从A点出发,需将包裹送到其他4个点,求从A到每个目标点的最短路径及距离。自然语言校园快递路径第一步,先把A到每个点的距离记下来;第二步,从还没确定最短距离的点里,选一个离A最近的点,标记为‘已确定’;第三步,用这个已确定点的距离,更新它到其他未确定点的距离;......自然语言的优势自然语言描述算法步骤的优点是简单直观,适合初步表达简单的算法逻辑。例如,校园快递路径规划问题可以用自然语言描述初始化、选点、松弛等步骤。自然语言的局限性自然语言描述算法容易产生歧义,对于复杂的逻辑,自然语言的描述可能不够精确,导致理解和执行的偏差。因此,对于复杂的算法,需要使用更精确的表示方法。自然语言流程图的基本符号流程图使用椭圆表示开始或结束,菱形表示判断条件,矩形表示处理步骤,平行四边形表示输入或输出操作,箭头表示流程的方向。流程图:图形化控制流流程图符号连接点示例:判断一个数是否为偶数。流程图:图形化控制流示例:在100名学生中,统计成绩高于85分的学生人数,并输出该人数。流程图的优势流程图通过图形符号直观地展示算法的执行流程,便于理解和实现。它可以帮助我们清晰地表示算法的顺序、分支和循环结构。流程图:图形化控制流流程图的局限性当流程图中的流程线过多时,可能会导致图形复杂,可读性下降。此外,流程图的修改相对繁琐,不如其他表示方法灵活。N-S图:结构化无流线顺序结构选择结构多分支选择结构当型循环结构直到型循环结构三种基本结构:Bohra和Jacopini提出了顺序结构、选择结构和循环结构三种基本控制结构。N-S图:结构化无流线顺序结构选择结构循环结构N-S图表示算法:N-S图是一种结构化的算法表示工具,由美国学者I.Nassi和B.Shneiderman提出,因此得名。通过基本结构的顺序组合即可表达复杂的算法,因此,基本结构之间的流程线变得不再必要。N-S图正是为解决这一问题而设计的。N-S图:结构化无流线示例:判断素数:N-S流程图设计与实践。N-S图的特点N-S图取消了传统流程图中的流程线,通过矩形框等符号紧凑地组合在一起,更适合表示顺序、选择和循环这三种基本结构。N-S图:结构化无流线N-S图的优势和缺点优点:N-S图结构紧凑,无流程线混乱问题,强制使用结构化思想,适合初学者梳理逻辑。它可以帮助我们避免逻辑混乱,使算法结构更加清晰。缺点:不够灵活,如果算法有特别多的嵌套,框会越套越深,看起来有点拥挤。伪代码的定义伪代码是介于自然语言和编程语言之间的算法描述方式,它不严格遵守语法规则,但保留了编程语言的结构化关键词,如IF、WHILE等。伪代码的优势伪代码是一种灵活易懂的算法表示方法,无需关注语法细节,能快速表达算法核心逻辑,适合团队沟通或前期设计。伪代码的局限性伪代码无法直接运行,必须转化为编程语言才能执行。因此,在设计算法时,伪代码是将逻辑转化为可运行程序的重要过渡工具。伪代码:自然到代码的桥梁伪代码:自然到代码的桥梁begin result=1 i=2 whilei≤10 { result=result*i i=i+1 } printresultendbeginn=9 w=0 i=2 whilei≤nandw==0 { result=n%i ifresult==0 w=1 else i=i+1 } ifw==0 print"n是素数" else print"n不是素数"end示例:计算10的阶乘(10!)。示例:判断素数伪代码:自然到代码的桥梁begin//初始化
距离矩阵dist[5][5]={ {0,10,20,INF,INF},//A到各点的距离
{10,0,5,15,INF},//B到各点的距离
{20,5,0,INF,30},//C到各点的距离
{INF,15,INF,0,5},//D到各点的距离
{INF,INF,30,5,0}//E到各点的距离
};
起点=A
最短距离数组shortest[]={0,无穷大,无穷大,无穷大,无穷大}//索引对应A,B,C,D,E
路径记录数组path[]={"A","","","",""}//记录每个点的最短路径
已确定标记数组visited[]={true,false,false,false,false}//A初始为已确定示例:校园快递路径规划伪代码。//循环while未确定的点数量>0{
从visited[i]==false的点中,找到shortest[i]最小的点P
标记visited[P]=true
对每个点Q(Q≠P且visited[Q]=false):
若shortest[P]+dist[P][Q]<shortest[Q]:
shortest[Q]=shortest[P]+dist[P][Q]path[Q]=path[P]+"→"+Q}//输出
对每个点Q:
打印“从A到Q的最短距离:shortest[Q]米,路径:path[Q]”end编程语言:算法的最终落地编程语言:是算法的“最终实现形式”,它严格遵守语法规则,能被计算机直接执行。示例:用C语言实现图书馆借书算法。#include<stdio.h>#include<string.h>//模拟数据:借书证是否有效(1=有效)、图书状态(1=可借)、当前借阅数量intisCardValid=1;intbookStatus=1;intborrowCount=3;intmain(){charcardID[20],isbn[20];printf("请输入借书证号:");scanf("%s",cardID);printf("请输入图书ISBN号:");scanf("%s",isbn);//步骤1:验证借书证if(isCardValid!=1){printf("借书证无效,无法借书\n");return0;//算法结束}//步骤2:查询图书状态if(bookStatus!=1){printf("图书已被借出,请稍后再借\n");return0;}//步骤3:检查借阅数量if(borrowCount>=5){printf("借阅数量已达上限,无法借书\n");return0;}//步骤4:登记信息并输出结果borrowCount++;//借阅数量+1printf("借阅成功,当前借阅数量:%d,应还日期:30天后\n",borrowCount);return0;}编程语言:算法的最终落地示例:校园快递路径规划的简单代码框架。#include<stdio.h>#defineINF10000//表示无穷大(假设校园内最大距离小于10000米)
intmain(){//距离矩阵:dist[i][j]表示点i到点j的距离(0:A,1:B,2:C,3:D,4:E)
intdist[5][5]={{0,10,20,INF,INF},//A到各点的距离
{10,0,5,15,INF},//B到各点的距离
{20,5,0,INF,30},//C到各点的距离
{INF,15,INF,0,5},//D到各点的距离
{INF,INF,30,5,0}//E到各点的距离
};
intshortest[5]={0,INF,INF,INF,INF};//最短距离数组
char*path[5]={"A","","","",""};//路径数组(简化表示)
intvisited[5]={1,0,0,0,0};//1表示已确定
//此处省略算法核心循环(详细实现见第12章)
printf("从A到B的最短距离:%d米,路径:A→B\n",10);//示例输出
printf("从A到C的最短距离:%d米,路径:A→B→C\n",15);//示例输出
return0;}运行结果:03结构化程序设计方法自顶向下的设计方法自顶向下设计是一种从整体到局部的设计方法。首先确定程序的整体结构,然后逐步细化每个部分的功能,直到所有细节都得到明确。逐步细化的过程逐步细化是指将程序设计分解为层次结构,逐步从高层的抽象逻辑向低层的实现细节进行细化。每个模块都可以独立开发和测试,最终通过组合这些模块来实现完整的程序。自顶向下与逐步细化模块化设计的定义模块化设计是将程序分割成多个相互独立的模块,每个模块完成特定的功能。模块之间通过接口进行通信,模块内部的实现细节对外部不可见。模块化设计的优势模块化设计使得程序更加易于维护和扩展,并且能够有效减少程序中错误的传播。通过将复杂的程序分解为多个模块,可以提高程序的可读性和可维护性。接口隔离的重要性接口隔离是模块化设计中的一个重要概念。通过明确模块之间的接口,可以确保模块之间的独立性,使得每个模块可以独立开发和测试,从而提高程序的开发效率。
模块化与接口隔离结构化编码的原则结构化编码强调使用清晰、规范的编程语言和结构化的编程技巧。通过控制程序的流程结构,使用顺序、选择和循环结构来实现程序逻辑,避免使用goto语句。结构化编码的优势结构化编码可以减少程序的复杂性和提高其可读性。通过遵循结构化编码的原则,可以提高程序的质量和可维护性,减少程序中的错误。结构化编码避坑指南04本章小结算法的核心概念与特性算法是解决特定问题的有序步骤集合,其本质特征有:有穷性、确定性、可行性和输入输出。结构化程序设计思想结构化程序设计思想包括自顶向下、逐步细化、模块化设计和结构化编码。这些思想有助于提高程序的可维护性和可读性。算法的效率意识在选择算法时,需要考虑算法的效率。不同的算法在步骤数量和执行效率上会有差异,因此选择合适的算法对于解决问题至关重要。算法表示与设计体系算法表示方法表示方法优点描述自然语言直观易懂,适合简单问题描述缺点:易歧义,不适合复杂逻辑流程图可视化流程工具:箭头指示流向N-S图结构化强:取消流程线,嵌套表示层次核心:三种基本结构(顺序、选择和循环)伪代码灵活简洁:结合自然语言与编程关键词作用:设计过渡编程语言可执行目标:最终落地感谢您的观看THANKYOUFORWATCHING汇报人:蒋亚平第3章
AI大模型助力编程学习AI大模型赋能C语言编程目录CONTENTS01AI如何帮助编写C代码02AI在调试和优化中的应用03通过AI提高编程效率04本章小结问题导入编程困境想写“计算学生成绩平均分”的程序却对着代码编辑器无从下笔,好不容易写出代码又因“数组越界”等错误反复卡壳、找不到问题,学完基础想优化代码结构也不知从何入手AI大模型它能否帮你快速生成基础C代码?能否精准检测调试中的错误并给出修复方案?又能否助力你提升编程技能、优化开发效率?01AI如何帮助编写C代码AI如何帮助编写C代码编程“神器”——AI大模型编程路上的“得力助手”生成基础代码精准定位错误提供优化建议推荐学习资源AI大模型AI助力代码自动生成AI代码补全在VSCode中,通过通义灵码插件,AI能够根据代码上下文自动补全C代码片段,如循环、条件判断等,显著减少手动编写样板代码的时间,提高开发效率。VSCode工具中源文件初始内容生成代码快捷键Ctrl+I的使用输入提示词AI大模型生成代码AI助力代码自动生成代码片段推荐AI能够根据当前代码片段推荐相关的代码结构或标准实现,例如在编写数据库连接代码时,自动插入数据库连接池的常见实现,帮助开发者快速完成复杂功能。注释与文档生成AI还可以自动生成清晰的代码注释,减少查阅文档的时间,提高代码的可读性和维护性。“通义灵码”菜单通过自然语言与AI互动编程自然语言生成代码通过自然语言描述需求,AI能够生成完整的C代码,如学生管理系统的CRUD操作,帮助开发者快速搭建原型。代码学习与理解学生可以通过阅读AI生成的代码学习函数拆分与指针用法,逐步手工改写代码,加深对编程的理解。根据提示词生成代码AI可以根据用户输入的需求,生成并解释复杂的数据结构或算法实现,如排序算法等,并提供详细注释。帮助理解复杂算法与数据结构02AI在调试和优化中的应用AI在调试和优化中的应用自动化错误检测与修复智能错误提示AI可以自动修复一些常见的代码错误,如类型不匹配、语法错误等,减少开发者的调试时间。“通义灵码”解释代码菜单“通义灵码”解释代码自动化错误检测与修复01代码审查AI可以分析已编写的C代码,识别潜在的性能问题或逻辑漏洞,帮助开发者优化代码。02性能优化AI能够根据代码的执行流程和上下文,提出性能优化建议,提高代码的运行效率。03代码改进AI可以自动提出优化建议,帮助开发者改进代码结构,提高代码的可读性和可维护性。“通义灵码”优化代码菜单代码审查与改进自动化错误检测与修复AI能够在编写代码时实时监测潜在的错误,并给出错误提示和修复建议,帮助开发者快速发现并解决问题。代码修复未定义标识符错误快速修复菜单通义灵码修改建议调试辅助工具代码逻辑分析与调试建议。AI能够根据代码的执行流程和上下文,提供关于逻辑错误的深入分析。性能分析与优化AI不仅能够识别性能瓶颈(如内存泄漏、低效算法),还可以根据分析结果提出优化建议。分析以下代码的执行逻辑,指出可能的死循环风险
AI分析代码:while(i>=1)中忘记
i--AI建议:可一次性打开文件完成所有读写操作,减少IO开销03通过AI提高编程效率加速学习与技能提升智能学习推荐AI可以根据开发者的学习进度与代码习惯,智能推荐相应的学习资源和编程任务。个性化编程练习基于AI对开发者水平的评估,提供个性化的编程练习。AI能够生成符合学习者当前技术水平的编程题目,从基础到高级,逐步提高编程能力。自动化开发与任务分配自动生成代码模板AI可以根据项目需求,自动生成相应的代码模板。任务分配与协作AI可以在团队项目中协助任务分配。提高代码质量与持续集成自动化测试生成AI能够根据开发者编写的C代码,自动生成相应的单元测试和集成测试。AI还可以实时监控测试覆盖率,确保项目质量。代码评估与持续集成支持AI能够帮助开发者评估代码质量,自动识别潜在的风险和不良实践,并根据评估结果调整持续集成流程,提升代码质量。04本章小结AI赋能编程的三阶段路径01写代码阶段AI通过代码补全、模板生成、自然语言编程等方式,帮助开发者快速写出高质量的代码,减少重复劳动。02调代码阶段AI提供错误检测、逻辑审查、性能优化等建议,帮助开发者快速定位并修复问题,提高代码质量。03优代码阶段AI通过数据结构选型、测试生成、持续集成等方式,帮助开发者优化代码,提高代码的可维护性和性能。感谢您的观看THANKYOUFORWATCHING汇报人:蒋亚平第4章
顺序结构数据与运算基础目录CONTENTS01数据类型02常量与变量03数据在计算机中的存储方式04输入和输出05运算符与表达式06本章小结问题导入数据类型要存储并输出一名学生的“学号(如20260001)、姓名(如张三)、C语言成绩(如89.5)”,需要用哪些不同的数据类型?为什么不能用“int类型”存姓名,也不能用“char类型”存成绩?输入输出用printf()输出学生成绩时,想让“89.5分”显示为“89.50分”(保留两位小数),该怎么修改代码?如果用scanf()输入成绩时,不小心输入了字母“a”,程序会出现什么问题?01数据类型数据类型基本数据类型分类与作用intnum=100;
//整型floatheight=1.75;//单精度浮点型doubleweight=65.5;//双精度浮点型chargender='M';
//字符型通义灵码:回复:用double,因为价格是小数,double精度高于float,避免计算误差C语言中存储商品价格(如99.9元)该用什么数据类型?为什么?02常量与变量常量与变量常量与变量常量声明对比#define宏常量与const类型常量在语法、类型检查、作用域上存在差异。const能提供编译期类型校验,降低错误风险。变量声明规范变量声明必须指定类型且可初始化,变量名是内存地址的抽象,编译器据此分配存储空间。#definePI3.14159constdoublePI=3.14159;intage=20; //声明一个整型变量age并初始化为20floatsalary=5000.50;//声明一个浮点型变量salarychargrade='A'; //声明一个字符型变量grade整型浮点型取值范围整型取值范围浮点型取值范围类
型
大
小取值范围int(基本整型)4字节-2147483648~2147483647,即-231~(231-1)unsignedint(无符号基本整型)4字节0~4294967295,即0
~(232-1)short(短整型)2字节-32768~32767,即-215~(215-1)unsignedshort(无符号短整型)2字节0~65535,即0
~(216-1)long(长整型)4字节-2147483648~2147483647,即-231~(231-1)unsignedlong(无符号长整型)4字节0~4294967295,即0
~(232-1)longlong(双长型)8字节-9223372036854775808~9223372036854775807,即
-263~(263-1)unsignedlonglong(无符号双长整型)8字节0~18446744073709551615,即0
~(264-1)类
型
大
小取值范围(绝对值)float(单精度)4字节0以及1.2×10-38~3.4×1038
double(双精度)8字节0以及2.3×10-308~1.7×10308
longdouble(长双精度)16字节0以及3.4×10-4932~1.1×104932
字符型与字符串存储差异01字符型存储char类型仅保存单个字符,以ASCII码整数形式存储,而字符串常量由双引号包围且末尾隐式追加'\0'结束符。02字符串本质字符串本质是可变长字符数组,通过'A'与"A"的内存占用对比展示1字节与2字节差异。03转义字符用途转义字符用于表示无法打印的控制码,如\n、\t、\\等,是编程中不可或缺的工具。类
型
大
小取值范围(绝对值)signedchar(有符号字符型)1字节-128~127,即-27~(27-1)
unsignedchar(无符号字符型)1字节0~255,即0~(28-1)
转义字符含义\n换行\t横向跳到下一个制表位\b退格\r回车\\反斜杠“\”\’单引号\”双引号\0空字符(字符串结束符)\a响铃(警告音)\f换页符\?问号\xhh十六进制字符(hh为两位十六进制数)字符串处理函数#include<string.h>//返回5(不包含'\0')strlen("Hello");
//比较字符串,返回-1strcmp("A","B");//复制字符串”Hi”到变量deststrcpy(dest,"Hi");//连接两个字符串strcat(s1,s2);
'A'(本质存ASCII码65)"A"占2字节('A'+'\0')逻辑判断处理#include<stdio.h>intmain(){ intnum; printf("Enteranumber:"); scanf("%d",&num); if(num>0){ printf("Positivenumber\n"); }elseif(num<0){ printf("Negativenumber\n"); }else{ printf("Zero\n"); } return0;}运行结果:数据类型转换自动转换(1)类型转换规则:当参与运算的量类型不同时,首先将它们转换为相同类型,再进行运算。(2)转换方向:转换会按数据类型的长度增加进行,以保证运算精度不降低。(3)浮点数运算:所有浮点数运算都以双精度(double)进行,即使表达式中的数据类型是float,也会先转换为double,然后进行计算。(4)字符和短整型运算:当char型和short型参与运算时,它们会首先被转换为int型。(5)赋值运算中的类型转换:在赋值操作中,若左右两边的数据类型不同,右边的数据会自动转换为左边的数据类型。数据类型转换强制类型转换基本形式为:(类型说明符)(表达式)作用是将表达式的计算结果强制转换为指定的类型说明符所表示的数据类型。(float)x //将变量x转换为浮点型(实型)。(int)(x+y) //将表达式x+y的结果转换为整型。注意事项:(1)括号的使用:类型说明符和表达式通常都需要加括号。比如(int)(x+y)与(int)x+y含义不同,前者是先计算x+y再转换类型,后者是先将x转换为整型再与y相加。(2)临时转换:无论是强制类型转换还是自动类型转换,都是为当前运算临时调整变量的数据类型,并不改变变量本身的定义类型或数据存储方式。doubleb=3.5;intc=(int)b;数据类型转换#include<stdio.h>intmain(){ inta=10; floatb=3.5; //自动转换 floatresult1=a+b;//int自动转换为float printf("Result1:%f\n",result1); //强制类型转换 intresult2=(int)b;//float强制转换为int printf("Result2:%d\n",result2); return0;}运行结果:03数据在计算机中的存储方式数据在计算机中的存储方式进位计数制的表示1基数(Radix)指计数制中允许使用的数码个数。2位权(Weight)每个数码的实际值等于该数码乘以一个与位置相关的常数。位权的大小为基数的幂次方。
二进制数101.1的位权为2²,2¹,2⁰,2-1。
十进制数123.45的位权从右到左依次为10²,10¹,10⁰,10-1,10-2;
二进制(Binary)基数为2,数码为0和1;
八进制(Octal)基数为8,数码为0~7;
十进制(Decimal)基数为10,数码为0~9;
十六进制(Hexadecimal)基数为16,数码为0~9和A~F(或a~f)。C语言中的进制表示
二进制:以0b或0B开头(部分编译器支持),如0b101;
八进制:以0开头,如017;
十六进制:以0x或0X开头,如0xFF。进制转换非十进制数转十进制采用按权展开求和法:将每一位数码乘以其位权,再累加。十进制数转非十进制数整数部分:采用除基数取余法,将商反复除以基数,记录余数,直到商为0,余数逆序排列即为结果。二进制1011.01转十进制:(1011.01)B=1×23+0×22+1×21+1×20+0×2-1+1×2-2=(11.25)D。十六进制0x3A.F转十进制:(3A.F)H=3×161+10×160+15×16-1=(58.9375)D。十进制45转二进制示例:(45)D
=(101101)B进制转换十进制数转非十进制数小数部分:采用乘基数取整法,将小数部分反复乘以基数,记录整数部分,直到小数部分为0或达到精度要求,整数顺序排列即为结果。十进制0.625转二进制:(0.625)D=(0.101)B将十进制数45.625转换成二进制数:分析:先对整数部分25转换,得到二进制整数101101;再对小数部分0.625转换,得到二进制小数0.101;最后将两部分组合。(45.625)D
=(101101.101)B进制转换非十进制数间的转换二进制、八进制和十六进制之间的转换则更为简便,这得益于它们的基数存在特殊幂次关系——8是2的3次方(8=2³),16是2的4次方(16=2⁴)。正因为这种关联,它们之间无需经过十进制过渡,可直接通过“分组转换法”完成:将二进制数按3位一组对应转换为八进制数,或按4位一组对应转换为十六进制数;反之,将八进制数每位拆分为3位二进制数、十六进制数每位拆分为4位二进制数,即可完成逆转换。十进制数二进制数八进制数十六进制数00000001000111200102230011334010044501015560110667011177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F进制转换非十进制数间的转换二进制转八进制示例。分析:以小数点为界,每三位一组,不足补0,每组转一位八进制数。101101.01→
分组为101101.010→
转为55.2。二进制转十六进制示例。分析:以小数点为界,每四位一组,不足补0,每组转一位十六进制数。101101.01→
分组为00101101.0100→
转为2D.4。八进制转十六进制示例。分析:先转二进制,再按四位分组转十六进制。八进制027→
二进制10111→
补零为00010111→
转为0x17。十六进制转八进制示例。分析:先转二进制,再按三位分组转八进制。十六进制0x3E→
二进制111110→
分组为111110→
转为0o76。注意:八进制/十六进制转换为二进制,是将每一位八进制/十六进制数转为三位/四位二进制数,合并即可。C语言中数据的存储数据以二进制形式存储计算机内部通常使用二进制来表示和存储所有数据。无论是数字、文字、图像还是声音,最终都会被转换为二进制形式(0和1)。输入输出格式控制5的二进制形式存储为00000101(假设使用8位存储)。字母A在ASCII编码中对应数字65,二进制表示为01000001。八进制输出:printf("%o",num);十六进制输出:printf("%x",num)(小写字母)带前缀输出:printf("%#o",num)(输出017)、printf("%#x",num)(输出0xf)。位、字节和地址数据以二进制形式存储位(bit):计算机中最小的数据单位,只有0和1两种状态。字节(Byte):由8个位组成,是计算机存储的基本单位。例如,一个字符通常占用1个字节。地址:每个字节在内存中都有一个唯一的编号,称为地址,用于标识和访问数据。文本文件包含"ABC"三个字母,每个字母占用1个字节,因此总共占用3个字节。内存中可能的存储方式如表所示。地址内容(二进制)对应字符0x100001000001A0x100101000010B0x100201000011C整型数据在内存中的存储方式数值以补码形式表示:(1)正数的补码与原码相同;(2)负数的补码是将其绝对值的二进制表示按位取反,再加1。变量i的原码inti;i=12;示例二:求-12的补码12的原码如上图所示。取反后如下图
所示。反码再加1,得-12的补码,如下图所示。补码左边的第一位是符号位,0表示正数,1表示负数。示例一:图1字符数据在内存中的存储方式实际上,x和y两个内存单元中分别存储的是字符'A'和'a'对应的ASCII码,即65和97的二进制代码,如下图
所示。因此,字符变量也可以视作整型变量。x='A';y='a';示例二:每个字符变量分配一个字节的内存空间,因此只能存储一个字符。字符值以ASCII码的形式存储在变量的内存单元中。例如,字符A的十进制ASCII码是65。需要注意的是,整型变量通常占4字节,而字符变量占1字节。当整型变量按字符类型输出时,仅低8位字节会被处理。65:0100000197:01100001charch='A';printf("%d",ch);//输出65(ASCII码)printf("%c",65);//输出'A'示例一:预处理命令#include<stdio.h> //包含标准输入输出库
#definePI3.14 //定义常量PI预处理命令是在编译之前由预处理器执行的命令,以#开头。常见的预处理命令包括#include和#define。04输入和输出输入和输出标准输入输出概念与函数01输入输出通道02常用IO函数03头文件包含输入输出通道stdin、stdout、stderr三通道作用不同,键盘与屏幕是默认设备,了解它们是编程基础。常用IO函数getchar、putchar、gets、puts、printf、scanf六大函数适用场景与缓冲区差异需明确,gets因越界风险已被废弃。头文件包含使用任何IO函数前必须包含stdio.h,否则编译器无法识别符号,这是编程规范要求。数据的输出字符输出使用putchar函数输出单个字符。#include<stdio.h>intmain(){charch='A';putchar(ch); //输出字符Aputchar('\n'); //输出换行符return0;}字符串输出使用puts函数输出字符串。#include<stdio.h>intmain(){charstr[]="Hello,World!";puts(str); //输出字符串并自动换行return0;}格式输出使用printf函数进行格式化输出。#include<stdio.h>intmain(){intage=20;floatheight=1.75;charname[]="John";printf("Name:%s,Age:%d,Height:%.2f\n",name,age,height);return0;}%.2f保留两位小数;%f默认6位;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 血脂异常患者随访管理诊疗进展 课件
- 2026事业单位工勤技能-天津-天津军工电子设备制造工二级(技师)历年参考题库含答案详解3套试卷
- 2026年秋季开学大学一年级新生军训射击体验专题课件
- 上海老年代步车专卖店消费指南-2026年申城长者品质出行全场景解决方案
- 基础写作专项题库及答案
- 趣味满满的物理试题及答案解析
- 2026年医院信息科计算机考试综合题库专项附答案
- 2026年北师大版高中物理选修3-11原子物理课件
- 高中语文 第四单元 万物静观皆自得 13 黄州新建小竹楼记教案 语文版必修3
- 模板的拆除教学设计中职专业课-建筑施工工艺-建筑工程施工-土木建筑大类
- T/ZHCA 026-2023化妆品抗糖化人体测试方法
- 妊娠合并心脏病护理查房
- 中外航海文化知到课后答案智慧树章节测试答案2025年春中国人民解放军海军大连舰艇学院
- 四川省三级综合医院评审标准实施细则(2023年版)
- Unit3SeaExploration单词讲解教学设计-2023-2024学年高中英语人教版(2019)选择性必修第四册
- PCCP管道监造监理实施细则(按照新规范编制)
- 海绵城市工程方案
- 汽车加油加气加氢站技术标准
- 磷矿石的烧结
- 中国石油天然气股份有限公司油气田地面建设工程(项目)竣工验收手册修订版
- GB/T 2-2016紧固件外螺纹零件末端
评论
0/150
提交评论