C语言程序设计基础课件 05 组合数据类型_第1页
C语言程序设计基础课件 05 组合数据类型_第2页
C语言程序设计基础课件 05 组合数据类型_第3页
C语言程序设计基础课件 05 组合数据类型_第4页
C语言程序设计基础课件 05 组合数据类型_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

组合数据类型C语言程序设计基础目录/Contents01020304数组结构类型指针类型链表学习目标概述知识认知通过本章的学习,学生需要对数组、结构体、指针以及链表等组合数据类型的概念有明确的认识,理解其在内存空间中的分配情况,掌握它们的定义、初始化、引用方法,以及作为函数参数和返回值的使用方式。技能提升读者能够熟练掌握各种组合数据类型的使用方法和技巧,为深入理解程序设计的奥秘,提高程序设计的技能打下良好基础。01数组导例:计算比赛成绩问题描述一名奥运会跳水选手完成动作后,裁判给出各自的基础分成绩,需要用C程序存储和显示这些成绩。若有一名裁判的成绩有误,需进行修改,并计算选手的最终成绩(评分规则:(总分-最高分-最低分)*难度系数)。问题分析可以利用一维数组来存储相同数据类型的数据,解决显示和计算问题。一维数组的定义及操作可参考相关章节,通过循环依次显示所有裁判给出的成绩,利用数组下标修改特定裁判的成绩。算法描述定义整型变量n并初始化为7,定义一个能存储7个元素的double类型数组score并初始化,利用for循环显示数组中的所有元素,修改下标为4的元素值,求最大值、最小值及所在下标,最后计算最终得分。程序实现给出实现上述算法的C语言程序,包括数组的定义、初始化、成绩修改、循环显示、最值计算和最终得分计算等步骤。运行结果展示程序运行后的裁判成绩和最终得分。程序分析通过该例介绍了一维数组的定义、初始化、引用及操作方法,体会数组中已知下标即可得到对应数值的特点。导例:计算比赛成绩程序实现#include<stdio.h>#defineN3.2intmain(){/*定义一维数组并初始化*/inti,n=7; intmax=0,min=0;/*max为最大值的下标,min为最小值下标*/doublescore[n]={9.0,9.5,8.5,9.0,7.0,9.5,8.0},sum=0,total=0; score[4]=score[4]+1; /*修改第5名裁判的成绩*/for(i=0;i<n;i++) /*显示所有裁判给出的成绩*/ printf("%.1f",score[i]);printf("\n");for(i=0;i<n;i++) /*求最高分,最低分,总分*/ { sum=sum+score[i]; if(score[max]<score[i]) max=i; if(score[min]>score[i]) min=i;}total=(sum-score[max]-score[min])*N;/*N为难度系数*/printf("最终得分:%.1f\n",total);return0;}导例:搜索引擎相关度排序搜索引擎需要对网页与关键词的相关度进行排序,编写一个函数,利用选择排序方法将网页与关键词相关度按照从高到低的顺序排列。问题描述本案例实现对一维数组中所有元素的排序,选择排序方法通过数组做函数参数来实现。选择排序的思想是依次从数组中选择最小的元素与当前位置的元素交换,经过n-1次选择后实现排序。问题分析在一个长度为n的无序数组中,将第一个元素设为最小值,通过多趟排序,每次遍历剩余元素找到最小的与当前位置交换,经过n-1趟后排序完成。选择排序算法描述给出实现选择排序算法的C语言程序,包括选择排序函数的定义和主函数中对相关度数组的排序调用。程序实现展示排序前和排序后的网页相关度。运行结果通过定义函数实现对网页相关度的选择排序,实参的地址传递给形参,对形参的操作即对实参的操作。该函数还可用于对其他整型、浮点型数组进行排序。程序分析导例:搜索引擎相关度排序程序实现#include<stdio.h>#defineN10voidselectSort(inta[],intn) /*选择排序函数定义*/{inti,j,k,t;for(i=0;i<n-1;i++){k=i;/*k为查找最小元素的下标*/for(j=i;j<n;j++)if(a[j]>a[k])k=j;

t=a[k];a[k]=a[i];a[i]=t;}}intmain(){intscore[N]={82,76,69,92,53,78,80,88,65,72},i;printf("排序前:\n");for(i=0;i<N;i++) /*显示排序前网页相关度*/ printf("%d",score[i]);printf("\n");selectSort(score,N); /*调用函数,对相关度排序*/printf("排序后:\n");for(i=0;i<N;i++) /*显示排序后的相关度*/ printf("%d",score[i]);printf("\n");}导例:搜索引擎相关度排序选择排序算法流程图导例:抓扑克牌问题描述问题分析算法描述程序实现运行结果程序分析小明在玩扑克时,需要将新抓的牌插入到已按点数从小到大摆放的牌中,使牌依然有序。在有序数组中插入新数据并保持有序,需要经过查找插入点、移动数组元素、插入数据和更新数组长度四个步骤。查找插入点时,根据待插入数据与数组元素的大小关系确定插入位置;数组数据移动时,从最后一个元素起依次向后移动。从数组第1个元素开始与待插入数据比较,找到插入位置后,从最后一个元素起向后移动,插入数据并更新数据长度。给出实现上述算法的C语言程序,包括数组的定义、插入位置查找、数据移动、插入和长度更新等步骤。展示抓牌前和抓牌后的牌面情况。介绍了另一种边查找边移动的插入方法,该方法只需一个循环即可完成,优先采用。利用此原理可实现直接插入法排序算法。导例:抓扑克牌程序实现#include<stdio.h>intmain(){inti,j,x,len=6;intp[len]={3,5,6,9,12,13};//有序数组printf("抓牌前:\n");for(i=0;i<len;i++)printf("%-4d",p[i]);printf("\n");printf("请抓牌:");scanf("%d",&x);//待插入的新数for(i=0;(x>p[i])&&(i<len);i++);//查找插入位置

for(j=len;j>i;j--)//移动数组元素

p[j]=p[j-1];p[i]=x;//插入数据

len++;//更新表的长度printf("抓牌后:\n");//输出结果for(i=0;i<len;i++)printf("%-4d",p[i]);}导例:网络故障检索问题描述某高校发生大面积停网事件,疑似故障点在某段线路的特定位置,工程师利用二分查找方法查找故障点,返回该点下标。问题分析查找算法有多种,折半查找要求待查找的数据必须是有序的。查找的思想是将数组中间位置元素与查找数值比较,根据比较结果缩小查找范围,重复此过程直到找到或子数组不存在。二分查找算法描述定义三个整数low、high和mid,通过比较中间元素与查找数值的大小,不断调整low和high的值,重复比较过程,直到找到或查找失败。程序实现给出利用折半查找实现故障点查找的C语言程序,包括二分查找函数的定义和主函数中对故障点的查找调用。运行结果展示疑似故障点位置和故障点的网络序号。程序分析二分查找对于有序数组效率较高,其算法过程对应一棵有n个结点的二叉树,平均搜索长度为O(log2n)。导例:网络故障检索程序实现#include<stdio.h>intbinarySearch(inta[],intn,intx);/*函数声明*/intmain(){intn=9;intlocation[n]={6,23,38,49,66,80,97,106,158};inti,pos;printf("疑似故障点位置:\n");for(i=0;i<n;i++) printf("%d",location[i]);printf("\n");pos=binarySearch(location,n,106);/*调用函数,查找106的位置*/printf("故障点为106的网络序号为:%d\n",pos+1);

}intbinarySearch(inta[],intn,intx){intlow=0;inthigh=n-1;while(low<=high){intmid=(low+high)/2;if(x==a[mid])returnmid;elseif(x<a[mid])/*在左半边*/high=mid-1;else /*在右半边*/low=mid+1;}return-1;/*没找到*/}导例:网络故障检索导例:谁是冠军问题描述奥运会跳水女子三米跳板决赛中,有8个队伍进入决赛,已知各队伍的五跳成绩和每一跳的难度系数,编写程序计算每个队伍的最终得分,并输出冠军序号。问题分析用二维数组存储8位选手的五轮成绩,用一维数组存储难度系数,通过矩阵相乘计算每个队员的总分。,通过比较得分确定冠军队伍。算法描述定义数组存储各队伍的成绩和难度系数,计算每个队伍的最终得分,比较得分找出最大值对应的队伍序号。程序实现定义二维数组score、一维数组difficulty和final,利用双重for循环计算每个选手的最终成绩,循环找出final数组中最大值对应下标+1即冠军序号。运行结果展示各队伍的最终得分和冠军序号。程序分析通过该例掌握数组在实际问题中的应用,以及如何通过计算和比较得出结果。姓

名第一轮第二轮第三轮第四轮第五轮

轮次难度霍尔马克66.044.961.56367.5

第一轮3.0英格63.06358.563.563.0

第二轮3.0蒙塔诺63.060.566.046.567.5

第三轮3.1施廷懋76.576.57577.578

第四轮3.4帕尔梅67.56373.566.673.1

第五轮3.0亚伯6369.83964.561.2

萨布里63.066.661.567.567.5

王涵7267.56669.773.5

某届奥运会女子三米板决赛成绩

难度系数分导例:谁是冠军程序实现#include<stdio.h>intmain(){/*定义成绩数组*/floatscore[8][5]= {{66.0,44.9,61.5,63,67.5}, {63,63,58.5,63.5,63}, {63.0,60.5,66.0,46.5,67.5}, {76.5,76.5,75,77.5,78}, {67.5,63,73.5,66.6,73.1}, {63,69.8,39,64.5,61.2}, {63.0,66.6,61.5,67.5,67.5}, {72,67.5,66,69.7,73.5}};floatdifficulty[5]={3.0,3.0,3.1,3.4,3.0}; /*定义难度系数数组*/floatfinal[8]={0}; /*定义最终成绩数组*/inti,j,max=0;printf("Thefinallscoreis:\n");for(i=0;i<8;i++){ /*两矩阵相乘*/for(j=0;j<5;j++)final[i]+=score[i][j]*difficulty[j];printf("%5.2f\t",final[i]);if(final[max]<final[i]) max=i;}printf("\n");printf("冠军是%d号选手\n",max+1);}导例:网页登录密码加密问题描述从键盘输入字符串,经加密后输出,防止敏感信息泄露。问题分析定义字符数组存储字符串,利用字符串处理函数gets赋值,用strlen函数求长度,用凯撒密码将字符串加密。算法描述定义字符数组s,利用gets函数赋值,strlen函数求长度,通过for循环对字符串中的每个字符进行加密运算,最后输出加密后的字符串。程序实现展示实现上述算法的C语言程序,包括字符数组定义、输入、长度计算、加密运算和输出等操作。运行结果给出输入字符串和加密后字符串的显示结果。程序分析介绍通过定义字符数组存储字符串,利用相关函数进行操作,对字符进行偏移判断和输出。导例:网页登录密码加密程序实现#include<stdio.h>#include<string.h>#include<ctype.h>intmain(){chars[80];intoffset=0;inti,n;gets(s); /*通过键盘给s赋值*/n=strlen(s); /*求s的长度并赋值给n*/scanf("%d",&offset);offset=offset%26;//对26取余

for(i=0;i<n;i++){if(s[i]+offset>='A'&&s[i]+offset<='Z'||s[i]+offset>='a'&&s[i]+offset<='z') /*判断为英文字母*/ s[i]=s[i]+offset; elseif(isupper(s[i])&&s[i]+offset>'Z') s[i]=s[i]+offset-'Z'+'A'-1; elseif(islower(s[i])&&s[i]+offset>'z') s[i]=s[i]+offset-'z'+'a'-1; elseif(islower(s[i])&&s[i]+offset<'a') s[i]=s[i]+offset-'a'+'z'+1; elseif(isupper(s[i])&&s[i]+offset<'A') s[i]=s[i]+offset-'A'+'Z'+1; }printf("%s\n",s);}一维数组一维数组定义介绍一维数组用于存储有序数据集合的定义格式,包括类型关键字、数组名和数组元素个数,以及C99后数组元素个数可定义为整型变量的情况。一维数组的初始化说明一维数组初始化的三种方法,即对全部元素赋值、给部分元素赋值、全部元素赋初值时不指定数组长度,并给出相应示例。一维数组的引用介绍一维数组元素的引用形式为数组名[下标],下标为非负int型表达式,范围是0~n-1,在C语言中只能逐个引用数组元素。二维数组介绍二维数组用于存储二维表的定义格式,包括类型关键字、数组名、第一维下标的长度和第二维下标的长度,以及C99后二维数组下标可定义为整型变量的情况。说明二维数组初始化的四种方法,即按行分段赋值、按行连续赋值、部分元素赋初值的两种方法、对全部元素赋初值时省略第一维长度,并给出相应示例。介绍二维数组的访问格式为数组名[行下标][列下标],行下标和列下标从0开始,需注意避免下标越界。介绍字符数组定义和初始化的方法,包括逐个字符赋值、直接用字符串赋值,强调初始化时添加'\\0'的重要性。二维数组定义二维数组的初始化二维数组的引用字符数组及字符串介绍字符串输入的三种方法,即采用格式符“%s”、gets()函数、单个字符输入;输出的三种方法,即采用格式符“%s”、puts()函数、单个字符输出。字符串的输入和输出介绍C语言中处理字符和字符串的函数,包括判断字符类型、大小写转换、求字符串长度、复制、连接、比较、查找字符和子串等函数的原型和功能。字符及字符串处理函数数组作为函数参数说明数组元素作为函数实参时,形参与实参之间是单向值传递,形参变化不影响实参。数组元素作为函数参数数组名作为函数参数说明数组名作为函数实参时,传递的是数组首元素的地址,形参中的数组元素变化会带动实参中数组元素的变化。02结构类型导例:图书类型问题描述创建一个图书类型,其中包含图书的书名、作者和价格信息,在主函数中定义该类型的一个普通变量、一个数组,分别对普通变量和数组赋初值,然后逐一显示它们的信息。030201040506问题分析算法描述程序实现运行结果程序分析C语言中无“图书”类型,需用户自定义,图书类型由书名、作者、价格等不同基本类型的数据项构成。创建图书类型,在主函数中定义变量和数组并赋值,显示变量信息,修改变量价格后再次显示,最后显示结构数组中各元素信息。展示实现上述算法的C语言程序,包括图书结构类型定义、变量和数组定义、赋值、信息显示和修改等操作。给出图书变量和数组信息的显示结果。介绍自定义结构类型的方法,结构变量和数组的定义、赋值和引用方式。导例:图书类型程序实现#include<stdio.h>#include<string.h>structbook{ /*定义图书结构类型*/chartitle[100]; /*书名*/charauthor[20]; /*作者*/doubleprice; /*价格*/};main(){inti;/*定义book类型的变量和数组,并初始化结构数组变量*/structbookbk,b[3]={{"Computer","李四",66.60},{"Information","张三",41.00,},{"Mathematics","王五",55.00,}};strcpy(bk.title,"Graphics"); /*为bk赋值*/strcpy(bk.author,"turing");bk.price=36.90;printf("bk的信息为:\n");printf("%s\t%s\t%5.2f\n",bk.title,bk.author,bk.price); /*输出bk的信息*/bk.price=32.60; /*修改bk的price值*/printf("bk修改后的信息为:\n");printf("%s\t%s\t%5.2f\n",bk.title,bk.author,bk.price); /*输出修改后bk的信息*/printf("b数组的信息为:\n"); for(i=0;i<3;i++) /*依次输出b数组各个元素的信息*/printf("%s\t%s\t%5.2f\n",b[i].title,b[i].author,b[i].price); }导例:教材统计问题描述定义一个课程结构类型,其中包含课程编号、课程名称、使用的教材、各班级订购教材情况以及教材总需求量,然后在主函数中定义课程类型的数组变量,分别计算每门课程的教材需求量,最后显示每门课程的信息。030201040506问题分析算法描述程序实现运行结果程序分析课程结构类型包含课程编号、名称、使用教材、各班级订购情况和教材总需求量等数据项,其中使用教材为嵌套的图书类型。定义图书book类型,再定义课程course类型,course类型中包含book类型。在主函数中创建course类型的数组并初始化,初始化时仅给教材订购量数组的前3个元素(3个班级订购量)赋值,而总订购量由三个班的订购量计算得到,并把计算结果赋值给订购量数组的第4个元素,最后显示每个课程的详细信息。展示实现上述算法的C语言程序,包括结构类型定义、数组初始化、需求量计算和信息显示等操作。。输出每门课程的信息介绍结构类型的嵌套使用方法,通过“.”运算符引用嵌套结构中的数据项。导例:教材统计程序实现#include<stdio.h>#include<string.h>structbook{ /*定义book结构类型*/chartitle[100]; /*书名*/charauthor[20]; /*作者*/doubleprice; /*价格*/}; structcourse{ /*定义course结构类型*/intid;charname[10];structbooktexbk; /*包含book类型数据项*/intord[4]; /*包含数组类型数据项*/};intmain(){/*定义course类型的数组并初始化*/structcoursec[3]={{01,"Computer",{"Computer","李四",66.60},{68,76,67}},{02,"ITcourse",{"Information","张三",41.00,},{82,88,82}},{03,"Advmath",{"Mathematics","王五",55.00,},{78,80,80}}};inti,j; for(i=0;i<3;i++){ /*计算每本教材的总订购量,并放在order成员变量中*/c[i].ord[3]=0; for(j=0;j<3;j++)c[i].ord[3]+=c[i].ord[j];}/*输出c数组的信息*/ printf("id\tcoursename\tbooktitle\tauthor\tprice\tord1\tord2\tord3\ttotal\n");for(i=0;i<3;i++) /*显示每个课程的信息*/printf("%02d\t%s\t%s\t%s\t%5.2f\t%d\t%d\t%d\t%d\n",c[i].id,c[i].name,c[i].texbk.title,c[i].texbk.author,c[i].texbk.price,c[i].ord[0],c[i].ord[1],c[i].ord[2],c[i].ord[3]);return0;}导例:坐标变换问题描述以二维坐标平移变换为例,编写程序实现一个三角形的平移变换,并显示变换前后三角形的顶点坐标信息。030201040506问题分析算法描述程序实现运行结果程序分析采用结构类型描述坐标点,定义实现坐标平移的函数,利用结构类型作为函数参数和返回值实现多值传递。创建一个point类型,表达坐标点的水平坐标分量x和垂直坐标分量y,然后设计一个函数trans_point,实现多值传递,达到一次变换特征点的两个坐标分量的目的。在主函数中定义一个point类型的数组tri[3],分别表示三角形的三个顶点坐标,主函数调用trans_point函数进行点的平移变换,实现一个三角形的平移,并显示原三角形和平移后三角形的位置坐标信息。展示实现上述算法的C语言程序,包括point结构类型定义、trans_point函数定义、三角形顶点坐标初始化、平移变换和坐标信息显示等操作给出平移前后三角形顶点坐标的显示结果。说明结构类型作为函数参数和返回值的作用,可将有内在联系的分量组合成整体,实现多值传递。导例:坐标变换程序实现#include<stdio.h>structpoint/*定义point坐标点结构类型*/{floatx;floaty;};/*实现点平移变换的函数,结构类型作为函数的形参和返回值类型,tx和ty分别是水平方向和垂直方向的平移量*/structpointtrans_point(structpointp,floattx,floatty){ p.x=p.x+tx; p.y=p.y+ty;returnp; /*返回结构类型*/}voidprint_triangle(structpointtri[]){/*输出三角形三个顶点坐标的函数*/inti;for(i=0;i<3;i++)printf("%d\t%.1f\t%.1f\n",i,tri[i].x,tri[i].y);}intmain(){inti;structpointtri[3]={{1.3,3.5},{7.6,5.3},{3.8,6.6}};printf("原三角形三个顶点的坐标值:\n");printf("顶点\tX坐标\tY坐标\n");print_triangle(tri);for(i=0;i<3;i++){ tri[i]=trans_point(tri[i],2.2,3.6);/*调用返回结构类型的函数*/ } printf("平移后新三角形顶点坐标值:\n");printf("顶点\tX坐标\tY坐标\n"); print_triangle(tri); }结构类型的基本操作介绍结构类型的定义格式,包括struct关键字、结构类型名和成员列表,成员列表可包含基本类型、数组类型和结构类型。结构类型的定义说明结构类型变量定义的三种方式,即先声明类型再定义变量、声明类型的同时定义变量、直接定义结构类型变量。结构类型变量的定义说明定义结构变量后,需用“.”运算符引用其中的成员。结构类型变量的引用说明结构变量可在定义时初始化,也可先定义后赋值,并给出相应示例。说明定义结构类型后可定义该类型的数组,结构数组的初始化方式与一般数组类似。结构变量的初始化及赋值结构类型作为函数的参数与返回类型01结构类型作为函数的参数说明结构变量作为函数参数时,参数传递是单向的,形参变化不影响实参。结构类型作为函数的返回值说明结构类型作为函数返回值时,可帮助函数返回更多数据项。对比结构体值传递和地址传递的区别,说明地址传递的效率优势。结构数组定义与本质初始化方式定义了结构类型后,可以定义该类型的数组。结构数组本质上是一个数组,其数组元素是结构类型的变量。结构数组的初始化与一般数组的初始化一样有两种方式,即可以在定义结构数组的同时初始化,也可以采用先定义后赋值的方式为每个结构体类型的数据成员赋值。通过具体例子说明这两种初始化方式。010203指针类型导例:密室逃脱问题描述在密室逃脱中,根据线索找到钥匙,类比计算机中通过指针访问内存数据。030201040506问题分析算法描述程序实现运行结果程序分析介绍访问计算机内存数据的两种方式,即直接使用变量名访问和通过获得内存地址间接访问。说明指针是内存单元的地址,可通过指针间接访问内存数据。定义一个Rt()处理数字三角形,主函数通过调用这个函数,输出相应的三角形。。输出数字三角形。定义字符型变量保存字符,定义字符型指针变量保存该变量的地址,通过指针访问变量并输出字符。给出变量值、地址和通过指针访问输出的结果。导例:密室逃脱程序实现#include<stdio.h>intmain(){charcKey='V';/*定义一个字符型变量,保存字符'V'*/char*pKey=&cKey;/*定义一个字符型指针变量,保存cKey的地址*/

printf("Theresultis:%c\n",cKey);/*直接输出cKey的值*/printf("Theresultisstoredin:%d\n",pKey);/*输出cKey的地址*/printf("Indeed:%c\n",*pKey);/*利用指针pKey输出cKey的值*/return0;}导例:统计输出所有学生的考勤成绩问题描述使用指针变量间接访问数组元素,输出学生的出勤次数和考勤成绩。030201040506问题分析算法描述程序实现运行结果程序分析介绍访问数组元素的两种方式,即下标访问和指针访问,通过指针变量依次指向数组元素并判断出勤次数对应的成绩。定义整型常量保存学生人数,定义整型数组保存出勤次数,定义指针变量指向数组首地址,通过循环移动指针访问元素并输出成绩。实现上述算法的C语言程序,包括数组定义、指针初始化、循环访问元素和输出成绩等操作。利用指针间接访问数组元素并输出相应成绩说明如何利用指针变量顺序访问数组元素。由于数组元素在内存的存放是连续的,所以只要把一个指针变量指向数组的某一个元素,指针增1就会指向数组的下一个元素、减1就会指向数组的前一个元素。导例:密室逃脱程序实现#include<stdio.h>#defineN15 /*定义整型常量,保存学生的人数*/intmain(){intAttRcds[N]={16,14,15,12,8,10,15,15,16,13,1,14,16,5,11};/*定义一个一维整型数组,保存学生的出勤次数*/int*pAttRcds=AttRcds;/*定义一个整型指针变量,并初始化为数组的首地址*/printf("number\ttimes\tscore\n");while(pAttRcds<AttRcds+N){printf("%d\t%d\t",pAttRcds-AttRcds+1,*pAttRcds);switch(*pAttRcds){case16:case15:printf("100\n");break;case14:case13:case12:printf("80\n");break;case11:case10:case9:printf("60\n");break;case8:case7:case6:printf("40\n");break;case5:case4:case3:printf("20\n");break;case2:case1:case0:printf("0\n");}pAttRcds++;}return0;}导例:求一次体育抽测的统计数据问题描述计算学生体育抽测成绩的平均成绩和中位数。问题分析根据抽测人数动态分配内存空间存储成绩,按总成绩/抽测人数计算平均成绩,根据人数奇偶性计算中位数。算法描述输入抽测人数,动态申请内存空间,判断分配是否成功,输入成绩,累加计算总成绩和平均成绩,排序后计算中位数,最后输出结果。程序实现展示实现上述算法的C语言程序,包括内存分配、成绩输入、计算和输出等操作。运行结果给出抽测人数、成绩、平均成绩和中位数的显示结果。程序分析说明在求取不定人数统计数值时,动态分配内存空间的重要性,以及使用指针间接访问数据的方法。导例:求一次体育抽测的统计数据程序实现#include<stdio.h>#include<stdlib.h>intmain(){intnum=0,i=0;float*SampSize=NULL;printf("请输入本年度抽样人数num:");scanf("%d",&num);SampSize=(float*)calloc(num,sizeof(float));/*申请动态分配num个float型内存空间,返回的首地址保存在SampSize中*//*判断动态内存分配是否成功*/if(SampSize)/*若SampSize不是空指针NULL,则执行以下的操作*/{float*pScore=SampSize; /*定义float类型指针变量pScore,指向动态数组空间第一个元素*/ doublesum=0,mean=0,mid=0;/*定义计算所需的其他变量:总成绩sum、平均值mean、中位数mid*/printf("请输入本年度抽测成绩:\n");/*循环读取抽测数据,保存到动态数组空间*/for(i=0;i<num;i++){scanf("%f",pScore);sum+=*pScore;/*累加抽测成绩保存至sum*/pScore++;/*向后移动指针pSize,指向动态数组空间中的下一个元素*/}mean=sum/num;/*求抽测成绩平均值,保存至mean*/printf("本次抽测的平均成绩为:%.1f\n",mean);/*使用5.1.2中的排序方法,对pScore数组进行排序*/

/*求中位数,保存至mid*/pScore=SampSize;/*恢复指针pScore指向动态数组空间第一个元素*//*判断抽测人数的奇偶性,计算抽测成绩的中位数,保存至mid*/if(num%2==0)mid=(*(pScore+(num/2-1))+*(pScore+num/2))/2; elsemid=*(pScore+num/2);

printf("本次抽测成绩的中位数为:%.1f\n",mid);free(SampSize);/*释放前面所申请的动态内存空间*/}Return0;}导例:十二生肖名称的翻译问题描述根据用户输入的生肖顺序号,输出对应生肖的英文名称。问题分析定义字符指针数组指向各生肖名称字符串,根据用户输入的序号输出对应名称。算法描述定义字符指针数组,提示用户输入序号,输出对应生肖的英文名称。程序实现展示实现上述算法的C语言程序,包括指针数组定义、输入和输出操作。运行结果给出用户输入序号和对应生肖英文名称的显示结果。程序分析说明通过定义字符指针数组实现生肖名称翻译的方法,注意数组下标从0开始。导例:十二生肖名称的翻译程序实现#include<stdio.h>intmain(){char*Zodiac[12]={"Rat","Ox","Tiger","Rabbit","Dragon","Snake","Horse","Sheep","Monkey","Rooster","Dog","Pig"};/*定义一个字符型指针数组并初始化*/intn;printf("请输入生肖对应的顺序号(1~12):");scanf("%d",&n);/*读取用户输入的整数,保存至变量n*//*如果n在1~12之间,则输出对应生肖的英文名称*/if(n>=1&&n<=12) printf("该数字对应生肖的英文名称为:%s\n",Zodiac[n-1]);return0;}导例:计算快递费问题描述某物流快递费用由起送费用和超重费用两部分构成,起送费用:1kg以内本地10元,异地15元,超重费用:每超重小于等于1kg加收5元。根据用户输入的实际起送费用以及超重量,计算并输出最终的快递费用。030201040506问题分析算法描述程序实现运行结果程序分析快递费用计算函数的形参fee定义为指针类型,通过指针反向传递计算结果。输入起送费用和超重量,调用快递费用计算函数,输出最终费用.定义快递费用计算函数时,将形参fee定义为指针类型。函数调用时,将主函数中的变量Fee的地址作为实参传递给形参fee,这时指针fee指向了变量Fee,在函数运行过程中,修改了*fee的值,即通过指针fee间接修改了主函数中的变量Fee的值。实现上述算法的C语言程序,包括地址作为参数传递,并通过指针返回结果。输出快递费。通过指针参数将计算结果写回主函数的变量。指针参数避免了数据复制,提高了函数调用的效率。导例:计算快递费程序实现#include<stdio.h>intmain(){intCalFee(int*fee,intweights);/*最终快递费用计算函数的声明*/intFee,Weights;printf("请输入起送费用和超重量(不足1kg按1kg计算):");scanf("%d%d",&Fee,&Weights);printf("起送费用:%d元\n",Fee);/*调用函数,若返回值为真,则执行以下的操作*/if(CalFee(&Fee,Weights))printf("最终费用:%d元\n",Fee);return0;}/*快递费用计算函数的定义*/intCalFee(int*fee,intweights){if((*fee==10||*fee==15)&&weights>=0){*fee=*fee+weights*5;return1;}elsereturn0;}指针变量01指针变量的定义用户可以在投影仪或者计算机上进行演示也可以将演示文稿打印出来用户可以在投影仪或者计算机上进行演示也可以将演示文稿打印出来用户可以在投影仪或者计算机上进行演示也可以将演示文稿打印出来02指针作为函数的参数—角色转换说明通过指针作为函数参数,可改变主调函数中变量的值,通过三个自定义函数的例子进行分析。03指针与数组用户可以在投影仪或者计算机上进行演示也可以将演示文稿打印出来用户可以在投影仪或者计算机上进行演示也可以将演示文稿打印出来用户可以在投影仪或者计算机上进行演示也可以将演示文稿打印出来04字符串和字符指针介绍字符串常量是指向首字符的指针常量,字符指针可用来处理字符串。04链表

温馨提示

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

评论

0/150

提交评论