实验4

实验任务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;
}

image

 问题1:一维数组在内存中是连续存放的,x和x[0]的地址值一样

问题2:二维数组在内存中是按行连续存放的(即存放完一个一维数组后接着存放下一个一维数组),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;
}

image

 问题1:一维数组形参书写形式为数组类型+数组名+【 】,实参书写形式为只写数组名

 问题2:函数input的功能是将你输入的数放入数组中,函数compute的功能是计算你输入的n个数去掉一个最大数和一个最小数后的平均数

 

实验任务3:

#include <stdio.h>
#define N 100
int x[N][N];

// 函数声明
void output(int x[][N], int n);
void init(int x[][N], int n, int value);

int main() {
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;
}

image

 问题1:二维数组形参的书写方式是数组类型+数组名+【 】+【一维数组大小】,实参的书写方式是仅写数组名

问题2:不能省略第二维大小,如果省略会报错“缺少下标”

问题3:函数output的功能是输出一个由value填满的n*n大小的方阵,函数init的功能是将value赋值给二维数组x中的前n个一维数组中的前n个数

 

实验任务4:

#include <stdio.h>
#define N 100

void input(int x[], int n);
double median(int x[], int n);

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)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (x[i] < x[j])
{
int temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
if (n%2==1)
{
return x[n / 2 ]/1.0;
}
else if (n%2==0)
{
return (x[n/2-1]+x[n/2])/2.0;
}
}

image

 

实验任务5:

#include <stdio.h>
#define N 100

// 函数声明
void input(int x[][N], int n);
void output(int x[][N], int n);
void rotate_to_right(int x[][N],int n);

int main() {
int x[N][N];
int n;

printf("输入n: ");
scanf("%d", &n);
input(x, n);

printf("原始矩阵:\n");
output(x, n);
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");
}
}
void rotate_to_right(int x[][N],int n)
{
for (int i = 0; i < n ; i++)
{
int temp= x[i][n-1];
for (int j = n-1; j > 0 ; j--)
{
x[i][j] = x[i][j - 1];
}
x[i][0] = temp;
}
}

image

 

实验任务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;
}
void dec_to_n(int x, int n)
{
int arr[64];
int num = 0;
while (1)
{
if (x / n != 0)
{
arr[num] = x % n;
x = x / n;
num++;
}
else
{
arr[num] = x;
break;
}
}
for (int i = num ; i >= 0; i--)
{
switch (arr[i])
{
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
default:
printf("%d", arr[i]);
break;
}
}
printf("\n");
}

image

 实验任务7:

 

#include <stdio.h>
#define N 100

void input(int x[][N], int n);
void output(int x[][N], int n);
int is_magic(int x[][N], int n);

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");
}
}
int is_magic(int x[][N], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (x[i][j] > n * n)
return 0;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n-1; j++)
{
for (int p = i ; p < n; p++)
{
for (int q = j + 1; q < n; q++)
{
if (x[i][j] == x[p][q])
return 0;
}
}
}
}
int sum1[N] = { 0 };
int sum2[N] = { 0 };
int sum3[2] = { 0 };
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
sum1[i] = sum1[i] + x[i][j];
sum2[i] = sum2[i] + x[j][i];
}
}
for (int i = 0; i < n; i++)
{
sum3[0] =sum3[0] + x[i][i];
sum3[1] = sum3[1] + x[i][n - 1 - i];
}
int s = sum1[0];
for (int i = 0; i < n-1; i++)
{
if (sum1[i] != s)
return 0;
}
for (int i = 0; i < n; i++)
{
if (sum2[i] != s)
return 0;
}
for (int i = 0; i < 2; i++)
{
if (sum3[i] != s)
return 0;
}
return 1;
}

image

 

image

 

image

 

实验任务8:

#include <stdio.h>
int main()
{
for (int i = 47; i < 100; i++)
{
int arr[10] = { 0 };
int temp1 = i * i;
int temp2 = i * i * i;
int a = 0;
while (temp1 != 0)
{
arr[a] = temp1 % 10;
temp1 = temp1 / 10;
a++;
}
while (temp2 != 0)
{
arr[a] = temp2 % 10;
temp2 = temp2 / 10;
a++;
}
int sum = 0;
for (int j = 0; j < 9; j++)
{
for (int k = j + 1; k < 10; k++)
{
if (arr[j] != arr[k])
sum = sum + 1;
}
}
if (sum == 45)
{
printf("%d", i);
break;
}
}
return 0;
}

image

 

posted @ 2025-11-13 23:25  陈江流  阅读(0)  评论(0)    收藏  举报