C语言复合数据类型数组

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ scanf(“%d”,&a); s=s+a; }
ave=s/10; printf(“ Ave=%d\n”,ave); }
引例:
如果使用:a1,a2,a3,a4,a5,a6,a7,a8,a9,a10
int n;
float s, ave, a1, a2, a3,a4,a5,a6,a7,a8,a9, a10;
【例6】选择法排序
选择法排序(升序)的C程序:
for(i=0;i<n-1;i++) /*第i遍*/ { p=i;
for(j=i+1;j<n;j++) /*查找最小数的标*/ if(a[p]>a[j]) p=j;
if(i!=p) /*交换a[i]和a[p]*/ {s=a[i]; a[i]=a[p]; a[p]=s; }
/*交换a[j]和a[j+1]*/
for(i=0;i<N;i++)
/*输出排序后的数据*/
{ printf("%d ",a[i]);
if ((i+1)%10==0)
printf("\n"); /*输出10数据后换行*/
float sum,aver;
printf("Enter Student Score\n"); /* 提示用户输入学生成绩*/
for(i=0;i<NUM;i++)
/* 循环输入学生成绩 */
scanf("%d", &a[i]); for(i=0;i<NUM;i++)
/* 统计各分数段的人数 */
{ k = a[i] / 10;
scanf(“%d%d%d%d%d”,&a1,&a2,&a3,&a4,&a5);
scanf(“%d %d%d%d%d”,&a6,&a7,&a8,&a9,&a10); s=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10;
ave=s/10;
if (a1>ave) printf(“%d”,a1);
b[k] = b[k] + 1;
}
for(i=0;i<10;i++)
/* 打印输出各分数段的学生人数 */
printf("%2d --%2d = %d\n", i * 10,i * 10 + 9,b[i]);
printf( " 100---= %d " ,b[i]);
}
【例6】选择法排序的算法分析
s如tatic iinntt aa[[55]]=; {6,2,3}; 等如等价价于编iin于n:译tta:aa[系[][3=0统]{a]==[1{0根0,62];=,,据236a,,[;34初1,a,55][值=,,1160]}}个=;;;2a数[;a2[](确2=]0)=定;3a数;[a3组[]3=]0维=;0数a;[a4[]4=]0=;0;
if (a[i]>ave) printf("%f ",a[i]); }
来自百度文库
一、 数组概念
• 构造数据类型之一 • 数组:有序数据的集合,用数组名标识 • 元素:属同一数据类型,用数组名和下标确定
二、 一维数组
一维数组的定义
❖定义方式: 数据类型
[ ] :数组运算符 单目运算符 优先级(1) 左结合 不能用( )
一维数组的应用问题:
【例1】用数组计算Fibonacci 数列的前20项 f 1=1,f 2=1,fn=fn-1+fn-2(n>=3)
分析: 用数组f[20]存放数列的前20项,公式为: f [0]=1, f [1]=1, f [ i ]=f [i - 1]+f [i - 2]( i >=3)
#include <stdio.h> int main() { int i; int f[20]={1,1};
{ if (a[j] > a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
【例7】排序问题(冒泡排序法)
#include <stdio.h>
#define N 20
/*声明代表数据个数的符号常量*/
void main()
{
int i,j,p,t,a[N];
printf("input %d numbers:\n",N);
} for(i=0;i<n;i++) printf("%d",a[i]);
思考:如果按降序排,程序如何修改?
【例7】排序问题(冒泡排序法)
冒泡法排序算法的流程图:
排序过程: (1)比较第一个数与第二个数, 若为逆序a[0]>a[1],则交换;然后 比较第二个数与第三个数;依次类 推,直至第n-1个数和第 n个数比 较为止——第一趟冒泡排序,结果 最大的数被安置在最后一个元素位
for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++) { if(i%5==0) printf(“\n”);
printf(“%12d”,f[i]); } printf("\n"); return 0; }
【例2】一维数组的倒置
编程分析:将第0个元素与最后1个元素的交换、第1个元素与 倒数第2个元素的交换、……、即第i个与第n-i-1个元素的交 换,直到i<n/2。
for(i=0;i<N;i++)
scanf("%d",&a[i]);
max = a[0];
/ * 假设第0元素就是最大元素 */
p= 0;
for(i=1;i<N;i++)
if (a[i] > max)
{ max = a[i];
p = i; }
printf(" The Max Numbwer a[%d]=%d\n",p,max);
设有n个数,存放在数组A[n]中
选择法排序算法的流程图:
753 89 1 6 4
1)第1遍:从中选出最小的数, 与第 1个数交换位置; (演示)
17 5 3 8 9 17 6 4
2)第2遍:除第1 个数外,其 余n-1个数中选最小的数,与第 2个数交换位置;(演示)
3)依次类推,选择了n-1次后, 这个数列已按升序排列。
倒置前的数组
A[100]
A[9]
2 4 6 8 10 1 3 5 7 9
倒置后的数组
交换 交换 交换 交换
9 7 5 3 1 10 8 6 4 2
【例3】求数组中最大元素及其下标
#define N 10
main()
{ int i,p,max,a[N];
printf("Enter %d Numbers\n",N); /* 提示输入数据 */
难点: 数组有关的常用算法(排序、查找与插入等)。
一、 数组概念 二、 一维数组 三、 二维数组及多维数组 四、 字符数组和字符串
引例:
输入10个数,输出它们的平均值及大于平均值的那些数?
S=0: N=1 当 N<=10
输入 A S=S+A
N=N+1
Ave=S/10
打印 Ave
main() {int n; float s=0,a, ave; for (n=1;n<=10;n++)
(不能用变量定义数组维数)
data[5]=10; //C语言对数组不作越界检查,使用时要 注意
❖数组必须先定义,后使用 ❖只能逐个引用数组元素,不能一次引用整个数组 ❖数组元素表示形式: 数组名[下标]
其中:下标可以是常量或整型表达式
例 int a[10];
printf(“%d”,a); ()
必须 for(j=0;j<10;j++)
置上。(演示)
(2)对前n-1个数进行第二趟冒泡 排序,结果使次大的数被安置在第 n-1个元素位置。 (3)重复上述过程,共经过n-1趟 冒泡排序后,排序结束。
排序前 7 5 3 8 9 1 6 4
A[0]
A[7]
75 357 37 8 19 691 6994 94
按升序排序
第1遍
最大数已到最后
for(j = 0; j < 8-i-1; j++)
引例:
#include <stdio.h> main() {int n,i;
/*定义变量s,ave和有10个元素的一维数组a*/ float s=0, ave, a[10];
for(i=0;i<10;i++) { scanf("%f", &a[i] ); s=s+a[i]; }
ave=s/10; for(i=0;i<10;i++)
数组名[常量表达式];
例 int a[6];
a
0
1
2
3
数组名表示内存首地址, 是地址常量
4
5
合法标识符 a[0]
表示元素个数 下标从0开始
a[1]
a[2]
编译时分配连续内存
a[3]
内存字节数=数组维数*
a[4]
sizeof(元素数据类型)
a[5]
2.1一维数组的引用
例 int i=15;
例 int datain[5t ]d;ata[i];
}
【例4】编程求某班20个学生某门课程考试的平均成绩及高于 平均成绩的学生人数。
#define NUM 20
/* 声明代表班上学生人数的符号常量*/
main()
{
int a[NUM], i,n;
float sum,aver;
sum = 0;
/* 给sum赋初值 */
printf("Enter Student Score\n"); /* 提示用户输入学生成绩*/
编程分析:用数组b来存各分数段的人数,并用b[0]存0-9分的人数,b[1] 存10-19分的人数,…b[9]存90-99分的人数,b[10]存100分的人数。
#define NUM 20 /* 声明代表班上学生人数的符号常量*/
main()
{ int a[NUM],b[11]={0},i,k;
程序运行结果如下:
第6章 复合数据类型(1)-数组
教学要求:
1、掌握一维数组和二维数组的定义及使用 2、掌握C语言数组在内存中的存储形式 3、掌握使用字符数组及指针处理字符串数据的方法 4、掌握与数组有关的基本算法(如排序、查找、插入、 删除等)的程序设计
重点: 一维数组、二维数组的定义与使用方法 ,使用指
针访问数组和字符串的方法。
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
/*第i遍*/
for(j=0;j<N-i-1;j++)
/*相邻2个数比较*/
if(a[j]>a[j+1])
/*如果a[j]>a[j+1]*/
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
2.3一维数组的应用举例
【例1】用数组计算Fibonacci 数列的前20项。 【例2】一维数组的倒置。 【例3】求若干个数(不多于10个)的最大、最小元素及其下标。 【例4】编程求某班20个学生某门课程考试的平均成绩及高于 平均成绩的学生人数。 【例5】 【例4】统计0~9,10~19,20~29,….80~89,90~99 分数段及100分的学生人。 【例6】排序问题(选择排序法) 【例7】排序问题(冒泡排序法) 【例8】查找问题––––顺序查找 【例9】查找问题––––折半查找 *排序问题(插入排序法)
printf(“%d\t”,a[j]);
()
2.2一维数组的初始化
❖初始化方式
int a[5]={1,2,3在,4定,5}义; 数组时,为数组元素赋初值 等价于:a[0]=(1在; 编a[1译]=阶2;段a[使2]之=3得; a到[3]初=4值; a)[4]=5;
❖说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值 只给部分数组元素赋初值 当全部数组元素赋初值时,可不指定数组长度
for(i=0;i<NUM;i++)
/* 循环输入学生成绩,并求和*/
{ scanf("%d", &a[i]);
sum =sum + a[i];
/* 求班总成绩 */
}
aver = sum / NUM;
/* 计算机平均成绩 */
n = 0;
for(i=0;i<NUM;i++)
/* 统计高于平均成绩的人数*/
if (a2>ave) printf(“%d”,a2);
if (a3>ave) printf(“%d”,a3);
………..
‘ 实际程序是不能这样写
引例:
读者从上面的程序可以看到程序很冗长,如果 不是10个数,而是100,1000,甚至是10000,此时 按上面方法编写程序就非常冗长。
思考:
如果能使用ai ( i=1,2,…..10 ) 的形式? 使用循环来写程序 C语言中表示下标变量就是通过定义数组来实现的。 下面是使用数组来实现的程序:
if (a[i]>aver) n++;
printf("The Class Average Score is:%f\n" ,aver);
printf("The Total Number is:%d\n",n);
}
【例5】例4中统计0~9,10~19,20~29,….80~89,90~99分数
段及100分的学生人。
相关文档
最新文档