实验四 C语言数组应用编程

实验四 C语言数组应用编程

实验任务1——内存地址

#include <stdio.h>
#define N 4
#define M 2
void test1() {
	int x[N] = { 1, 9, 8, 4 };
	int i;
	// 输出数组x占用的内存字节数
	printf("sizeof(x) = %d\n", sizeof(x));
	// 输出每个元素的地址、值
	for (i = 0; i < N; ++i)
		printf("%p: %d\n", &x[i], x[i]);
	// 输出数组名x对应的值
	printf("x = %p\n", x);
}
void test2() {
	int x[M][N] = { {1, 9, 8, 4}, {2, 0, 4, 9} };
	int i, j;
	// 输出二维数组x占用的内存字节数
	printf("sizeof(x) = %d\n", sizeof(x));
	// 输出每个元素的地址、值
	for (i = 0; i < M; ++i)
		for (j = 0; j < N; ++j)
			printf("%p: %d\n", &x[i][j], x[i][j]);
	printf("\n");
	// 输出二维数组名x, 以及,x[0], x[1]的值
	printf("x = %p\n", x);
	printf("x[0] = %p\n", x[0]);
	printf("x[1] = %p\n", x[1]);
	printf("\n");
}
int main() {
	printf("测试1: int型一维数组\n");
	test1();
	printf("\n测试2: int型二维数组\n");
	test2();
	return 0;
}
1-1


问题1 int型一维数组x,在内存中是否是连续存放的?数组名x对应的值,和&x[0]是一样的吗?

是。是。

问题2 int型二维数组x,在内存中是否是"按行连续存放"的?数组名x的值、x[0]、&x[0][0],其值,在字面上,是一样的吗?x[0]和x[1]相差多少?你能猜测/推断出这个差值的意义吗?

是。是。16。数组每行占用内存的长度。

实验任务2——平均值

#include <stdio.h>
#define N 100
// 函数声明
void input(int x[], int n);
double compute(int x[], int n);
int main() {
	int x[N];
	int n, i;
	double ans;
	while (printf("Enter n: "), scanf("%d", &n) != EOF) {
		input(x, n); // 函数调用
		ans = compute(x, n); // 函数调用
		printf("ans = %.2f\n\n", ans);
	}
	return 0;
}
// 函数定义
void input(int x[], int n) {
	int i;
	for (i = 0; i < n; ++i)
		scanf("%d", &x[i]);
}
// 函数定义
double compute(int x[], int n) {
	int i, high, low;
	double ans;
	high = low = x[0];
	ans = 0;
	for (i = 0; i < n; ++i) {
		ans += x[i];
		if (x[i] > high)
			high = x[i];
		else if (x[i] < low)
			low = x[i];
	}
	ans = (ans - high - low) / (n - 2);
	return ans;
}
2-1


问题1 函数input的功能是?函数compute的功能是?

input将输入的数字存入数组xcompute将数组x,求去除了最大最小值的平均值并返回。

实验任务3——方阵

#include <stdio.h>
#define N 100
// 函数声明
void output(int x[][N], int n);
void init(int x[][N], int n, int value);
int main() {
	int x[N][N];
	int n, value;
	while (printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) {
		init(x, n, value); // 函数调用
		output(x, n); // 函数调用
		printf("\n");
	}
	return 0;
}
// 函数定义
void output(int x[][N], int n) {
	int i, j;
	for (i = 0; i < n; ++i) {
		for (j = 0; j < n; ++j)
			printf("%d ", x[i][j]);
		printf("\n");
	}
}
// 函数定义
void init(int x[][N], int n, int value) {
	int i, j;
	for (i = 0; i < n; ++i)
		for (j = 0; j < n; ++j)
			x[i][j] = value;
}
3-1


问题1 两维数组作为函数形参时,哪一维的大小不能省略?

第二维。

问题2 函数output功能是?函数init的功能是?

output输出指定大小的数组。init将指定值存入指定大小的方阵。

实验任务4——输出中值

#include <stdio.h>
#define N 100
// 函数声明
void input(int x[], int n);
double median(int x[], int n);
// 待补足
// xxx
int main() {
	int x[N];
	int n;
	double ans;
	while (printf("Enter n: "), scanf("%d", &n) != EOF) {
		input(x, n); // 函数调用
		ans = median(x, n); // 函数调用
		printf("ans = %g\n\n", ans);
	}
	return 0;
}
// 函数定义
void input(int x[], int n) {
	for (int i = 0; i < n; ++i) {
		scanf("%d", &x[i]);
	}
}

double median(int x[], int n) {
	int m, flag;
	for (int i1 = 0; i1 < n - 1; i1++) {
		flag = 1;
		for (int i2 = 0; i2 < n - 1 - i1; i2++) {
			if (x[i2] > x[i2 + 1]) {
				m = x[i2]; x[i2] = x[i2 + 1]; x[i2 + 1] = m;
				flag = 0;
			}
		}
		if (flag) {
			break;
		}
	}
	if (n % 2) {
		return x[n / 2];
	}
	else {
		return (x[n / 2 - 1] + x[n / 2]) / 2.0;
	}
}
// 待补足
// xxx
4-1


实验任务5——位移

#include <stdio.h>
#define N 100
// 函数声明
void input(int x[][N], int n);
void output(int x[][N], int n);
// 函数rotate_to_right声明
void rotate_to_right(int x[][N], int n);
// 待补足
// ×××
int main() {
	int x[N][N];
	int n;
	printf("Enter n: ");
	scanf("%d", &n);
	input(x, n);
	printf("原始矩阵:\n");
	output(x, n);
	// 函数rotate_to_right调用
	rotate_to_right(x, n);
	// 待补足
	printf("变换后矩阵:\n");
	output(x, n);
	return 0;
}
// 函数定义
// 功能: 输入一个n*n的矩阵x
void input(int x[][N], int n) {
	int i, j;
	for (i = 0; i < n; ++i) {
		for (j = 0; j < n; ++j)
			scanf("%d", &x[i][j]);
	}
}
// 函数定义
// 功能: 输出一个n*n的矩阵x
void output(int x[][N], int n) {
	int i, j;
	for (i = 0; i < n; ++i) {
		for (j = 0; j < n; ++j)
			printf("%4d", x[i][j]);
		printf("\n");
	}
}
// 函数rotate_to_right定义
void rotate_to_right(int x[][N], int n) {
	int temp;
	for (int i1 = 0; i1 < n; i1++) {
		temp = x[i1][n - 1];
		for (int i2 = n-1; i2 > 0; i2--) {
			x[i1][i2] = x[i1][i2 - 1];
		}
		x[i1][0] = temp;
	}
}
// 功能: 把一个n*n的矩阵x,每一列向右移, 最右边被移出去的一列绕回左边
// 待补足
// xxx
5-1


实验任务6——进制转换

#include <stdio.h>
#define N 100
void dec_to_n(int x, int n); // 函数声明
int main() {
	int x;
	while (printf("输入十进制整数: "), scanf("%d", &x) != EOF) {
		dec_to_n(x, 2); // 函数调用: 把x转换成二进制输出
		dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出
		dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出
		printf("\n");
	}
	return 0;
}
// 函数定义
// 功能: 把十进制数x转换成n进制,打印输出
// 补足函数实现
void dec_to_n(int x, int n) {
	int a[N];
	int i;
	if (n == 2) {
		i = 0;
		while (x) {
			a[i++] = x % 2;
			x /= 2;
		}
		for (i--; i >= 0; i--) {
			printf("%d", a[i]);
		}
		printf("\n");
	}
	else if (n == 8) {
		i = 0;
		while (x) {
			a[i++] = x % 8;
			x /= 8;
		}
		for (i--; i >= 0; i--) {
			printf("%d", a[i]);
		}
		printf("\n");
	}
	else {
		i = 0;
		while (x) {
			a[i++] = x % 16;
			x /= 16;
		}
		for (i--; i >= 0; i--) {
			if (a[i] >= 10) {
				a[i] += 55;
			}
			else {
				a[i] += 48;
			}
			printf("%c", a[i]);
		}
		printf("\n");
	}
}
// xxx
6-1


实验任务7——魔方矩阵

#include <stdio.h>
#define N 100
// 函数声明
void input(int x[][N], int n);
void output(int x[][N], int n);
// 待补足函数is_magic声明
int is_magic(int x[][N], int n);
// xxx
int main() {
	int x[N][N];
	int n;
	while (printf("输入n: "), scanf("%d", &n) != EOF) {
		printf("输入方阵:\n");
		input(x, n);
		printf("输出方阵:\n");
		output(x, n);
		if (is_magic(x, n))
			printf("是魔方矩阵\n\n");
		else
			printf("不是魔方矩阵\n\n");
	}
	return 0;
}
// 函数定义
// 功能: 输入一个n*n的矩阵x
void input(int x[][N], int n) {
	int i, j;
	for (i = 0; i < n; ++i) {
		for (j = 0; j < n; ++j)
			scanf("%d", &x[i][j]);
	}
}
// 功能: 输出一个n*n的矩阵x
void output(int x[][N], int n) {
	int i, j;
	for (i = 0; i < n; ++i) {
		for (j = 0; j < n; ++j)
			printf("%4d", x[i][j]);
		printf("\n");
	}
}
// 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0
// 待补足函数is_magic定义
int is_magic(int x[][N], int n) {
	int t = 0, check = 0;
	int value[N * N] = { 0 };
	int val;

	for (int i = 0; i < n; i++) {
		t += x[0][i];
		val = x[0][i];
		if (val<1 || val>n * n || value[val - 1]) {
			return 0;
		}
		value[val - 1] = 1;
	}
	for (int i1 = 1; i1 < n; i1++) {
		check = 0;
		for (int i2 = 0; i2 < n; i2++) {
			check += x[i1][i2];
			val = x[i1][i2];
			if (val<1 || val>n * n || value[val - 1]) {
				return 0;
			}
			value[val - 1] = 1;
		}
		if (check != t) {
			return 0;
		}
	}

	for (int i1 = 0; i1 < n; i1++) {
		check = 0;
		for (int i2 = 0; i2 < n; i2++) {
			check += x[i2][i1];
		}
		if (check != t) {
			return 0;
		}
	}

	check = 0;
	for (int i = 0; i < n; i++) {
		check += x[i][i];
	}
	if (check != t) {
		return 0;
	}

	check = 0;
	for (int i = 0; i < n; i++) {
		check += x[i][n-1-i];
	}
	if (check != t) {
		return 0;
	}

	return 1;
}
// xxx
7-1


实验任务8——打印数字

#include <stdio.h>

int main() {
	int num = 1;
	int x, y;
	int check[10];
	int flag = 0;
	while (num++) {
		flag = 0;
		x = num * num;
		y = num * num * num;
		for (int i = 0; i < 10; i++) {
			check[i] = 0;
		}
		while (x) {
			if (check[x % 10]) {
				flag = 1;
				break;
			}
			check[x % 10] = 1;
			x /= 10;
		}
		if (flag) {
			continue;
		}
		while (y) {
			if (check[y % 10]) {
				flag = 1;
				break;
			}
			check[y % 10] = 1;
			y /= 10;
		}
		if (flag) {
			continue;
		}
		for (int i = 0; i < 10; i++) {
			if (check[i] == 0) {
				flag = 1;
				break;
			}
		}
		if (flag) {
			continue;
		}
		printf("%d", num);
		return 0;
	}
}
8-1


posted @ 2024-11-05 13:59  氧化铜の人  阅读(59)  评论(0)    收藏  举报