资源描述
上机实验六 一维数组
学号: 姓名:
一.目的要求
1. 掌握一维数组的基本概念,如何定义一维数组,如何初始化一维数组。
2. 掌握数组的基本操作:引用数组元素、行(列)求和,行(列)最大最小值,整个数组的输入输出等。
3. 掌握与数组有关的算法,如排序、找最大最小值(或位置)等。
二.实验内容
第1题、 输入n(n不超过10),然后输入n个数组元素,要求将数组元素在同一个数组中按逆序重新存放并输出。
如输入5
1 2 3 4 5
应输出
5 4 3 2 1
#include <stdio.h>
void main(){
int a[10], i, n ;
printf("请输入小于10的数n:\n");
scanf("%d", &n);
printf("请输入%d个整数:\n", n);
for (i=0; i<n; i++) //for语句里面只有一条语句,所以{}可以省
scanf("%d", &a[i]);
// 下面逐个打印这n个整数
for (i=n-1; i>=0; i--)
printf("%d ", a[i]);
printf("\n", n);
}
第2题、 输入一个数组的所有元素,再输入一个整数m,把该数组的后m个数字移到数组的前头。
比如数组元素为:1 2 3 4 5 6 7 8 9 10,m=4,应输出:7 8 9 10 1 2 3 4 5 6
#include <stdio.h>
void main(){
int a[10], i, m, t, j ;
printf("请输入10个整数:\n");
for (i=0; i < 10; i++)
scanf("%d", &a[i]);
printf("请输入一个小于10的数m:");
scanf("%d", &m);
// 下面循环重复m次, 每次将最后一个元素放到第一个位置
for (i=0; i<m; i++) {
t = a[9]; // 将数组最后一个位置腾出来;
//这个循环是将每个数据元素往后挪动一位
for (j=9; j>0; j--) {
a[j] = a[j-1];
}
a[0] = t; //将最后那个元素放到第一个位置
}
// 下面逐个打印数组元素
for (i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
}
第3题、 输入一个数组的所有元素值,将最大的元素与第一个元素交换,最小的元素与最后一个元素交换,然后输出数组所有元素。
(注:这是选择排序的一个改进方案,每一轮循环可以找出最大和最小两个元素,可以使循环次数减少一半,请在此方法的基础之上进行改进,编出完整的排序程序来,降序)
#include <stdio.h>
void main(){
int a[10], i, m, n;
printf("请输入10个整数:\n");
for (i=0; i < 10; i++)
scanf("%d", &a[i]);
m = 0; // m保留数组中最大元素的的下标
// 查找最大的元素
for (i=1; i<10; i++) {
if (a[m]<a[i])
m = i;
}
// 如果最大元素不是在第0个位置,那么就交换;否则,最大元素就在数组的第0个位置
if (m!=0) {
n = a[0]; a[0] = a[m]; a[m] = n;
}
m = 9; // m保留数组中最小元素的的下标,默认最后一个
// 从第1个到倒数第2个位置间,查找最小的元素
for (i=8; i>0; i--) {
if (a[m]>a[i])
m = i;
}
// 如果最小元素不是在第9个位置,那么就交换;否则,最小元素就在数组的第9个位置
if (m!=9) {
n = a[9]; a[9] = a[m]; a[m] = n;
}
// 下面逐个打印数组元素
for (i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
}
/*
下面这个程序,是利用这种思想实现排序算法, 注意每做一次,就交换了两个元素,即最大放前面,最小放后面, 因此这个过程重复n/2次即可实现整个数组的排序功能
*/
#include <stdio.h>
void main(){
int a[10], i, j, m, n;
printf("请输入10个整数:\n");
for (i=0; i < 10; i++)
scanf("%d", &a[i]);
/*
因为每次交换,就确定了两个元素,即最大放前面,最小放后面,
因此这个过程重复n/2次即可实现整个数组的排序功能
*/
for (j=0; j<10/2; j++) {
m = j; // m保留数组中最大元素的的下标
// 从第j+1个到倒数第10-j-1个位置间,查找最大的元素
for (i=j+1; i<10-j; i++) {
if (a[m]<a[i])
m = i;
}
// 如果最大元素不是在第j个位置,那么就交换;否则,最大元素就在数组的第j个位置
if (m!=j) {
n = a[j]; a[j] = a[m]; a[m] = n;
}
m = 10-j-1; // m保留数组中最小元素的的下标,默认最后一个
// 从第1+1个到倒数第8-j个位置间,查找最小的元素
for (i=8-j; i>j; i--) {
if (a[m]>a[i])
m = i;
}
// 如果最小元素不是在第9-j个位置,那么就交换;否则,最小元素就在数组的第9-j个位置
if (m!=9-j) {
n = a[9-j]; a[9-j] = a[m]; a[m] = n;
}
}
// 下面逐个打印数组元素
for (i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
}
第4题、 输入一个数组的所有元素,再输入一个整数m,如果m在数组中,则删除数组中的m,并输出删除m后的数组,如果m不在数组中,提示“数据不存在!”。
比如数组元素为:1 2 3 4 5 6 7 8 9 10,m=4,则输出: 1 2 3 5 6 7 8 9 10,如m=12,则输出“数据不存在!”
#include <stdio.h>
void main(){
int a[10], i, j, m, n;
printf("请输入10个整数:");
for (i=0; i < 10; i++)
scanf("%d", &a[i]);
printf("请输入需要删除的整数m:");
scanf("%d", &m);
//从数组中查找m
for (i=0; i<10; i++){
//如果找到m,则跳出循环,不必再进行查找
if (m==a[i]) {
break;
}
}
if (i==10) {
//此时表示,循环正常结束,数组中没有找到m
printf("数据不存在!");
} else {
//此时循环非正常结束(通过break语句退出的),即表示数据m在循环中找到
//m就在数组的第i个位置,此时需要删除a[i]
//具体方法就是,将i后面位置的所有元素往前挪动一个位置
for ( ; i<9; i++) { // 注意这里是9,而非10
a[i] = a[i+1];
}
// 下面逐个打印数组元素,即删除后的数组元素
for (i=0; i<9; i++)
printf("%d ", a[i]);
printf("\n");
}
}
第5题、 输入一个数组的所有元素,利用排序算法对其进行升序排序,再输入一个整数m,并把m插入到正确的数列中输出。
#include <stdio.h>
void main(){
int a[11];
int i, j, m;
int k, t;
printf("请输入10个整数:");
for (i=0; i<10; i++)
scanf("%d", &a[i]);
printf("\n");
// 下面是使用“选择排序”方法进行排序, 具体在课堂上已经讲过
for (i=0; i<9; i++) {
k = i;
for (j=i+1; j<10; j++) {
if (a[j]<a[k])
k = j;
}
if (k != i) {
t = a[i]; a[i] = a[k]; a[k] = t;
}
}
printf("排序的结果为:");
for (i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
printf("请输入需要插入的整数m:");
scanf("%d", &m);
// 下面实现将数据元素插入到排好序的数组中
// 具体方法是:从数组后面依次往前判断,如果数组元素大于需要插入的数,
//那么数组元素需要往后挪动,否则,直接将插入的数赋给数组即可
for (i=10; i>0; i--) {
if (a[i-1] > m) {
// 如果比m还大, 那么直接往后挪动一个位置
a[i] = a[i-1];
} else {
// 比m小, m直接插入到数组中
a[i] = m;
// 插完之后,不需要再比较, 直接跳出,结束循环
break;
}
}
printf("插入后的结果为:");
for (i=0; i<11; i++)
printf("%d ", a[i]);
printf("\n");
}
展开阅读全文