C语言高级编程结构与习题课课件

PPT
  • 阅读 59 次
  • 下载 0 次
  • 页数 32 页
  • 大小 553.500 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言高级编程结构与习题课课件
可在后台配置第一页与第二页中间广告代码
C语言高级编程结构与习题课课件
可在后台配置第二页与第三页中间广告代码
C语言高级编程结构与习题课课件
可在后台配置第三页与第四页中间广告代码
C语言高级编程结构与习题课课件
C语言高级编程结构与习题课课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 32
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】C语言高级编程结构与习题课课件.ppt,共(32)页,553.500 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2250.html

以下为本文档部分文字说明:

第十八讲C语言高级编程结构与习题课北京大学信息学院第1页,共32页。2结构的概念通常,一个学生的个人信息,包括:学号、姓名、性别、年龄、各门功课的成绩等数据,这些数据都与一个学生相关联,类型各不相同。如果将这些数据定义为各独立的简单变量:Number、Name、Sex、Age、Cours

e1、Course2、…这样就难以反映它们之间的内在联系。应该把它们组织成一个组合项,把它们当作一个有机的整体。——这个组合项就是结构(Structure)第2页,共32页。3结构类型及其定义把多个紧密关联的变量(分量)顺序组织在一起,定义成一个新的复

合数据类型——结构类型定义一个结构类型struct结构类型名{类型1分量名1;类型2分量名2;......};结构分量的类型可以相同,也可不同同一个结构内的分量名不可相同structpoint{floatx;flo

aty;};第3页,共32页。4结构类型变量的定义结构类型只是定义了一种新的数据类型系统并不为这个新类型分配内存空间。可以使用新的结构类型来声明变量——结构类型变量。结构类型变量定义的两种形式:用已定义的结构定义变量,例如:structpoin

tpoint1;structpointpoint2;定义结构的同时定义结构类型的变量,例如:structcity{floatx,y;intpopulation;}city1,city2;系统会为结构类型变量分配内存空间第4页,共32页。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;第5页,共32页。6结构类型中的分量结构类型中分量的类型可以是任何类型基本数据类型的分量structpoint{floatx,y;};其他类

型的分量:结构类型、数组类型分量的类型不能是未定义的结构类型分量的类型不能是正在定义的结构类型structcity{charname[32];structcitycity1;}x;structcity{structpoint{floatx,y;}l

ocation;intpopulation;charname[32];}city1;structcity{structpointlocation;intpopulation;charname[32];}city1;(city1.location).x第6页,

共32页。7结构变量的内存布局结构中各分量在内存中顺序存放structsquare{structpoint{intx,y;}p1,p2;}sq1;sq1.p1.x=10;sq1.p1.y=20;sq1.p2.x=100;sq1.p2.y=200;主存储器sq1.p1.x1

020100200**sq1.p1.ysq1.p2.xsq1.p2.y第7页,共32页。8结构变量所占内存的大小结构变量所占内存的大小并不完全等于于各分量所占字节数的总和structchar_frequency{charc;intfrequency;};sizeof(strcutchar_fre

quency)通常为8,而非5这是编译器在编译时的一个特殊要求。第8页,共32页。9结构应用示例(1)救援洪水淹没了很多房子,只有屋顶还是安全的。被困的人们都爬上了屋顶。现在救生船每次都从大本营出发,到各屋顶救人,救了人之后将人送回大本营。

救生船每次从大本营出发,以速度50米/分钟时向下一个屋顶,达到一个屋顶后,救下其上的所有人,每人上船1分钟,船原路返回,达到大本营,每人下船0.5分钟。假设大本营与任意一个屋顶的连线不穿过其它屋顶。输入:第一行是屋

顶数n,其后n行,每行是每个屋顶的坐标和人数输出:第一行是所有人都到达大本营并登陆所用的时间,其后n行,每行是每个屋顶的坐标和人数第9页,共32页。10NiiiipspeedyxtotalTime1

22))5.01(2(图中原点是大本营,每个点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。第10页,共32页。11程序示例:succor.cpp第11页,共32页。12结构应用示例(2)学生成绩统计定义一个结构,包含学生的所有信息。structstudent{int

number;charname[8];charsex;intage;floatcourse[8];};structstudentclass1[160];第12页,共32页。13单个变量、数组和结构数组和结构:多个变量的集合数组通过数组可

定义大量类型相同的变量数组元素通过“变量[下标]”形式访问静态数组的大小(数组元素的个数)是预先确定的,即数组定义中数组个数必须是整数常量结构结构把一组密切相关的变量(类型可以不同)组织成一个整体结构的分量通过"变量.分量"形式访问第13页,共32页。i

nta;charstr[100];scanf(“%d”,&a);gets(str);字符串与数值从控制台输入字符串:scanf():不能带空格gets():可以有空格在一个程序中,尽量只使用一种输入函数。当既要输入有空格的字符串,又要输入数值时,应避免使用

以下方式:14那该怎么办呢?第14页,共32页。字符串与数值在输入数值时也使用gets(),得到表示数值的字符串,再将该字符串转换成数值。intatoi(char*str):将字符串转换成整数doubleatof(c

har*str):将字符串转换成浮点数15#include<stdlib.h>第15页,共32页。字符串与数值16#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(){ch

ars[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;}第16页,共32页。小明的药物动力学名词词典17第17页,共32页。小明的药物动力学名词词典回顾排序:排序的基

本思想18对数组intsz[LEN]进行排序,可以分为LEN个步骤进行。第k步:把第k大的数放在变量sz[LEN-k]中;(K=1,2,3,4,…,LEN-1,LEN)第18页,共32页。小明的药物动力学名词词典回顾排序:冒泡排序19inte;for(intk=1;k<=LEN;k++){fo

r(inti=0;i<LEN-k;i++){if(sz[i]>sz[i+1]){e=sz[i+1];sz[i+1]=sz[i];sz[i]=e;}}}第19页,共32页。小明的药物动力学名词词典数据表示:字符串数组charword[100][10

0];字符串大小比较: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);20第20页,共32页。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],w

ord[i+1]);strcpy(word[i+1],temp);}}}for(i=0;i<n;i++){//输出字符串printf("%s\n",word[i]);}return0;}第21页,共32页。22大整数的加法问题描述请编写一个程序帮助统计局完成以下计算任

务:从键盘输入两个正整数m和n(根据统计需要,m和n最多可以是200位十进制正整数),计算m和n的和,并打印输出。第22页,共32页。23大整数的加法计算83856+129476解决输入的问题:利用字符数组接收输入;为了进行计算:把字符数组转换成整数数组,每个元素与字符数组中的每个字符

相对应;转换过程中可以顺便更换一下摆放顺序,以便符合我们平时的竖式计算习惯;按照规则进行计算,用数组元素操作每一位(注意进位);把操作结果按照“先高位再低位”的顺序输出出来;83856129476838561294766583

8674921233312213332第23页,共32页。24#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()函数:获得字符串的长度!第24页,共32页。25inti,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字符数组整数数组第25页

,共32页。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;}658380000

06749210000233312000021333226carry第26页,共32页。算法的效率——素数问题判断一个数是否素数27intisPrimeNumber(intp){inti,half,is

Prime=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);第27页,共32页。算法的效率——素数问题验证哥德巴赫猜想28intGoldbachConjecture(intn)//验证偶数n满足哥德巴赫猜想{inthalf=n/2;//求出半数n/2待用inti,result=0,isPr

ime1,isPrime2;for(i=3;i<=half;i=i+2){isPrime1=isPrimeNumber(i);isPrime2=isPrimeNumber(n-i);if(isPrime1&&isPrime2){printf("%d=%

d+%d\n",n,i,n-i);result=1;break;}}returnresult;}大于6的偶数能够分解为2个素数的和第28页,共32页。算法的效率——素数问题求小于n的所有素数:简单判断法29voidAllPrimes(intn)//假设n>2{inti;/

/循环变量intisPrime;//临时变量printf(“Theprimeslessthan%dare2”,n);for(i=3;i<=n;i=i+2){isPrime=isPrimeNumber(i);if(isPrime){pri

ntf(“,%d",i);}}}第29页,共32页。30voidAllPrimes(intn)//假设n>2{intnumber=1;//小于n的素数的个数intprimes[100];//用于存放素数inti,j;//循环变量primes[0]=2;//2是第一

个素数printf(“Theprimeslessthan%dare2”,n);for(i=3;i<=n;i=i+2){//判断i是否被它之前的素数整除for(j=0;primes[j]*primes[j]<i;j++){

if(i%primes[j]==0)break;}if(primes[j]*primes[j]>i)//如果i不能被它之前的素数整除,则它也是素数{primes[number]=i;number++;printf((“,%d",i);}}}一个效率更高的算法:如果一个数不是素数那么它一定

是若干个小于它的素数的乘积,并且它小于在它之前的那个最大素数的平方。问题:修改这个函数,求第n个素数?求小于n的所有素数第30页,共32页。31intnthPrime(intn){intnumber=1;//小于n的素数的个数int*primes=(

int*)malloc(sizeof(int)*n);//用于存放素数inti,j;//循环变量primes[0]=2;//2是第一个素数if(n==1)return2;for(i=3;;i=i+2){//判断i是否被它之前的素数整除for(j=0;

primes[j]*primes[j]<i;j++){if(i%primes[j]==0)break;}if(primes[j]*primes[j]>i)//如果i不能被它之前的素数整除,则它也是素数{primes[number]=i;number++;if(number

==n){returni;}}}}求第n个素数第31页,共32页。后续课程安排今天是最后一次作业,大家辛苦了!12月12日讲链表12月14日讲文件(乐驹),下午上机第一次模拟测试,必须参加。12月21日总复习,下午上机第二次

模拟测试。12月30日下午2点答疑?(初定)32第32页,共32页。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?