实验4

实验任务1

源代码

#include<stdio.h>
#define N 4
#define M 2
void test1(){
 int x[N]={1,9,8,4};
 int i;
 printf("sizeof(x)=%d\n",sizeof(x));
 for(i=0;i<N;++i)
  printf("%p:%d\n",&x[i],x[i]);
 printf("x=%p\n",x);
}
void test2(){
 int x[M][N]={{1,9,8,4},{2,0,4,9}};
 int i,j;
 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");
}
int main(){
 printf("测试1:int型一维数组\n");
 test1();
 printf("\n测试2:int二维型数组\n");
 test2();
 
 return 0;
}

运行结果

image

问题1:一维数组在内存中是连续存放的,x和&x[0]的值是相等的,因为数组名x本身就代表数组首元素的地址。

问题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;
}

运行结果

4task2

问题1:以input函数为例,形参是int x[],实参是x.

问题2:函数input的功能:从键盘输入n个整数,并存储到数组x中,函数compute的功能是:计算数组的“去极值平均”,即去掉一个最大值和一个最小值后,剩余元素的平均值。

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

运行结果

4task3

问题1:以output函数为例,形参是int x[][N],实参是x。

问题2:两维数组作为函数形参时,第二维大小不能省略,如果省略,编译器会报错,因为二维数组的内存布局需要知道第二维的大小才能正确计算元素的地址。

问题3:函数output的功能是:输出二维数组的所有元素,按行打印。函数init的功能是:将二维数组的所有元素初始化为指定的值。

实验任务4

源代码

#include<stdio.h>
#define N 100
void input(int x[],int n);
double median(int x[],int n);
void sort(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){
	int i;
	for(i=0;i<n;i++){
		scanf("%d",&x[i]);
	}
 }
 void sort(int x[],int n){
 	int i,j;
 	for(i=0;i<n-1;i++){
 		for(j=0;j<n-i-1;j++){
 			if(x[j]>x[j+1]){
 				int temp=x[j];
 				x[j]=x[j+1];
 				x[j+1]=temp;
 				
			 }
		 }
	 }
 }
 double median(int x[],int n){
 	sort(x,n);
 	if(n%2==1){
 		return x[n/2];
	 }else{
	 	return(x[n/2-1]+x[n/2])/2.0;
	 }
 }

运行结果

4task4

实验任务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("Enter n:");
	scanf("%d",&n);
	input(x,n);
	printf("原始矩阵:\n");
	output(x,n);
	rotate_to_right(x,n);
	printf("变换后矩阵:\n");
	output(x,n);
	return 0;
}
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]);
    }
}
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){
	int i,j;
	int last_col[N];
	for(i=0;i<n;++i){
		last_col[i]=x[i][n-1];
	}
	for(j=n-1;j>0;--j){
		for(i=0;i<n;++i){
			x[i][j]=x[i][j-1];
		}
	}
	for(i=0;i<n;++i){
	x[i][0]=last_col[i];
	}
}

运行结果

4task5

实验任务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);
        printf("\n");
        dec_to_n(x, 8);
        printf("\n");
        dec_to_n(x, 16);
        printf("\n");
    }
    return 0;
}

void dec_to_n(int x, int n) {
    if (x == 0) {
        printf("0");
        return;
    }
    char digits[N];
    int i = 0;
    int temp = x;
    if (temp < 0) {
        temp = -temp;
        printf("-");
    }
    while (temp > 0) {
        int remainder = temp % n;
        if (remainder < 10) {
            digits[i++] = remainder + '0';
        } else {
            digits[i++] = remainder - 10 + 'A';
        }
        temp /= n;
    }
    int j;
    for (j = i - 1; j >= 0; j--) {
        printf("%c", digits[j]);
    }
}

运行结果

4task6

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

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]);
    }
}

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) {
    int magic_sum = n * (n * n + 1) / 2;
    int i;
    for (i = 0; i < n; ++i) {
        int row_sum = 0;
        int j;
        for (j = 0; j < n; ++j) {
            row_sum += x[i][j];
        }
        if (row_sum != magic_sum) {
            return 0;
        }
    }
    int j;
    for (j = 0; j < n; ++j) {
        int col_sum = 0;
        int i;
        for (i = 0; i < n; ++i) {
            col_sum += x[i][j];
        }
        if (col_sum != magic_sum) {
            return 0;
        }
    }
    int diag_sum1 = 0;
    
    for (i = 0; i < n; ++i) {
        diag_sum1 += x[i][i];
    }
    if (diag_sum1 != magic_sum) {
        return 0;
    }
    int diag_sum2 = 0;
    
    for (i = 0; i < n; ++i) {
        diag_sum2 += x[i][n - 1 - i];
    }
    if (diag_sum2 != magic_sum) {
        return 0;
    }
    int exist[N * N + 1] = {0};
    
    for (i = 0; i < n; ++i) {
    	int j;
        for (j = 0; j < n; ++j) {
            int val = x[i][j];
            if (val < 1 || val > n * n || exist[val]) {
                return 0;
            }
            exist[val] = 1;
        }
    }

    return 1;
}

运行结果

4task7

posted @ 2025-11-16 13:13  fhe  阅读(7)  评论(0)    收藏  举报