项目六用指针优化学生成绩排名市公开课金奖市赛课一等奖课件_第1页
项目六用指针优化学生成绩排名市公开课金奖市赛课一等奖课件_第2页
项目六用指针优化学生成绩排名市公开课金奖市赛课一等奖课件_第3页
项目六用指针优化学生成绩排名市公开课金奖市赛课一等奖课件_第4页
项目六用指针优化学生成绩排名市公开课金奖市赛课一等奖课件_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

项目六用指针优化学生成绩排名

项目要求一个班有40位学生参与了期终考试(考了三门课),请用指针优化学生成绩排名。即用指针实现数组输入输出以及数组排序(在函数中进行)。项目分析要用指针优化学生成绩排名,第一必须要理解指针概念、引用;第二必须会用指针实现数组输入输出;第三在函数中用指针实现数组排序,然后调用此函数。为了在简介时候条理清楚,因此分解成5个任务。第1页第1页任务1理解指针一、问题情景一个班进行了一次考试,现要将几种学生成绩输入,用指针方式输出。知识点:1、指针概念;2、指针引用;第2页第2页(一)地址概念与取地址运算地址——内存单元编号(在计算机中,把内存区划 分为一个一个存储单元,每个单元为一个字节,它 们都有一个编号,这个编号就是内存地址)

但&不能施加在常量或表示式前。如:inta=3;&a就是变量在内存中地址。能够用printf(“%x\n”,&a);看出其地址。注意:

这个地址并不是始终不变,这是由机器和操作系统来安排,我们无法预先知道。取地址运算——&

三、相关知识第3页第3页(二)指针概念——一个变量在内存中存储时地址,它并不占内存中存储空间。简朴地说,指针就是地址。两者是同一个概念两种说法。只但是指针更形象一些,就像一个针同样,能够指向某个地方。三、相关知识第4页第4页概念既然存储在内存中各种变量都有一个地址,我们能否这样设想:定义某种变量,让这个变量值始终等于某个变量地址,如同某个房间号、门牌号同样?回答是必定。我们把这种存储某种变量地址变量称为指针变量。….3510ab240ff52240ff56p240ff52q240ff56因此,在C语言中,将地址形象化地称为指针(三)指针变量三、相关知识第5页第5页阐明a.*是定义指针变量标志,不可丢掉b.数据类型是指针变量所指向变量类型c.指针变量定义后,其值是不拟定1、定义

[存储类型]数据类型*指针变量名如:int*p,a=3;

int*q,b=5;

指针变量定义和赋值三、相关知识第6页第6页2、赋值:能够进行初始化,也能够使用赋值语句(1)初始化:inta,*s=&a;(2)赋值语句inta,*s;s=&a;(3)注意:只能用同类型变量地址进行赋值!如定义:int*s;floatf;则s=&f;是非法。三、相关知识第7页第7页1、&——取地址运算如:int*p,i=3,j=5;p=&i;/*让p其指向变量i*/2、*——指针运算,则代表取指针所指向单元内容。

区分:*运算符在不同场合作用,编译器能够依据上下文环境判别*作用。inta,b,c;int*p;(*表示定义指针)p=&a;*p=100;(*表示指针运算符)c=a*b;(*表示乘法运算符)指针变量引用三、相关知识第8页第8页#include<stdio.h>voidmain(){inta,b,*pointer_1,*pointer_2;a=100,b=200;pointer_1=&a;pointer_2=&b;printf("%d,%d\n",a,*pointer_1);printf("%d,%d\n",b,*pointer_2);}【例6-1】指针与地址应用第9页第9页main()

{int*p1,*p2,a1,a2;

scanf(“%d%d”,&a1,&a2);

p1=&a1;p2=&a2;

printf(“%d,%d\n”,*p1,*p2);

p2=p1;printf(“%d,%d\n”,*p1,*p2);}定义指针变量指针赋值,把a1地址给p1指针运算,p1指针所指向变量a1内容直接赋值,把p1指针地址给p2,即p2也指向a1若输入“34”,则输出为何?第10页第10页#include<stdio.h>voidmain(){int*p1,*p2,a,b;printf("输入:");scanf("%d,%d",&a,&b);p1=&a;p2=&b;printf("输出:");printf("a=%d,b=%d\n",a,b);printf("*p1=%d,*p2=%d\n",*p1,*p2);}任务1详细实现第11页第11页【例6-2】输入两个学生成绩,按从小到大顺序输出。#include<stdio.h>voidmain(){int*p1,*p2,*p,a,b;printf("输入:");scanf("%d,%d",&a,&b);p1=&a;p2=&b;

if(a>b){p=p1;p1=p2;p2=p;}printf("输出:");printf("a=%d,b=%d\n",a,b);printf("min=%d,max=%d\n",*p1,*p2);}第12页第12页swap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf(“%d,%d”,&a,&b);if(a<b)swap(a,b);printf(“%d,%d\n”,a,b);}如何用函数调用方式实现两个数调换?形参不能传递给实参!此办法不能实现两个数调换!?第13页第13页指针变量作为函数参数函数能够通过return返回一个值,假如要函数返回多个值怎么办?指针传递方式来改变【例6-3】用指针变量作为函数参数,实现数据互换。#include<stdio.h>voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}voidmain(){inta,b,*pointer_1,*pointer_2;printf("输入a,b值:");scanf("%d,%d",&a,&b);pointer_1=&a,pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("调用函数后输出a,b值为:");printf("%d,%d\n",a,b);}注意:

指针变量作为函数参数,从实参向形参数据传递仍然遵循“单向值传递”原则,只但是此时传递是地址.第14页第14页【例6-12】假如上例中互换函数互换是指针,

则结果如何?

#include<stdio.h>voidswap(int*p1,int*p2){int*temp;

temp=p1;p1=p2;p2=temp;

}

voidmain(){inta,b,*pointer_1,*pointer_2;printf("输入a,b值:");scanf("%d,%d",&a,&b);pointer_1=&a,pointer_2=&b;

swap(pointer_1,pointer_2);printf("调用函数后输出a,b值为:");printf("%d,%d\n",a,b);printf(“调用函数后输出*pointer_1,*pointer_2值为:");printf("%d,%d\n",*pointer_1,*pointer_2);}

第15页第15页举一反三【例6-11】输入a、b、c3个整数,按从大到小顺序输出。#include<stdio.h>voidswap(int*a,int*b){intt;t=*a;*a=*b;*b=t;}

voidmain(){inta,b,c,*p1,*p2,*p3;printf("请输入3个数,以逗号隔开:");scanf("%d,%d,%d",&a,&b,&c);p1=&a;p2=&b;p3=&c;if(a<b)swap(p1,p2);if(a<c)swap(p1,p3);if(b<c)swap(p2,p3);printf("从大到小顺序为:");printf("%d,%d,%d\n",a,b,c);}第16页第16页第17页第17页任务2用指针优化全班同窗一门课成绩输入输出一、问题情景一个班有40个同窗进行了一次考试,现要用指针实现全班同窗成绩输入输出。二、详细实现(以十个学生为例)办法一:下标法(惯用,很直观)#include<stdio.h>main(){intscore[10],i;printf("请输入10个学生成绩\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("输出10个学生成绩为\n");for(i=0;i<10;i++)printf("%3d",score[i]);printf("\n");}第18页第18页(一)指向一维数组指针a[0]a[1]a[2]a[3]a[4]复习:一维数组在内存中存储办法?inta[5];数组元素地址:&a[i]数组首地址:&a[0]或a三、相关知识第19页第19页1、指针与一维数组相应关系

inta[10],*p=a;使p指向a数组第一个元素a[0]各元素指针按存储单元递增a[0]a[2]a[4]a[3]a[6]a[7]a[1]a[5]a[8]a[9]memorypp+1p+2p+92、用指针访问数组普通形式

对下标为i元素访问:

a[i],*(a+i),*(p+i)

对a[i]地址表示:

&a[i],a+i,p+i

指向数组访问数组两种方式:下标方式,指针方式三、相关知识第20页第20页(1)下标法(惯用,很直观)#include<stdio.h>main(){intscore[10],i;printf("请输入10个学生成绩\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("输出10个学生成绩为\n");for(i=0;i<10;i++)printf("%3d",score[i]);printf("\n");}三、相关知识第21页第21页(2)用数组名计算数组元素地址。(效率与下标法相同,不惯用)三、相关知识#include<stdio.h>main(){intscore[10],i;printf("请输入10个学生成绩\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("输出10个学生成绩为\n");for(i=0;i<10;i++)printf("%3d",*(score+i));printf("\n");}第22页第22页(3)用指针访问各元素。(惯用,效率高)三、相关知识#include<stdio.h>main(){intscore[10],*p,i;printf("请输入10个学生成绩\n");for(i=0;i<10;i++)scanf("%d",&score[i]);printf("输出10个学生成绩为\n");for(p=score;p<score+10;p++)printf("%3d",*p);printf("\n");}第23页第23页【例6-5】下面程序在输入1234567890后输出结果还是1234567890吗?#include<stdio.h>voidmain(){inta[10],*p,i;p=a;for(i=0;i<10;i++)scanf("%d",p++);printf("\n");for(i=0;i<10;i++,p++)printf("%d",*p);}输入:1234567890如何处理?输出:#include<stdio.h>voidmain(){inta[10],*p,i;p=a;for(i=0;i<10;i++)scanf("%d",p++);/*尤其要注意输入时指针改变*/printf("\n");p=a;

/*使p指针重新指向了数组首地址*/for(i=0;i<10;i++,p++)printf("%d",*p);}小结:(1)指针变量能够实现本身值改变。如:pa++;而数组名所代表地址则不能改变,a++是错误使用办法。(2)应注意指针变量当前值。如上例。(3)指针变量能够指向数组中各个内存单元。第24页第24页指针使用几种细节设指针p指向数组a(p=a),则:注意①*p++,相称于*(p++)②*(p++):先取*p,再使p加1*(++p):先使p加1,再取*p(*p)++:表示p指向元素值加1。第25页第25页实训汇报11第26页第26页第27页第27页指向二维数组指针1、二维数组结构分析设有数组定义为:inta[3][4];则有:a表示数组在内存中首地址。a+i=a[i]=&a[i][0]代表第i行首地址第28页第28页二维数组逻辑结构图下列:a[0][3]a[0][2]a[0][1]a[0][0]a[1][3]a[1][2]a[1][1]a[1][0]a[2][3]a[2][2]a[2][1]a[2][0]a[0]a[1]a[2]a+0a+2a+1指向二维数组指针第29页第29页2、指向二维数组中一行指针变量(1)格式:类型名(*指针变量名)[每一行元素个数];(2)比如:int(*p)[4];(3)含义:p是指针变量,它指向一个数组,数组

每一行含有4个元素,每个元素类型是int。我们能够定义一个指向行向量指针,让它指向二维数组第一行,该指针加1,就指向二维数组下一行,这样指针就叫做行指针。第30页第30页若定义:inta[3][4],(*pa)[4]=a;则关系图为:a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]apa

(*pa)[0](*pa)[1](*pa)[2](*pa)[3]假如执行pa++,则变为如图所表示pa++pa那么(*pa)[0]、(*pa)[1]、(*pa)[2]、(*pa)[3]

也变了第31页第31页设p为指向二维数组指针变量,若p=b[0],可定义为int(*p)[4],p=b,则p+i指向一维数组b[i],而*(*(p+i)+j)则是i行j列元素值。*(*(b+i)+j)式子是依据二维数组名计算i行j列元素值;尚有一个直接采用首元素地址计算i行j列元素办法。

其格式下列:*(首元素地址+行号*列数+列号)第32页第32页【例6-6】用几种办法输出二维数组各元素值。

#include<stdio.h>voidmain(){ints[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inti,j,(*p)[4];

introw,col;

p=s;printf("用二维数组指针变量计算i行j列元素办法\n");

for(i=0;i<3;i++){ for(j=0;j<4;j++)

printf("%8d",*(*(p+i)+j)); printf("\n");}

printf("用二维数组数组名计算i行j列元素办法\n");

for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%8d",*(*(s+i)+j)); printf("\n");}

printf("用直接采用首元素地址计算i行j列元素办法\n");

row=3;col=4;for(i=0;i<row;i++){for(j=0;j<col;j++)printf("%8d",*(&s[0][0]+i*col+j));printf("\n");}}第33页第33页有3个学生,各学4门课,

计算某一位学生平均成绩#include<stdio.h>voidaverage(float(*p)[4]){intj;floatsum=0;for(j=0;j<4;j++)sum+=(*p)[j];printf("这位学生平均分为%5.2f\n",sum/4);}例main(){floatscore[3][4]={{66,67,70,60},{80,87,90,81},{90,99,100,98}};average(score[2]);}第34页第34页任务4用指针优化学生姓名排序一、问题情景一个班里有40个学生,在选举班干部时有3个候选人,现要求对候选人以姓氏英文顺序排序,请用C中字符指针处理此问题。分析:要将3个候选人以姓氏英文顺序排队,要求用C中字符指针处理此问题,因此,在本任务中将要处理什么是字符指针,字符指针如何引用。第35页第35页三、相关知识(一)字符串表示形式1.用字符数组实现#include<stdio.h>main(){charstring[]="IloveChina!";printf("%s\n",string);}2.用字符指针实现

#include<stdio.h>main(){char*string="IloveChina!";printf("%s\n",string);}一、字符串表现形式C语言中,有两种方式能够实现字符串:字符数组、字符指针。第36页第36页第37页第37页【例6-9】将字符串a复制到字符串b。办法一#include<stdio.h>voidmain(){chara[]="Iamaboy.",b[20],*p1,*p2;inti;p1=a;p2=b;

for(;*p1!='\0';p1++,p2++)*p2=*p1;*p2='\0';printf("stringais:%s\n",a);printf("stringbis:%s\n",b);printf("\n");}办法二#include<stdio.h>voidmain(){char*a="Iamaboy.",*b;

b=a;printf("stringais:%s\n",a);printf("stringbis:%s\n",b);printf("\n");}注意:若a,b都是字符指针,则能够用b=a,即将a地址赋给b,但是若a,b是字符数组,则不能用b=a,应用strcpy(b,a)第38页第38页用指针实现:

输入一个字符串,把其中大写字母变成小写字母。#include<stdio.h>main(){charstr[80],*pt;gets(str);for(pt=str;*pt!='\0';pt++)if(*pt>='A'&&*pt<='Z')*pt+=32;

printf("stringis:\n%s\n",str);}第39页第39页用指针实现:输入一个字符串,求出字符串长度函数。

并在主函数中实现调用。#include<stdio.h>intstr_len(char*str){char*pt;intcount=0;for(pt=str;*pt!='\0';pt++)count++;returncount;

}main(){charstr[80];printf("请输入一个字符串\n");gets(str);printf("该字符串长度为%d\n",str_len(str));}第40页第40页#include<stdio.h>#include"string.h"main(){char*name1="张小明",*name2="李大刚",*name3="周建华",*tt;if(strcmp(name1,name2)<0){tt=name1;

温馨提示

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

评论

0/150

提交评论