数据的存储结构
- 格式:doc
- 大小:122.50 KB
- 文档页数:34
第四章、数据的存储结构: 迄今为止,我们使用的都是属于基本类型的数据,但C语言还给我们提供了构造类型数据,有数组类型、结构体类型、共用体类型。构造类型数据是由基本类型数据按一定规则组成的,也有的书称之为“导出类型” 数组的特点: 数组是有序数据的集合 数组中的每一个元素都属于同一个数据类型 用一个统一的数组名和下标来唯一确定数组中的元素。 一、学习内容: 一维数组:变量 一维字符数组:字符串 二维数组:多行多列、大量数据 二、学习方法: 定义 输入、输出 应用(处理数据) 三、注意:每种存储结构都从三方面来讲 定义、输入输出、应用(前两个用于笔试,后一个机试) 数组的引入: 如:int x=3; x变量只能存放一个数字要对大量类型相同数据处理,比如求5门课程成绩之和,按照之前学的内容最少定义5个变量来分别存放5门课程成 绩,再用一个变量来存放和值„„比较繁琐 四、为解决这一问题我们引入数组的学习: 数组:一系列类型相同数据存放在一系列连续的存储单元中(类型相同数据的集合体) 画图分析: 1 a[0] 2 a[1] 3 4 5 6 7 8 9 10 a[9]
三、数据存储:数据存储方式影响处理方法的选择和执行的效率。 1、一维数组: 1)定义:类型说明符 数组名[常量表达式], int a[10] 说明: (1) 数组名定名规则和变量名相同,遵循标识符定名规则 (2) 数组名后是用方括弧括起来的常量表达式,不能用圆括弧,下面用法不对: int a(10) (3) 常量表达式表示元素的个数,即数组长度。例如,在a[10]中,10表示a数组有10个元素,下标从0开始,这10个元素是,a[0],a[1],a[2]„„a[9]。 注意不能使用数组元素a[10] (4)常量表达式中可以包括常量和符号常量,不能包含变量。 注意:a、大小:必须明确,必须是常量或常量表达式,不能是变量; int a[10]; int a[„0‟]; int a[3+7]; int y=100; int a[y]; b、 内存变量名: int a;
a a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] c、 单元格引用: 单元格的引用: 数组名[下标] a[下标] 下标表示:常量、变量、常量表达式、变量表达式 下标范围:0<=下标int a[10]; a[3]=50; a[1+2]=50; a[2>5]=69; int i=5, a[i]=90; a[i-2]=89 2) 输入、输出 输入 ①定义初始化 int a[10]={1,2,3,4,5,6,7,8,9,0}; 全部初始化 int a[10]={1,2,3,4,5};部分初始化,其余为零 a[6]=0; int a[]={1,2,3,5,6,7};以赋值元素的个数来决定数组的大小 int a[10]={0}; 存放10个零 注意:int a[10]; a={1,2,4,5„„} 写法错误,只能定义同时初始化 ②从键盘读入 for(i=0;i<10;i++) scanf(“%d”,&a[i]); 输出 正序输出数组元素 for(i=0;i<10;i++) printf(“%d”,a[i]); 倒序输出数组元素 for(i=9;i>=0;i--) printf(“%d”,a[i]); 3) 应用: a.遍历一维数组(求和、平均、最大、最小、移动) b.标志位:(逆置、将结果存入数组) int a[10]; for(i=0;i<10;i++) { 处理 a[i] } 例如:给定一维数组 int a[10];求其累加和。 int a[10]={……..}; int I,s; s=0; for(i=0;i<10;i++) { s=s+a[i]; } printf(“%d”,s); 例如:给定一维数组int a[6]={3,1,8,5,7,6};请编程调整成 1 8 5 7 6 3
t=a[0]; for(i=1;i<6;i++) { a[i-1]=a[i]; } a[i-1]=t; 例如:给定一个一维数组int a[10],将其逆置后输出. 画图分析: int i,j; i=0;j=9; while(i{ t=a[i]; a[i]=a[j; a[j]=t; i++; j--; } 例如:寻找200~400之间所有能被7或9整除的数,存入数组int a[200]中,然后输出。
c=0; for(i=200;i<=400;i++) { if(i%7==0||i%9==0) a[c++]=i; } for(i=0;i{ printf(“%d ”,a[i]); } 例如:给定一个一维数组int a[10] ;求最大值。
8 21 32 7 6 1 46 27 33 9 0 1 2 3 4 5 6 7 8 9 max=a[0]; for(i=1;i<10;i++) { if(a[i]>max) max=a[i]; } 问: max 存放的是最大值吗? i是最大值的下标吗? 求最大值和最大值的下标, max=a[0]; k=0; for(i=1;i<10;i++) { if(a[i>max) { max=a[i]; k=i; } }
问: max 是最大值吗? i是多少? k是最大值的下表吗? k=0; for(i=1;i<10;i++) { if(a[i]>a[k]) k=i; } 问: k中的值是? a[k]中的值是? i的值是? 求最大值及次大值以及最大值下标和次大值下标。 总结: 找最大值的结构有几条语句; 例如:给定一维数组int a[10];和整数m,将m个元素和后面的元素进行平移交换。 int b[10]; c=0; for(i=m;i<10;i++) { b[c++]=a[i]; } for(i=0;i{ b[c++]=a[i]; } for(i=0;i{ a[i]=b[i]; }
二、字符数组(字符串) 字符串:字符串存放于字符数组中 „a‟ „b‟ „c‟ „d‟ „e‟ „\0‟ 1>定义 char s[20]; a:大小只能用常量,不能用变量 b:内存变量名: s[0]„„s[19] c:单元格引用: s[下标] 下标表示:常量、变量、常量表达式,变量表达式 d:结束符:„\0‟ 系统给用双引号引起的字符串末尾自加‟\0‟,无‟\0‟不叫字符串 2>输入输出 输入 定义初始化: char s[20]={„a‟,‟b‟,‟c‟,‟d‟ };按字符赋值 无初始化的自动为零 char s[20]={“abcd”};按字符串赋值 char s[]={“abcd”}; 可以省略大小, 以赋值元素决定 注意:只能定义同时初始化 char s[20]; s=”abcd”; 错误表示,与之后的指针区分 区分: a 表示变量名 „a‟ 字符常量 “a” 字符串 从键盘输入: gets(s); abcd scanf(“%s”,s); 输出: puts(s); prinitf(“%s”,s); 加:char ch,c c=getchar(ch) putchar(c) 输入输出单个字符 字符串常用函数: char strcat(str1,str2) 是指将字符串str2连接在str1的后边 int strcmp(str1,str2) 若str1>str2返回1,str1==str2返回0,str1char strcpy(str1,str2) 将str2的字符串拷贝在str1中,输出str1 int strlen(str1) 求出字符串str1的长度,不包含终止符。 3)应用: 遍历字符串: 标志位 char s[200]; „\0‟
for(i=0; i{ 处理s[i]
} 其中条件: s[i]!=‟\0‟ s[i]!=0 s[i] 例如: 给定两个字符串,char s[200];char t[200];将t中的内容连接到s的尾部,形成新的串. c=strlen(s); for(i=0;i<=strlen(t);i++) { s[strlen(s)+i]=t[i]; strlen(s)++ 不对 c++ 对 } 说明: ++变量 ++常量 10++ 不对 (表达式)++ (a+b)++ 不对
例如:给定一个字符串 char s[200]; 由字母字符组成,将其中大写转换成小写,小写转换成 大写。
for(i=0;s[i]!=‟\0‟;i++) { if(s[i]>=‟A‟&&s[i]<=‟Z‟) s[i]=s[i]+32;