第十八讲C语言高级编程结构和习题课_第1页
第十八讲C语言高级编程结构和习题课_第2页
第十八讲C语言高级编程结构和习题课_第3页
第十八讲C语言高级编程结构和习题课_第4页
第十八讲C语言高级编程结构和习题课_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第十八讲C语言高级编程结构和习题课2

结构的概念

通常,一个学生的个人信息,包括:学号、姓名、性别、年龄、各门功课的成绩等数据,这些数据都与一个学生相关联,类型各不相同。如果将这些数据定义为各独立的简单变量:

Number、Name、Sex、Age、Course1、Course2、…这样就难以反映它们之间的内在联系。应该把它们组织成一个组合项,把它们当作一个有机的整体。

——这个组合项就是结构(Structure)3结构类型及其定义把多个紧密关联的变量(分量)顺序组织在一起,定义成一个新的复合数据类型——结构类型定义一个结构类型struct结构类型名{

类型1分量名1;

类型2分量名2;......};结构分量的类型可以相同,也可不同同一个结构内的分量名不可相同structpoint{floatx;floaty;};4结构类型变量的定义结构类型只是定义了一种新的数据类型系统并不为这个新类型分配内存空间。可以使用新的结构类型来声明变量——结构类型变量。结构类型变量定义的两种形式:用已定义的结构定义变量,例如:

structpointpoint1; structpointpoint2;定义结构的同时定义结构类型的变量,例如:

structcity{floatx,y;intpopulation;}city1,city2;系统会为结构类型变量分配内存空间5结构类型变量中分量的访问结构类型变量的值由其各个分量构成对分量的访问一般通过“变量名.分量名”完成结构赋值及访问的例子:floatdx,dy;structpoint{floatx,y;}p1,p2,points[2];p1.x=p1.y=3.5f;p2.x=p2.y=1.5f;dx=p1.x-p2.x;dy=p1.y-p2.y;结构变量本身可以作为一个整体来使用points[0]=p1;points[1]=p2;6结构类型中的分量结构类型中分量的类型可以是任何类型基本数据类型的分量structpoint{floatx,y;};其他类型的分量:结构类型、数组类型分量的类型不能是未定义的结构类型分量的类型不能是正在定义的结构类型structcity{charname[32];structcitycity1;}x;structcity{structpoint{floatx,y;}location;intpopulation;charname[32];}city1;structcity{structpointlocation;intpopulation;charname[32];}city1;(city1.location).x7结构变量的内存布局结构中各分量在内存中顺序存放structsquare{structpoint{intx,y;}p1,p2;}sq1;sq1.p1.x=10;sq1.p1.y=20;sq1.p2.x=100;sq1.p2.y=200;主存储器1020100200**8结构变量所占内存的大小结构变量所占内存的大小并不完全等于于各分量所占字节数的总和structchar_frequency{charc;intfrequency;};sizeof(strcutchar_frequency)通常为8,而非5这是编译器在编译时的一个特殊要求。9结构应用示例(1)救援洪水淹没了很多房子,只有屋顶还是安全的。被困的人们都爬上了屋顶。现在救生船每次都从大本营出发,到各屋顶救人,救了人之后将人送回大本营。救生船每次从大本营出发,以速度50米/分钟时向下一个屋顶,达到一个屋顶后,救下其上的所有人,每人上船1分钟,船原路返回,达到大本营,每人下船0.5分钟。假设大本营与任意一个屋顶的连线不穿过其它屋顶。输入:第一行是屋顶数n,其后n行,每行是每个屋顶的坐标和人数输出:第一行是所有人都到达大本营并登陆所用的时间,其后n行,每行是每个屋顶的坐标和人数10图中原点是大本营,每个点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。11程序示例:succor.cpp12结构应用示例(2)学生成绩统计定义一个结构,包含学生的所有信息。structstudent{intnumber;charname[8];charsex;intage;floatcourse[8];};structstudentclass1[160];13单个变量、数组和结构数组和结构:多个变量的集合数组通过数组可定义大量类型相同的变量数组元素通过“变量[下标]”形式访问静态数组的大小(数组元素的个数)是预先确定的,即数组定义中数组个数必须是整数常量结构结构把一组密切相关的变量(类型可以不同)组织成一个整体结构的分量通过"变量.分量"形式访问14inta;charstr[100];scanf(“%d”,&a);gets(str);字符串与数值从控制台输入字符串:scanf():不能带空格gets():可以有空格在一个程序中,尽量只使用一种输入函数。当既要输入有空格的字符串,又要输入数值时,应避免使用以下方式:那该怎么办呢?15字符串与数值在输入数值时也使用gets(),得到表示数值的字符串,再将该字符串转换成数值。intatoi(char*str):将字符串转换成整数doubleatof(char*str):将字符串转换成浮点数#include<stdlib.h>16字符串与数值#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(){ chars[100]; doublex; inti; gets(s);/*Testofatof*/ x=atof(s); printf("atoftest:ASCIIstring:%sfloat:%lf\n",s,x); gets(s);/*Testofatoi*/ i=atoi(s); printf("atoitest:ASCIIstring:%sinteger:%d\n",s,i); return0;}17小明的药物动力学名词词典18小明的药物动力学名词词典回顾排序:排序的基本思想对数组intsz[LEN]进行排序,

可以分为LEN个步骤进行。

k步:把第

k大的数放在变量sz[LEN-k]中;

(K=1,2,3,4,…,LEN-1,LEN)19小明的药物动力学名词词典回顾排序:冒泡排序inte;for(intk=1;k<=LEN;k++){for(inti=0;i<LEN-k;i++){if(sz[i]>sz[i+1]){e=sz[i+1];sz[i+1]=sz[i];sz[i]=e;}}}20小明的药物动力学名词词典数据表示:字符串数组charword[100][100];字符串大小比较:strcmp(str1,str2)strcmp(word[i],word[i+1])>0字符串内容的交换:strcpy(str1,str2)chartemp[100];strcpy(temp,word[i]);strcpy(word[i],word[i+1]);strcpy(word[i+1],temp);21#include<stdio.h>#include<string.h>intmain(){intn,k,i;charword[100][100],temp[100];//字符串数组scanf("%d",&n);for(i=0;i<n;i++){//输入字符串scanf("%s",word[i]);}for(k=1;k<=n;k++){//排序for(i=0;i<n-k;i++){if(strcmp(word[i],word[i+1])>0){//字符串大小比较strcpy(temp,word[i]);//字符串交换strcpy(word[i],word[i+1]);strcpy(word[i+1],temp);}}}for(i=0;i<n;i++){//输出字符串printf("%s\n",word[i]);}return0;}22大整数的加法问题描述请编写一个程序帮助统计局完成以下计算任务: 从键盘输入两个正整数m和n(根据统计需要,m和n最多可以是200位十进制正整数),计算m和n的和,并打印输出。23大整数的加法计算83856+129476解决输入的问题:利用字符数组接收输入;为了进行计算:把字符数组转换成整数数组,每个元素 与字符数组中的每个字符相对应;转换过程中可以顺便更换一下摆放顺序,以便符合我们平时的竖式计算习惯;按照规则进行计算,用数组元素操作每一位(注意进位);把操作结果按照“先高位再低位”的顺序输出出来;83856129476838561294766583867492123331221333224#defineMAX_LEN201#include<string.h>intmain(){

intan1[MAX_LEN]={0},an2[MAX_LEN]={0};intsum[MAX_LEN]={0}; charseLine1[MAX_LEN],seLine2[MAX_LEN]; printf("pleaseinputtwointegers:\n"); gets(seLine1); gets(seLine2); intnLen1=strlen(seLine1); intnLen2=strlen(seLine2);使用strlen()函数:

获得字符串的长度!25 inti,j;

//将输入的两个字符数组变成整数数组,并倒置 for(i=nLen1-1,j=0;i>=0;i--,j++){ an1[j]=seLine1[i]-'0'; }

for(i=nLen2-1,j=0;i>=0;i--,j++){ an2[j]=seLine2[i]-'0'; }

83856\0129476\065838000006749210000字符数组整数数组26 intcarry=0;//进位值 for(i=0;i<MAX_LEN;i++) { sum[i]=an1[i]+an2[i]+carry; if(sum[i]>=10){ sum[i]-=10; carry=1;

}else{ carry=0; } } i=MAX_LEN-1; while(sum[i]==0){//找到第一个不为0的位

i--; } for(;i>=0;i--){//假设总和不为0! printf("%d",sum[i]);//输出每一位数 }

printf("\n"); return0;}658380000067492100002333120000213332carry27算法的效率——素数问题判断一个数是否素数intisPrimeNumber(intp){ inti,half,isPrime=1; if(p%2==0){ if(p==2){ returnisPrime; }isPrime=0; returnisPrime; } half=p-

1; for(i=3;i<=half;i=i+2){ if(p%i==0){ isPrime=0; break; } }

returnisPrime;}half=p/2;half=sqrt(p);28算法的效率——素数问题验证哥德巴赫猜想intGoldba

温馨提示

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

评论

0/150

提交评论