版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章数组及结构体
4.1数组及其元素控制
4.2字符数组与字符串
4.3结构体4.4较多数据的程序设计实例2/28/20241石家庄经济学院信息工程学院·C语言课程组1.目的、要求熟练掌握一维数组的定义和引用。熟练掌握二维数组的定义和引用。掌握字符数组的定义、初始化和引用。掌握结构体类型的定义、结构体变量的引用和初始化。掌握结构体数组。2/28/20242石家庄经济学院信息工程学院·C语言课程组2.重点、难点
一维数组、二维数组的定义和使用。
掌握字符数组的定义和使用,字符串的使用和字符串函数的应用。结构体的基本概念、结构体数据类型及变量的定义结构体类型数组。2/28/20243石家庄经济学院信息工程学院·C语言课程组4.1数组及其元素控制Rate1.53.20.0945.39873210下标标明了元素在数组中的位置
数组元素下标定义:把具有相同类型的若干变量按有序的形式组织起来就是数组。说明:(1)数组是可以在内存中连续存储多个元素的结构。
(2)数组中的所有元素必须属于相同的数据类型。2/28/20244石家庄经济学院信息工程学院·C语言课程组4.1数组及其元素控制数组的分类按维数划分:按元素类型划分:一维数组二维数组多维数组数值数组字符数组结构体数组指针数组2/28/20245石家庄经济学院信息工程学院·C语言课程组4.1数组及其元素控制数组的分类2/28/20246石家庄经济学院信息工程学院·C语言课程组1.一维数组的定义定义方式:数据类型数组名[常量表达式];
内存分配
合法标识符表示元素个数下标从0开始a[0]0145a[1]a[2]a[3]a[4]a[5]23a编译时分配连续内存内存字节数=数组长度*sizeof(元素数据类型)数组名表示内存首地址,是地址常量4.1.1一维数组正确的定义方法:intnum[50];charlist[20];doublelevel[6];错误的定义方法:intnum;num=20;Int
a[num];
#defineN20...int
codes[N];例
inta[6];2/28/20247石家庄经济学院信息工程学院·C语言课程组2.一维数组元素的引用数组必须先定义,后使用;
数组元素的表示形式:数组名[下标];只能逐个引用数组元素,不能一次引用整个数组;4.1.1一维数组intnum[5];/*定义数组num*/num数组包含5个元素:num[0],num[1],num[2],num[3],num[4]注意:C语言中规定,数组元素下标从0开始;不存在num[5]元素数组元素的赋值:for(i=0;i<5;i++)
scanf(“%d”,&sum[i]);两个数组之间的赋值:for(i=0;i<5;i++)
b[i]=sum[i];例
inta[10];
printf(“%d”,a);(
)必须
for(j=0;j<10;j++)
printf(“%d\t”,a[j]);(
)2/28/20248石家庄经济学院信息工程学院·C语言课程组3.一维数组的初始化C语言对数组初始化的规定:可以只给部分元素赋初值。例:inta[10]={0,1,2,3};如不给数组初始化,则全部元素隐含均为0值。只能给元素逐个赋值,不能给数组整体赋值。如:inta[3]={2,2,2};不能写成:inta[3]=2;如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。如:inta[]={1,2,4,5,6};4.1.1一维数组2/28/20249石家庄经济学院信息工程学院·C语言课程组3.一维数组的初始化其他的初始化情况:判断下面的语句是否正确intarr[10]={10,9,8,7,6,5,4,3,2,1,0};
intarr[10]={9,8,7,5};int
arr[]={9,8,7};
int
arr[]={};
4.1.1一维数组//错误!越界了
//正确,后面的6个元素未初始化//正确:元素个数为3//错误,到底是几个元素?2/28/202410石家庄经济学院信息工程学院·C语言课程组例4.1:输入5个数,用冒泡排序算法,按照降序排列这一组数(从大到小)。冒泡排序思路:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序,若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。可以看出如果有n个元素,那么一共要进行n-1轮比较,第i轮要进行j=n-i
次比较。(如:有5个元素,则要进行5-1轮比较。第3轮则要进行5-3次比较)。2/28/202411石家庄经济学院信息工程学院·C语言课程组#include<stdio.h>#defineN5voidmain(){
int
grade[N],temp,i,j;
printf("请输入%d个数",N);
for(i=0;i<N;i++)
scanf("%d",&grade[i]);
for(i=0;i<N;i++) { for(j=0;j<N-i-1;j++) {//找出最小的数,放在最后
if(grade[j]<grade[j+1]) { temp=grade[j+1]; grade[j+1]=grade[j];
grade[j]=temp; } } }
for(i=0;i<N;i++)
printf("%d,",grade[i]);}2/28/202412石家庄经济学院信息工程学院·C语言课程组#include<stdio.h>#defineN5voidmain(){
int
grade[N],temp,i,j;
printf("请输入%d个数",N);
for(i=0;i<N;i++)
scanf("%d",&grade[i]);
for(i=0;i<N;i++) { for(j=i;j<N-1;j++) {//找出最大的数,放在最前面
if(grade[i]<grade[j+1]) { temp=grade[j+1]; grade[j+1]=grade[i];
grade[i]=temp; } } }
for(i=0;i<N;i++)
printf("%d,",grade[i]);}2/28/202413石家庄经济学院信息工程学院·C语言课程组思路(1)将待插入数,顺序与原有序数据比较,寻找待插入位置。(2)将待插入位置处的数据及其后续数据依此后移,留出插入位置。(3)将该数插入。例4.2:如果一个数组中保存的元素是有序的(由小到大),向这个数组中插入一个数,使得插入后的数组元素依然保持有序。数组应用42/28/202414石家庄经济学院信息工程学院·C语言课程组数组应用4#defineN5#include<stdio.h>voidmain(){
intnum[N+1]={23,45,60,67,88},in;
int
i,j;
printf("\n
请输入一个要插入的数:");
scanf("%d",&in);
for(i=0;i<N;i++) {
if(num[i]>in) break; }
for(j=N;j>i;j--)
num[j]=num[j-1];
num[i]=in;
printf("\n
插入后的数组元素:\n");
for(i=0;i<N+1;i++)
printf("%d",num[i]);
printf("\n");}2/28/202415石家庄经济学院信息工程学院·C语言课程组4.1.2二维数组inti,j,num[4][2];for(i=0;i<=3;i++){for(j=0;j<=1;j++){
scanf("%d",&num[i][j]);}}ijnum[i][j]0010001200103001140020500216003070031800二维数组的赋值:2/28/202416石家庄经济学院信息工程学院·C语言课程组二维数组的初始化:分行初始化
inta[2][3]={{1,2,3},{4,5,6}};
(全部初始化)
inta[2][3]={{1,2},{4}};
(部分初始化)按元素排列顺序初始化
inta[2][3]={1,2,3,4,5,6};(全部初始化)
inta[2][3]={1,2,3};(部分初始化)第一维的长度可以省略,但第二维的长度不能省。
inta[][3]={{1},{4,5}};
inta[][3]={1,2,3,4,5};2/28/202417石家庄经济学院信息工程学院·C语言课程组程序举例【例4.3】
已知矩阵a,先输出a,再求它的转置矩阵b,并输出b。a=123456b=142536#include<stdio.h>voidmain(){inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2],i,j;
printf(“输出数组a:\n");
for(i=0;i<=1;i++){for(j=0;j<=2;j++) {printf("%5d",a[i][j]);
b[j][i]=a[i][j]; }
printf("\n");}
printf(“数组b:\n");
for(i=0;i<=2;i++){for(j=0;j<=1;j++) printf("%5d",b[i][j]);
printf("\n");}}思路:1.定义数组a和数组b;2.赋值或初始化数组a;3.搞清数组a中各元素下标与数组b中元素下标的关系;4.将数组a中元素的值按3中确定的关系赋给数组b中的元素。2/28/202418石家庄经济学院信息工程学院·C语言课程组【例4.4】输入学号分别为1,2和3的学生两门课程的成绩,然后输出。要求程序运行结果如下:(采用二维数组存储)
输入学号1两门课程的成绩:6556
输入学号2
两门课程的成绩:7880
输入学号3
两门课程的成绩:8966
学员的学号及其两个学期的成绩为:学号第一门课第二门课
165562788038966Pressanykeytocontinue思路:1.定义二维数组student[3][2];2.赋值或初始化数组student;3.按给定格式输出;本程序的关键在于怎样才能按给定的行,列格式输入、输出。2/28/202419石家庄经济学院信息工程学院·C语言课程组inti,j,student[3][2];for(i=0;i<3;i++){
printf("\n
输入学号%d两门课程的成绩:",i+1);
for(j=0;j<2;j++)
scanf("%d",&student[i][j]);}printf("\n
学员的学号及其两门课程的成绩为:\n");printf("\n
\t学号\t第一学期\t第二学期");for(i=0;i<3;i++){
printf("\n\t");printf("%d\t",i+1);
for(j=0;j<2;j++)
printf("%d\t\t",student[i][j]);
printf("\n");}2/28/202420石家庄经济学院信息工程学院·C语言课程组4.2字符数组与字符串字符串结束符一维字符数组:定义:charch[10];(1)逐个字符初始化:charch[5]={‘H’,’e’,’l’,’l’,’o’};(2)用字符串常量初始化:charch[6]=“Hello”;注意下面两种初始化方法的区别:
charch[]={‘H’,‘e’,‘l’,‘l’,‘o’};charch[]=“Hello”;
hello02314
hello\00231452/28/202421石家庄经济学院信息工程学院·C语言课程组二维字符数组:定义:charch[5][7];初始化:例
charfruit[][7]={{’A’,’p’,’p’,’l’,’e’},{‘O’,’r’,’a’,’n’,’g’,’e’},{‘G’,’r’,’a’,’p’,’e’},{‘P’,’e’,’a’,’r’},{‘P’,’e’,’a’,’c’,’h’}};fruit[0]fruit[1]fruit[2]fruit[3]fruit[4]Apple\0\0Orange\0Grape\0\0Pear\0\0\0Peach\0\02/28/202422石家庄经济学院信息工程学院·C语言课程组二维数组初始化:例
charfruit[][7]={“Apple”,”Orange”,”Grape”,”Pear”,”Peach”};fruit[0]fruit[1]fruit[2]fruit[3]fruit[4]Apple\0\0Orange\0Grape\0\0Pear\0\0\0Peach\0\02/28/202423石家庄经济学院信息工程学院·C语言课程组字符串的输入输出:逐个字符输入、输出:%c;整个字符串的输入、输出:%s;voidmain(){charstr[5];
inti;
for(i=0;i<5;i++)
scanf(“%c”,&str[i]);
for(i=0;i<5;i++)
printf(“%c”,str[i]);}voidmain(){charstr[5];
scanf(“%s”,str);
printf(“%s”,str);}%s,要求用字符数组名,不加&,输入串长度应小于数组维数,遇空格或回车结束自动加‘\0’输入:abde输出:ab输入:abde输出:abde2/28/202424石家庄经济学院信息工程学院·C语言课程组例voidmain(){chara[]=“Hello”;
printf(“%s”,a);}结果:Hello#-=*
hello02314结果:Hello用“%s”输出时,遇‘\0’结束例voidmain(){chara[5]={‘H’,’e’,’l’,’l’,’o’};
printf(“%s”,a);}有问题!2/28/202425石家庄经济学院信息工程学院·C语言课程组voidmain(){chara[]={'h','e','l','\0','l','o','\0'};
printf("%s",a);}例输出:hel
hel\0lo\0数组中有多个‘\0’时,遇第一个结束2/28/202426石家庄经济学院信息工程学院·C语言课程组【例4.5】
字符串输入举例#include<stdio.h>voidmain(){chara[15],b[5],c[5];
scanf("%s%s%s",a,b,c);
printf("a=%s\nb=%s\nc=%s\n",a,b,c);
scanf("%s",a);
printf("a=%s\n",a);}运行情况:输入:Howareyou?输出:a=Howb=arec=you?输入:Howareyou?输出:a=Howscanf中%s输入时,遇空格或回车结束
How\0
are\0
you?\0
若输入:Howareyou?Howareyou?输出结果是什么?2/28/202427石家庄经济学院信息工程学院·C语言课程组常用的字符串处理函数包含在头文件string.hstring.hStrlen(计算字符串长度)Strcpy(复制字符串)Strcmp(比较字符串)Strcat(连接字符串)……puts(字符串输出函数)gets(字符串输入函数)stdio.h2/28/202428石家庄经济学院信息工程学院·C语言课程组【例4.6】输入一行字符(请包含空格),计算空格数。#include<stdio.h>voidmain(){charline[30];
int
i,count=0;
printf("\n
请输入一行字符:\n");
gets(line);i=0;
while(line[i]!='\0'){
if(line[i]=='') count++; i++;}
printf("\n
其中的空格总数为%d\n",count);}Cisaprogramminglanguage在循环执行时,扫描整个数组以统计出空格‘‘的数量,直到遇到字符’\0’。每次循环执行时,都会更新计数器i和count。其中的空格总数为42/28/202429石家庄经济学院信息工程学院·C语言课程组(1)strlen(字符串)
功能:计算字符串中字符的个数;返回值:整形数,字符串实际长度,不包括‘\0’;例如:d=strlen(“Beijing”);运行结果:d=7(2)strcpy(目标字符数组,源字符数组)
功能:将源字符串拷贝到目标字符数组中。返回值:目标数组的首地址。说明:(1)目标字符数组必须足够大;
(2)拷贝时‘\0’一同拷贝;
(3)不能使用赋值语句为一个字符数组赋值;例
charstr1[20];str1={“Hello!”};
(
)
可以初始化,
或使用strcpy()函数给字符数组赋值。正确方法:charstr1[20]=“Hello!”,str2[20];strcpy(str2,str1);2/28/202430石家庄经济学院信息工程学院·C语言课程组(3)strcmp(字符串1,字符串2)
功能:比较两个字符串。比较规则:对两串从左向右逐个字符比较(按ASCII码值比),直到遇到不同字符或‘\0’为止。返回值:返回int型整数;(a)若字符串1<字符串2,返回负整数;(b)若字符串1>字符串2,返回正整数;(c)若字符串1==字符串2,返回零;说明:字符串比较不能用“=
=”,必须用strcmp()函数。
if((strcmp(“Tom”,“John”)==0)printf(“两串相同");elseprintf(“两串不同”);(4)strcat(字符数组1,字符数组2)
功能:把字符数组2连接到字符数组1的后面。返回值:返回字符数组1的首地址。说明(a)字符数组1必须足够大;(b)连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,新串最后加‘\0’;(c)连接后字符串的总长度将是字符串1的长度加上字符串2的长度。例如:charch1[20]=“Hello”,ch2[]=“world!”;strcat(ch1,ch2);
则ch1中的字符串为:Helloworld!2/28/202431石家庄经济学院信息工程学院·C语言课程组#include<stdio.h>#include<string.h>voidmain(){ charusername[15],pwd[15];
printf("\n
请输入用户名:");
gets(username);
printf("\n
请输入密码:");
gets(pwd);
if((strcmp(username,"John")==0)&&(strcmp(pwd,"123456")==0))
printf("\n
您已成功登录\n"); else
printf("\n
用户名和/或密码无效\n");}例4.7要求用户输入用户名和密码,判断是否允许登录
请输入用户名:John
请输入密码:123456
您已成功登录
请输入用户名:john
请输入密码:123456
用户名和/或密码无效2/28/202432石家庄经济学院信息工程学院·C语言课程组上机作业:(1)读10个整数存入数组,使用一维数组存储这10个数,找出其中最大值及其下标.(2)使用二维数组存储这10个数,找出其中最大值及其下标。(3)利用数组输入5种商品的价格,计算合计费用,并输出。(4)用户从键盘输入字符串,存储于字符数组中,完成如下功能:a)计算并输出该字符串的长度。b)把该字符串拷贝到另一个字符数组中,并输出。c)把这两个串连接形成一个新串,输出。2/28/202433石家庄经济学院信息工程学院·C语言课程组结构体用于存储数据类型不相同的一组数据。4.3结构体numnamesexmathcomputer01MaryF899002JohnM78.587.503PeterF677804RoseM97.595.605KateF64702/28/202434石家庄经济学院信息工程学院·C语言课程组structstudent{charnum[3];charname[20];charsex;floatmath;floatcomputer;};numnamesexstudent结构体定义并不预留内存结构体定义放置在程序的开始部分,位于头文件声明之后math结构体定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构体变量。computer4.3结构体2/28/202435石家庄经济学院信息工程学院·C语言课程组4.3.1结构体变量的定义和使用structstudent{charnum[3];charname[20];charsex;floatmath;floatcomputer;};structstudentstudent1,student2;I.先定义结构体,再声明结构体变量structstudent{charnum[3];charname[20];charsex;floatmath;floatcomputer;}student1,student2;II.在定义结构体类型的同时声明结构体变量struct{charnum[3];charname[20];charsex;floatmath;floatcomputer;}student1,student2;III.直接声明结构体变量声明一个类型为student结构体的变量,将会为该变量分配内存,内存值为所有成员的内存之和。
2/28/202436石家庄经济学院信息工程学院·C语言课程组structdate{
intmonth;
intday;
intyear;};struct{
intnum;charname[20];charsex;
structdatebirthday;floatscore;}student1,student2;结构体变量成员的表示方法:结构体变量名.成员名例如:student1.num、student2.sex、student1.birthday.month嵌套结构体2/28/202437石家庄经济学院信息工程学院·C语言课程组结构体变量的初始化内存student3structstudentstudent3={3,"YaoMing",'M',90.5};
3YaoMingM赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构体成员数目少。student3.numstudent3.sex90.5student3.score2/28/202438石家庄经济学院信息工程学院·C语言课程组student1student1.num=1;="ZhangZi
Liang";student1.sex=’M’;printf("请输入成绩:\n");scanf("%f",&student1.score);结构体变量赋值1ZhangZi
LiangM用输入语句或赋值语句来给结构体变量的各个成员赋值7878student2=student1;student21ZhangZi
LiangM782/28/202439石家庄经济学院信息工程学院·C语言课程组结构体的应用:例4.8使用结构体存储表格中的数据numnamesexmathcomputer01MaryF899002JohnM78.587.503PeterF677804RoseM97.595.605KateF6470提示:结构体成员按照每个人的具体信息设计。2/28/202440石家庄经济学院信息工程学院·C语言课程组structstudent{ charnum[3]; charname[6]; charsex; doublescore[2];};voidmain(){ structstudentstu1={"01","Mary",'F',89,90}; structstudentstu2={"02","John",'M',78.5,87.5}; structstudentstu3={"03","Peter",'F',67,78}; structstudentstu4={"04","Rose",'M',97.5,95.6}; structstudentstu5={“05”,“Kate”,‘F’,64,70};
}2/28/202441石家庄经济学院信息工程学院·C语言课程组例4.9:根据computer的成绩,输出80分以下的学生的详细信息。
使用结构示例numnamesexmathcomputer01MaryF899002JohnM78.587.503PeterF677804RoseM97.595.605KateF64702/28/202442石家庄经济学院信息工程学院·C语言课程组#include<stdio.h>structstudent{
charnum[3];/*学号*/
charname[6];/*姓名*/
charsex;/*性别*/
doublescore[2];/*成绩*/};voidmain(){
structstudentstu1={"01","Mary",'F',89,90};
structstudentstu2={"02","John",'M',78.5,87.5};
structstudentstu3={"03","Peter",'F',67,78};
structstudentstu4={"04","Rose",'M',97.5,95.6};
structstudentstu5={"05","Kate",'F',64,70};printf("computer80分以下的学生名单如下:\n");if(stu1.score[1]<80)
printf("%s\t%s\t%c\t%5.2f\t%5.2f\n",
stu1.num,,stu1.sex,stu1.score[0],stu1.score[1]);if(stu2.score[1]<80)
printf("%s\t%s\t%c\t%5.2f\t%5.2f\n",
stu2.num,,stu2.sex,stu2.score[0],stu2.score[1]);if(stu3.score[1]<80)
printf("%s\t%s\t%c\t%5.2f\t%5.2f\n",
stu3.num,,stu3.sex,stu3.score[0],stu3.score[1]);if(stu1.score[1]<80)
printf("%s\t%s\t%c\t%5.2f\t%5.2f\n",
stu3.num,,stu3.sex,stu3.score[0],stu4.score[1]);}2/28/202443石家庄经济学院信息工程学院·C语言课程组4.3.2结构体数组structstudent{
intnum[3];charname[6];charsex;doublescore[2];}stu[30];元素为结构体类型的数组称为结构体数组。在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。定义了一个结构体数组stu,共有30个元素,stu[0]~stu[29]。每个数组元素都具有structstudent的结构形式。2/28/202444石家庄经济学院信息工程学院·C语言课程组例4.10:根据computer的成绩,输出80分以下的学生的详细信息。(使用结构体数组编程)使用结构体数组2/28/202445
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 华师大版初中科学温度的测量
- 加班与休假管理规章制度
- 医疗危机处理与应急制度
- 2022年三年级语文下册第二单元主题阅读+答题技巧(含答案、解析)部编版
- 算法设计与分析 课件 10.4-综合应用-资源分配问题
- 2024年达州客运从业资格证到期换证考试
- 2024年上海客运急救考试题及答案
- 2024年银川客运急救知识培训内容
- 2024年阳江客运资格证情景题
- 2024年淄博道路运输客运从业资格证模拟考试
- 期中测试卷(1-4单元)(试题)-2024-2025学年六年级上册数学北师大版
- 光伏项目施工总进度计划表(含三级)
- 2021年四史学习教育PPT
- 财务共享服务中心在企业中的应用分析——以国美电器集团为例[精选]
- 幼儿园大班数学练习题(直接打印版)
- 民警三个规定自查自纠报告6篇范文
- 成立纪检监察领导小组3篇
- 查询深沟球轴承尺寸和公差
- 关于柜面操作关键环节的风险提示
- 抽油杆设计方法
- 工程送审结算模板(经典实用)
评论
0/150
提交评论