版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计培训课件第一部分课程导入与基础概念C语言简介与发展历程诞生背景1972年由DennisRitchie在贝尔实验室开发,最初用于UNIX操作系统的编写。C语言继承了B语言的优点,并克服了其局限性。语言特点简洁高效的语法结构丰富的运算符和数据类型良好的可移植性接近硬件的底层操作能力应用领域程序设计基础概念程序设计的基本步骤01问题分析明确需求,理解要解决的问题02算法设计制定解决问题的具体方案03编写代码用编程语言实现算法逻辑04调试测试验证程序正确性并优化性能算法与流程图算法是解决问题的步骤序列,具有有穷性、确定性、可行性、输入输出等特性。流程图用图形符号描述算法流程:椭圆形表示开始/结束矩形表示处理步骤菱形表示判断条件C语言程序结构详解1预处理指令以#开头的命令,如#include<stdio.h>用于包含标准输入输出库。预处理器在编译前处理这些指令,完成文件包含、宏替换等工作。2主函数main()程序执行的入口点,每个C程序必须且只能有一个main函数。函数体用花括号{}包围,包含程序的核心逻辑代码。3变量声明定义程序中使用的数据存储空间,指定变量类型和名称。合理的变量命名能提高代码可读性。4执行语句实现具体功能的代码行,每条语句以分号结束。语句按顺序执行,可包含运算、判断、循环等操作。5返回语句return0;表示程序正常结束。返回值通常用于向操作系统报告程序执行状态。编译、链接与执行流程源代码.c程序员编写的原始代码文件编译器处理转换为目标代码.obj链接库文件生成可执行文件.exe运行程序经典入门程序:Hello,World!#include<stdio.h>intmain(){printf("Hello,World!\n");return0;}第二部分数据类型与运算表达式基本数据类型与变量整型(int)用于存储整数,占用4字节(32位)。范围约为-21亿到+21亿。可添加修饰符:short(短整型)、long(长整型)、unsigned(无符号型)。浮点型(float/double)float单精度浮点数,占4字节,精度约7位;double双精度浮点数,占8字节,精度约15位。用于存储带小数点的数值。字符型(char)存储单个字符,占1字节。用单引号括起,如'A'、'9'。实际存储的是字符的ASCII码值。变量声明与初始化规则命名规则:由字母、数字、下划线组成,不能以数字开头,不能使用关键字声明语法:数据类型变量名;如intage;初始化:声明时赋初值intage=25;多变量声明:intx,y,z=10;常量与运算符常量类型字面常量:直接写在代码中的固定值,如100、3.14、'x'符号常量:用#define定义,如#definePI3.14159,编译时替换const变量:constintMAX=100;,运行时不可修改算术运算符加+、减-、乘*、除/、取模%自增++、自减--:i++后增,++i先增注意整数除法会舍弃小数部分关系运算符等于==、不等于!=大于>、小于<大于等于>=、小于等于<=结果为真(1)或假(0)逻辑运算符逻辑与&&:两者都真才为真逻辑或||:一个为真即为真逻辑非!:取反操作输入输出函数scanf与printf的格式控制printf函数用于格式化输出,将数据显示到屏幕:printf("格式控制串",输出列表);printf("年龄:%d岁\n",age);scanf函数用于格式化输入,从键盘读取数据:scanf("格式控制串",地址列表);scanf("%d",&age);重要提示:scanf中变量前必须加取地址符&!常用格式说明符%d-十进制整数%f-浮点数%c-字符%s-字符串%lf-double类型%x-十六进制getchar与putchargetchar():读取单个字符,无需参数putchar(ch):输出单个字符代码示例:实现简单计算器程序#include<stdio.h>intmain(){doublenum1,num2,result;charoperator;
printf("请输入第一个数字:");scanf("%lf",&num1);
printf("请输入运算符(+,-,*,/):");scanf("%c",&operator);
printf("请输入第二个数字:");scanf("%lf",&num2);
switch(operator){case'+':result=num1+num2;break;case'-':result=num1-num2;break;case'*':result=num1*num2;break;case'/':if(num2!=0)result=num1/num2;else{printf("错误:除数不能为0\n");return1;}break;default:printf("无效的运算符\n");return1;}
printf("%.2f%c%.2f=%.2f\n",num1,operator,num2,result);return0;}第三部分程序流程控制选择结构1if语句-单分支选择当条件为真时执行语句块。语法:if(条件){语句;}if(score>=60){printf("及格\n");}2if-else语句-双分支选择条件为真执行if块,否则执行else块。if(age>=18){printf("成年人\n");}else{printf("未成年\n");}3if-elseif-else-多分支选择依次判断多个条件,执行第一个满足条件的分支。if(score>=90)printf("优秀\n");elseif(score>=75)printf("良好\n");elseif(score>=60)printf("及格\n");elseprintf("不及格\n");4嵌套if语句if语句内部可以再包含if语句,实现复杂的多重判断逻辑。注意缩进以保持代码清晰。switch多分支选择结构当需要根据一个变量的不同值执行不同操作时,switch语句比多个if-else更清晰高效。每个case后要用break跳出,否则会继续执行后面的case(穿透效应)。switch(grade){case'A':printf("优秀\n");break;case'B':printf("良好\n");break;case'C':printf("中等\n");break;case'D':printf("及格\n");break;default:printf("不及格\n");}switch使用要点表达式必须是整型或字符型case标签必须是常量default是可选的循环结构for循环适用于已知循环次数的情况。语法:for(初始化;条件;更新){语句;}for(inti=1;i<=10;i++){printf("%d",i);}先初始化,判断条件,执行循环体,然后更新计数器。while循环先判断条件,条件为真才执行循环体。适用于不确定循环次数的场景。intsum=0,i=1;while(i<=100){sum+=i;i++;}可能一次都不执行(条件初始为假)。do-while循环先执行循环体,再判断条件。至少执行一次,适用于菜单驱动程序。intchoice;do{printf("菜单...\n");scanf("%d",&choice);}while(choice!=0);注意最后的分号不能省略。循环控制语句break语句立即跳出当前循环,不再执行循环体剩余部分和条件判断。常用于提前结束循环。continue语句跳过本次循环剩余语句,直接进入下一次循环判断。用于满足某条件时跳过特定处理。典型案例:用循环实现九九乘法表完整代码实现#include<stdio.h>intmain(){inti,j;
//外层循环控制行数for(i=1;i<=9;i++){//内层循环控制列数for(j=1;j<=i;j++){printf("%d*%d=%2d",j,i,i*j);}printf("\n");//每行结束后换行}
return0;}程序分析这个程序使用了嵌套循环的经典模式:外层循环(i):控制输出9行内层循环(j):每行输出的列数等于行号格式控制:%2d使数字右对齐,保持表格整齐换行处理:内层循环结束后换行,开始下一行运行结果呈现左下三角形状,展现了1到9之间所有乘法组合。这个例子完美展示了双重循环在实际问题中的应用。第四部分数组与字符串当需要处理大量同类型数据时,逐个定义变量既不现实也不高效。数组提供了一种批量存储和管理数据的方式。字符串作为字符数组的特殊应用,是程序与用户交互的重要媒介。一维数组与二维数组1数组定义一维数组:数据类型数组名[元素个数];二维数组:数据类型数组名[行数][列数];intscores[50];//50个整数doublematrix[3][4];//3行4列2数组初始化完全初始化:inta[5]={1,2,3,4,5};部分初始化:intb[5]={1,2};剩余元素自动为0省略长度:intc[]={1,2,3};自动确定长度为33数组访问通过下标访问元素,下标从0开始。scores[0]=95;//第1个元素matrix[1][2]=8.5;//第2行第3列注意:下标越界会导致不可预知的错误!4数组遍历使用循环处理所有元素:for(inti=0;i<50;i++){scanf("%d",&scores[i]);}二维数组需要嵌套循环遍历。多维数组的存储特点二维数组在内存中按行连续存储。例如inta[2][3]在内存中的排列顺序为:a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]。理解这一点对于指针操作数组很重要。字符数组与字符串处理字符串的存储方式C语言中没有专门的字符串类型,而是用字符数组存储字符串。字符串以'\0'(空字符,ASCII值为0)作为结束标志。charname[20]="ZhangSan";chargreeting[]="Hello";字符串"Hello"实际占用6个字节:H-e-l-l-o-\0注意:定义字符数组时,长度要比实际字符串长1,为'\0'预留空间!常用字符串函数需要包含头文件:#include<string.h>strlen(s)返回字符串s的长度(不含'\0')strcpy(dest,src)将src字符串复制到deststrcat(dest,src)将src字符串连接到dest末尾strcmp(s1,s2)比较两个字符串,相等返回0使用这些函数时要注意目标字符数组必须有足够的空间,避免溢出导致程序崩溃。实战演练:字符串反转程序设计#include<stdio.h>#include<string.h>voidreverseString(charstr[]){intlength=strlen(str);inti,j;chartemp;
//使用双指针法:i从头开始,j从尾开始for(i=0,j=length-1;i<j;i++,j--){//交换str[i]和str[j]temp=str[i];str[i]=str[j];str[j]=temp;}}intmain(){chartext[100];
printf("请输入一个字符串:");gets(text);//读取整行输入
printf("原字符串:%s\n",text);
reverseString(text);
printf("反转后:%s\n",text);
return0;}这个程序使用了双指针技巧:一个指针从字符串开头向后移动,另一个从末尾向前移动,交换两个指针指向的字符,直到两指针相遇。时间复杂度为O(n/2),效率很高。这种算法思想在很多场景都能应用。第五部分函数与模块化设计随着程序规模增大,将所有代码写在main函数中会变得难以维护。函数提供了代码模块化的方式,将复杂问题分解为多个子问题分别解决。合理使用函数可以提高代码复用性、可读性和可维护性。函数定义与调用函数声明(原型)告诉编译器函数的存在,通常放在main函数之前。返回类型函数名(参数类型列表);例:intadd(int,int);函数定义实现函数的具体功能。返回类型函数名(参数列表){函数体;return返回值;}函数调用在需要的地方使用函数。result=add(5,3);实参传递给形参,执行函数体,返回结果。参数传递方式C语言采用值传递:函数接收的是实参的副本,函数内修改形参不会影响实参原值。voidswap(inta,intb){inttemp=a;a=b;b=temp;}//这样无法交换原变量!要修改实参,需要传递指针(地址传递)。递归函数函数调用自身的编程技巧。必须有:递归出口:终止递归的条件递归体:问题的递归定义intfactorial(intn){if(n<=1)return1;//出口returnn*factorial(n-1);}递归简洁优雅,但要注意栈溢出风险。变量作用域与存储类别局部变量在函数或代码块内部定义,只在该范围内有效。函数调用结束后,局部变量被销毁。默认为auto存储类别。voidfunc(){intx=10;//局部变量}全局变量在所有函数外部定义,整个程序都可以访问。生命周期为整个程序运行期间。过度使用会增加程序复杂度。intcount=0;//全局变量voidfunc(){count++;}存储类别关键字static-静态变量静态局部变量:在函数内定义,但生命周期延长到整个程序。只初始化一次,保持上次调用的值。voidcounter(){staticintcount=0;count++;printf("%d\n",count);}静态全局变量:作用域限定在定义它的文件内,其他文件无法访问。extern-外部变量声明一个变量是在其他文件中定义的全局变量,使得当前文件可以使用该变量。//file1.cintglobalVar=100;//file2.cexternintglobalVar;printf("%d\n",globalVar);用于多文件程序中共享全局变量。代码示例:实现阶乘的递归函数完整程序代码#include<stdio.h>//递归函数声明longlongfactorial(intn);intmain(){intnum;
printf("请输入一个正整数:");scanf("%d",&num);
if(num<0){printf("错误:请输入正整数!\n");return1;}
longlongresult=factorial(num);
printf("%d!=%lld\n",num,result);
return0;}//递归函数定义longlongfactorial(intn){//递归出口:0!=1,1!=1if(n==0||n==1){return1;}
//递归体:n!=n×(n-1)!returnn*factorial(n-1);}递归过程分析计算5!的递归展开过程:factorial(5)=5×factorial(4)=5×4×factorial(3)=5×4×3×factorial(2)=5×4×3×2×factorial(1)=5×4×3×2×1=120优化建议:对于大数阶乘,递归可能导致栈溢出,可改用循环实现。第六部分指针与动态内存指针是C语言最强大也最容易出错的特性。通过指针,程序可以直接访问和操作内存地址,实现高效的数据处理。掌握指针是从初级程序员迈向高级程序员的关键一步。指针基础指针变量定义指针是一个变量,它的值是另一个变量的地址。int*p;//p是指向int的指针char*str;//str是指向char的指针星号*表示这是一个指针变量。取地址与间接访问&运算符获取变量地址*运算符访问指针指向的内容intx=10;int*p=&x;//p存储x的地址*p=20;//通过p修改x的值指针与数组数组名本质上是指向第一个元素的指针常量。intarr[5]={1,2,3,4,5};int*p=arr;//p指向arr[0]printf("%d",*(p+2));//输出arr[2]指针运算:p+i指向第i个元素。指针与字符串字符串可以用字符数组或字符指针表示:charstr1[]="Hello";//字符数组char*str2="World";//字符指针两者的区别:数组方式:内容可修改指针方式:指向字符串常量,不可修改指针进阶指针数组数组的每个元素都是指针。常用于存储多个字符串。char*weekdays[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};printf("%s\n",weekdays[0]);//输出Monday每个元素指向一个字符串的首地址。多重指针指向指针的指针,用**表示。intx=10;int*p=&x;//p指向xint**pp=&p;//pp指向pprintf("%d\n",**pp);//输出10常用于动态二维数组和参数传递。函数指针指针可以指向函数,实现回调机制。intadd(inta,intb){returna+b;}int(*func_ptr)(int,int);//声明函数指针func_ptr=add;//指向add函数intresult=func_ptr(3,5);//通过指针调用函数指针在实现多态、插件系统时非常有用。指针使用注意事项:初始化指针、避免野指针、防止内存泄漏、不要返回局部变量地址、使用完后置为NULL。实例讲解:利用指针实现数组排序#include<stdio.h>//使用指针交换两个整数voidswap(int*a,int*b){inttemp=*a;*a=*b;*b=temp;}//冒泡排序函数(指针版本)voidbubbleSort(int*arr,intn){inti,j;
for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++){//比较相邻元素,通过指针访问和修改if(*(arr+j)>*(arr+j+1)){swap(arr+j,arr+j+1);}}}}//打印数组函数voidprintArray(int*arr,intn){for(inti=0;i<n;i++){printf("%d",*(arr+i));}printf("\n");}intmain(){intdata[]={64,34,25,12,22,11,90};intn=sizeof(data)/sizeof(data[0]);
printf("排序前:");printArray(data,n);
bubbleSort(data,n);
printf("排序后:");printArray(data,n);
return0;}这个程序展示了指针的三个典型应用:传递数组地址、间接访问数组元素、通过指针修改原数据。使用指针使得函数可以直接操作原数组,而不需要返回新数组,提高了效率。第七部分结构体与文件操作当需要表示复杂的数据对象时,基本数据类型已经不够用了。结构体允许我们将不同类型的数据组合成一个整体。文件操作则让程序能够持久化保存数据,在程序关闭后数据不会丢失。结构体定义与使用结构体的定义使用struct关键字定义自定义数据类型:structStudent{intid;charname[50];floatscore;};//声明结构体变量structStudents1;structStudents2={1001,"李明",95.5};也可以使用typedef简化:typedefstruct{intid;charname[50];floatscore;}Student;Students1;//直接使用Student结构体成员访问使用.运算符访问成员:s1.id=1002;strcpy(,"王芳");s1.score=88.0;printf("%s:%.1f\n",,s1.score);指针访问使用->运算符:Student*p=&s1;p->id=1003;printf("%d\n",p->id);p->id等价于(*p).id1结构体数组存储多个同类型对象Studentclass[50];class[0].id=1001;2结构体指针动态分配和传递结构体Student*p=&s1;p->score=90;3结构体作为参数传递复杂数据到函数voidprint(Students){printf("%s\n",);}文件读写基础打开文件使用fopen函数打开文件,返回文件指针。FILE*fp;fp=fopen("data.txt","r");/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家长安全教育培训食品安全
- 家长培训课件资源app
- 2026年数据中心中央空调年度维护合同协议
- 2026年海鲜批发分销合同协议书
- 2026年危险品国内运输合同
- 2026年仓储物流配送保险合同范本
- 数据保密合同2026年使用条款
- 2026年公园照明服务合同协议
- 2026年水路货物运输合同
- 土地个人承包合同
- 2025福建德化闽投抽水蓄能有限公司招聘4人(公共基础知识)综合能力测试题附答案
- “十五五规划纲要”解读:和美乡村宜居宜业
- 广东省广州市2026届高三年级上学期12月调研测试数学(广州零模)(含答案)
- 2025至2030中国光学存储设备行业市场深度研究与战略咨询分析报告
- 手机供货协议书
- 喷绘安装合同范本
- 2025年区块链技术化妆品溯源发展报告
- 福建厦门大学教育研究院行政秘书招聘笔试真题2024
- 民俗的特征教学课件
- GJB3243A-2021电子元器件表面安装要求
- 2025年4月自考03450公共部门人力资源管理试题
评论
0/150
提交评论