现在的位置: 首页 > 教材内容 > 正文

数组

2012年12月27日 教材内容 ⁄ 共 340字 ⁄ 字号 暂无评论

数组:初始化,输入输出,使用。 核心:选择排序和冒泡排序

1
2
3
4
5
计算10种商品的利润
在一串字符中找出所有数字字符构成新的数组
从100名学生中找出成绩最高的学生
在有序数据中插入一个数
将8名候选人的投票数由多到少排序

【实例4.1】编写程序,根据10种商品的进价和销售价,计算各商品的利润。

【编程思路】

定义3个含有10个元素的数组a、b、c,分别存放各商品的进价、销售价和利润。利润通过销售价和进价的差得到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(int argc, char *argv[])
{
    int a[10]= {12,8,20,15,28,32,38,45,51,65};
    int b[10]= {20,13,29,22,37,40,49,56,62,78};
    int c[10]= {0},i=0;
    for(i=0; i<10; i++)  c[i]=b[i]-a[i];
    for(i=0; i<10; i++)  printf("%4d",a[i]);
    printf("\n");
    for(i=0; i<10; i++)  printf("%4d",b[i]);
    printf("\n");    
    for(i=0; i<10; i++)  printf("%4d",c[i]);
    printf("\n");
    return 0;
}

【实例4.2】编写程序,在一串字符中找出所有数字字符构成新的数组。

【编程思路】

ch的值为数字字符的条件是满足ch≥'0' 且 ch≤'9'
需要定义2个数组, 使用2个循环变量i和j,i用于从第1个数组中逐个访问各元素,j用于构建第2个数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(int argc, char *argv[])
{
    char old[80]="From 500 B.C. to 500 A.D. is 1000 years.", new[80]= {'\0'};
    int i=0, j=0;
    while(old[i]!='\0') {
        if(old[i]>='0' && old[i]<='9') {
            new[j]=old[i];
            j++;
        }
        i++;
    }
    new[j]='\0';
    puts(old);
    puts(new);
    return 0;
}

【实例4.3】编写程序,输入100名学生学号和学年总平均成绩,并找出其中成绩最高的学生。

【编程思路】

定义2个数组num和score,学号存放在num中,对应平均成绩存放在score中。
从数组score中查找最大元素下标值开始入手

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#define N 5
 
int main(int argc, char *argv[])
{
	int num[N]={0},i=0,k=0;
	float score[N]={0.0};
	for(i=0; i<N; i++)
		scanf("%d%f",&num[i],&score[i]);
	for(i=1; i<N; i++)
		if(score[k]<score[i])  k=i;
	for(i=0; i<N; i++)
		printf("%8d",num[i]);
	printf("\n");
	for(i=0; i<N; i++)
		printf("%8.2f",score[i]);
	printf("\n");		
  	printf("number=%d,score=%.2f\n",num[k],score[k]);	
	return 0;
}

【实例4.4】编写程序,在已按小到大的顺序存入的学号中插入1个新学生学号。要求使学号仍然按原来的顺序有序。

【编程思路】

查找位置,数据移动,插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#define N 5
 
int main(int argc, char *argv[])
{
	int num[N+1]={1002,1003,1006,1008,1010};
	int i=0,j=0,new=0;
 
	printf("Original numbers:\n");
	for(i=0; i<N; i++)
		printf("%6d",num[i]);
	printf("\n");
 
	printf("Input a student number:");
	scanf("%d",&new);
 
	for(i=0; i<N; i++)
		if(new<num[i]) break;
	for(j=N; j>i; j--)
		num[j]=num[j-1];
	num[i]=new;
 
	printf("Final numbers:\n");
	for(i=0; i<N+1; i++)
		printf("%6d",num[i]);
	printf("\n");	
	return 0;
}

【实例4.5】编写程序,将8名候选人的投票数由多到少排序。
【编程思路】

选择法排序: 采用2轮循环,外循环是有序后的元素遍历,内循环用于寻找最值。
假设最小元素在数组的第0个位置上,从数组的第一个元素开始遍历数组,找出最小的元素分别和数组的第0个位置上的元素分别比较,如果该元素小于第0个元素,则交换该元素, 则交换后该元素就是有序的。说的通俗一点就是:每次选择剩余数据中的最值调整到有序 部分的后面去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main(int argc, char *argv[])
{
    int a[8]= {34,56,45,57,69,48,79,61},i=0,j=0,k=0,t=0;
 
    for(i=0; i<7; i++) {
        k=i;
        for(j=i+1; j<8; j++)
            if(a[k]<a[j])  k=j;
        t=a[i]; a[i]=a[k]; a[k]=t;
    }
    for(i=0; i<8; i++)
        printf("%5d",a[i]);
    printf("\n");
    return 0;
}

冒泡法排序:程序采用2轮循环,外循环遍历要排序的元素,内循环用于挑选出最值。内循环用于将相邻的两个元素进行比较,将小的元素调到大元素的前头。内循环的循环次数表示相邻元素的交换趟数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(int argc, char *argv[])
{
    int a[8]= {34,56,45,57,69,48,79,61},i=0,j=0,t=0;
    for(i=0; i<7; i++)
        for(j=i+1; j<8; j++)
            if(a[i]<a[j]) {
                t=a[i]; a[i]=a[j]; a[j]=t;
            }
    for(i=0; i<8; i++)
        printf("%5d",a[i]);
    printf("\n");
    return 0;
}

抱歉!评论已关闭.