南京邮电大学高级语言程序设计实验四(一维与二维数组实验)

零、相关简介

在计算机编程中,数组是一种非常重要的数据结构,它允许我们存储和操作一组相同类型的元素。根据元素的组织方式,数组通常分为一维数组和二维数组。

一维数组

定义与特性

  • 一维数组是具有单个下标的数组,它可被视为一个线性的数据集,其中的元素按照顺序排列。
  • 这种结构简化了数据的存储和访问,非常适用于表示向量、列表和序列。

内存中的布局

  • 一维数组在内存中占用一块连续的存储空间,其元素按照索引顺序紧密排列。
  • 这种连续的存储方式使得数组的索引操作非常快速,可以通过基址加偏移量的方式高效访问任意元素。

应用场景

  • 一维数组常用于处理简单的数据集合,如记录学生的成绩、存储字符串等。
  • 它也是多维数组的基础,可以通过一维数组来模拟多维数组的某些操作。

二维数组

定义与特性

  • 二维数组是一个具有两个下标的数组,它可以被看作是一个矩阵或表格,其中的元素通过行和列进行索引。
  • 二维数组适合于表示具有行和列结构的数据集,如图像数据、矩阵运算等。

内存中的布局

  • 二维数组在内存中可以以行优先或列优先的方式存储。
  • 在行优先存储中,同一行的元素连续存储;而在列优先存储中,同一列的元素连续存储。

应用场景

  • 二维数组常用于处理具有行和列结构的数据集,如图板的像素、表格数据等。
  • 它也可以用于实现更高维度的数组,通过将多个二维数组组合或嵌套使用。

一维与二维数组的关系

从一维到二维

  • 理论上,一维数组可以通过模拟来支持二维数组的操作,但这通常需要额外的计算和转换。
  • 实际编程中,二维数组由于其直观的行列特性,更适合直接处理具有二维布局的数据。

数据结构的选择

  • 选择一维还是二维数组,取决于数据的自然结构和应用程序的需求。
  • 对于需要频繁访问行和列的数据,二维数组提供了更直观和高效的处理方式。

性能考虑

  • 一维数组的存储可能更紧凑,但在处理二维数据时可能需要更多的索引计算。
  • 二维数组虽然在逻辑上更清晰,但可能会因为额外的间接层而有轻微的性能开销。

结论

一维和二维数组是计算机编程中基本的数据处理工具,它们各自适用于不同的场景和需求。理解它们的内存布局和使用方法,对于编写高效和优化的程序至关重要。在实际应用中,选择合适的数组结构可以极大地提高程序的性能和可维护性。

一、 实验目的和要求

(1)掌握一维数组的定义与初始化,会正确访问数组元素,并利用循环对元素成批访问。
(2)掌握二维数组的定义与初始化,会利用双层循环对元素访问,实现一些基本算法。
(3)会用一维数组作为参数实现特定功能的函数,能正确实现一维数组中的一些经典算法。

二、实验环境(实验设备)

硬件: 微型计算机
软件: Windows 操作系统、Microsoft Visual Studio 2010
实验题目(1)【见实验教材实验五的题目1】:编写程序exp5_1.c,在主函数中定义一维数组int array[10],自定义以下函数:输入数组元素,输出数组元素、求数组元素平均值、输出数组元素最大值、输出数组元素最小值、查找某数值元素是否存在(若存在,请输出下标)、给数组元素排序,要求在主函数中对各子函数进行调用和测试。

三、实验过程

实验解答:

① 写出完整的源程序代码并做适当注释:

#include<stdio.h>
#define N 10

void input(int array[], int n) 
{
	int i;
	printf("please input %d numbers:",n);
	for (i = 0; i < n; i++)
	{
		scanf("%5d", &array[i]);
	}
	printf("\n");
}
void print(int array[], int n)  
{
	int i;
	printf("The elements are:");
	for (i = 0; i < n; i++)
	{
		printf("%5d", array[i]);
	}
	printf("\n");
}
double aveNum(int array[], int n)  
{
	int i, sum = 0;
	for (i = 0; i < n; i++)
	{
		sum += array[i];
	}
	return sum * 1.0 / n;
}
int maxNum(int array[], int n)  
{
	int i, max;
	max = array[0];
	for (i = 1; i < n; i++)
	{
		if (array[i] > max)
		{
			max = array[i];
		}
	}
	return max;
}

int minNum(int array[], int n)  
{
	int i, min;
	min = array[0];
	for (i = 1; i < n; i++)
	{	
		if (array[i] < min)
		{
			min = array[i];
		}
	}
	return min;
}

int find(int array[], int n, int x)   //查找下标 
{
	int i = 0;
	while (i < n)
	{
		if (x == array[i])
		{
			break;
		}
		i++;
	}
	return i;
}

void bubbleSort(int array[], int n)  //数组排序 
{
	int i, j, temp;
	for (i = 0; i < n - 1; i++)
		for (j = n - 1; j > i; j--)
			if (array[j] < array[j - 1])
			{
				temp = array[j - 1];
				array[j - 1] = array[j];
				array[j] = temp;
			}
}

int main()
{
	int array[N], x, n, pos, max, min;
	double ave = 0;
	do            
	{
		printf("please enter the number of elements(1<=number<=10):\n");
		scanf("%d", &n);
	} while (n<1 || n>N);
	input(array, n);
	print(array, n);
	ave = aveNum(array, n);
	printf("The avenum is %f\n", ave);
	max = maxNum(array, n);
	printf("The maxnum is %d\n", max);
	min = minNum(array, n);
	printf("The minnum is %d\n", min);
	printf("please input x be searched:");
	scanf("%d", &x);
	pos = find(array, n, x);
	if (pos < n)
	{
		printf("value=%d,index=%d\n", x, pos);
	}
	else
	{
		printf("Not present!\n");
	}
	printf("new order");
	bubbleSort(array, n);
	print(array, n);
	printf("\n");
	return 0;
}

实验题目(2)

【见实验教材实验五的题目2】:编写程序exp5_2.c,定义一个3*3的矩阵,要求实现读入矩阵、输出矩阵、矩阵转置、输出矩阵主对角线元素之和,所有功能均采用子函数实现。

实验解答:

①源程序exp5_2.c的源代码如下:

#include<stdio.h>
#define ROW 3
#define COL 3

void input(int array[][COL],int n)
{
	int i,j;
	printf("please input 9 intergers:");
	for(i=0;i<ROW;i++)
	{
		for(j=0;j<COL;j++)
		{
			scanf("%4d",&array[i][j]);
		}
	}
}

void print(int array[][COL],int n)
{
    int i,j;
	printf("before transpose:\n");
	for(i=0;i<ROW;i++)
	{
		for(j=0;j<COL;j++)
		{	
			printf("%4d",array[i][j]);
		}
		printf("\n");
	}
}

void transposition(int array[][COL],int array2[][ROW],int n)
{
	int i,j;
	for(i=0;i<COL;i++)
	{
		for(j=0;j<ROW;j++)
		{
			array2[i][j]=array[j][i];
		}
	}
	printf("After transpose:\n");
	for(i=0;i<COL;i++)
	{
		for(j=0;j<ROW;j++)
		{
			printf("%4d",array2[i][j]);
		}
		printf("\n");
	}
}

int getSum(int array[][COL],int n,int diag[3])
{
	int i,sum=0;
	for(i=0;i<3;i++)
	{
	    diag[i]=array[i][i];
	    sum+=diag[i];
	}
	return sum;
}

int main()
  {
	int array[ROW][COL], array2[COL][ROW], diag[3], sum;
	input(array, 3);
	print(array, 3);
    transposition(array, array2, 3);
	sum=getSum(array, 3, diag);
	printf("Sum of main diagonal elements:%d\n", sum);
	return 0;
}

②输入的数据及运行结果是:

输入的数据:1 3 5 7 9 2 4 6 8 
运行的结果:
Before transpose:
1  3  5
7  9  2
4  6  8
After transpose:
1  7  4
3  9  6
5  2  8
Sum of main diagonal elements :  18

实验题目(3)

【见实验教材实验五的题目6】:编写程序exp5_6.c,请判断花瓶是谁打碎的。教师花瓶碎了,班级只有四个小同学,老师询问小同学,已知是其中1人打碎的,还知道4人中每个人要么是诚实的,要么总是说谎的。
小同学回答老师的问题是:
甲说:“乙没有打碎,是丁打碎的。”
乙说:“我没有打碎,是丙打碎的。”
丙说:“甲没有打碎,是乙打碎的。”
丁说:“我没有打碎。”
根据四人回答判断谁打碎了花瓶。

实验解答:

①源程序exp5_6.c的源代码如下:

#include <stdio.h>
int main()
{
	int array[4]={0},i;
	for(i=0;i<4;i++)
	{
		array[i]=1;
		if(array[3]+array[1]&&array[2]+array[1]&&array[0]+array[1])
		{
			printf("打碎花瓶的是:%d\n",i);
			break;
		}
		array[i]=0;
	}
	printf("(0,1,2,3别代表甲,乙,丙,丁)\n");
	return 0;
}

②运行结果是:

打碎花瓶的是:1
(0,1,2,3分别代表甲,乙,丙,丁)

四、实验小结(包括问题和解决方法、心得体会、意见与建议、实验出错信息及解决方案等)

(一)实验中遇到的主要问题及解决方法

  1. 无法理解“要么说真话,要么说假话”,以及如何用代码表示其意义。听了老师的讲解和提示后,自己思考后写出来。

(二)实验心得

  1. 学会了矩阵的转置,冒泡排序,以及矩阵元素及数组元素的交换。
  2. 熟悉了定义函数时应该给的返回值类型。

(三)意见与建议(没有可省略)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦是远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值