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

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

时间:2024-11-05 14:01:29浏览次数:1  
标签:i2 int void 编程 C语言 ++ 数组 printf check

实验四 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


标签:i2,int,void,编程,C语言,++,数组,printf,check
From: https://www.cnblogs.com/cuo-ren/p/18526092

相关文章

  • 洛谷题单指南-二叉堆与树状数组-P3378 【模板】堆
    原题链接:https://www.luogu.com.cn/problem/P3378题意解读:实现二叉堆。解题思路:二叉堆本质上一棵完全二叉树,根节点称为堆顶,根据特性不同分为有两种:大根堆:所有父节点的值大于子节点,根节点最大小根堆:所有父节点的值小于子节点,根节点最小主要作用:动态维护序列,并快速找到最大/最......
  • 算法设计2——数组元素循环右移
    问题描述:有一个数组a包含n(n>1)个整数元素,设计一个尽可能高效的算法将数组a中的后面k个元素循环右移(k<=n),其中n是数组长度,0<=k<=n。例如:a=(1,2,3,4,5),k=3,结果:a=(3,4,5,1,2)思路:理解问题:将数组 a中的最后 k个元素移动到数组的前面,同时保持剩余元素的顺序不变。解决问题......
  • C语言学习之操作符
    (1)二进制、十六进制、八进制不同进制只是数值不同的表达形式,二进制转换十进制省略,从十进制转换到二进制(不断除二取余自下向上将余数从左到右写下来,就转换到二进制);从二进制转换八进制(从左向右每三位按二进制位换算一个八进制位,不够三个直接换算);从二进制转换到十六进制(跟八进制......
  • 0基础读顶会论文—Kappa:一种用于无服务器计算的编程框架
    原文链接代码:快速使用kappa首先的首先,可以先去了解一下lambda架构Abstract在本文中提出了Kappa,一个简化无服务器开发的框架。它使用检查点来处理lambda函数超时,并提供并发机制,实现并行计算和协调1Introduction无服务器计算是一种新的云范例,在这种范例中,租户不是配置虚拟机(V......
  • 新手必看!AIStarter能帮你做什么?【AI绘画、设计、对话、工作流、编程...】
    在当今这个技术飞速发展的时代,人工智能(AI)已经成为了推动各行各业创新的关键力量。为了帮助更多的人能够轻松地利用AI技术解决实际问题,AIStarter应运而生。作为一款面向开发者的强大工具,AIStarter不仅简化了AI模型的构建过程,还提供了丰富的资源和支持,让不论是初学者还是有经验......
  • GPT-Academic 编程类插件区使用教程
    GPT-Academic官网:GPT-Academic官方用户中心一.虚空终端在网络编程中,网络终端可以指一个通过网络连接到远程服务器或服务的终端,用户可以通过它来执行远程命令。二.解析整个python项目GPT(GenerativePre-trainedTransformer)是一种强大的语言模型,能够理解和生成自然语言文本......
  • c语言中三维数组
     001、[root@PC1test]#lstest.c[root@PC1test]#cattest.c#include<stdio.h>intmain(void){doubletensu[2][4][3]={{{3,4,2},{2,4,4},{2,4,3},{1,5,8}},{{4,4,2},{2,8,4},{2,8,9},{1,8,5}}};inti,j,k;for(i=0;i<2;......
  • (3)---【C语言】【GL库】【计算机图形学】DEV C++ 平台openGL库 下的画线图案设计 房
    声明:        由于本人是一名学生,现阶段还要完成学业,所以我们每周假期再回!谢谢大家理解和支持!上篇上手实践  运行结果 实现代码#include<windows.h>#defineGLUT_DISABLE_ATEXIT_HACK//处理不同系统的配置问题的宏#include<GL/glut.h>#include<std......
  • [编程笔记] 奇怪的bug - 公共提示组件不生效
    项目中有这么一个提示框:对应的代码是:top.msg.ok(123)很简单的一个功能,初看的时候就猜到是用的某个组件,其他地方要用一般照抄,改下文案即可,这种弹出肯定是公共组件了。然鹅,很神奇的是我新做的页面,复制以后没效果!由于是最近刚接触的项目,多少有点......
  • 【C语言】分支和循环详解(上)
    文章目录1.if语句2.关系操作符3.条件操作符4.逻辑操作符:&&,||,!5.switch语句C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种......