zltsxh

实验四

任务一

#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("x[0][0] = %p\n", &x[0][0]);
 printf("\n");
}
int main() {
 printf("测试1: int型一维数组\n");
 test1();
 printf("\n测试2: int型二维数组\n");
 test2();
 return 0;
}

  

 

问题一:是连续存放的;数组名x对应的值,和&x[0]是一样的。

问题二:是“按行连续存放”的;数组名x的值、x[0]、&x[0][0]的值是一样的;x[0]和x[1]相差16个字节;这个差值是该二维数组一行元素所占的大小。

任务二

 

#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;
}

观察:形参形式是 int x[ ];实参形式是  x。

问题:input 的功能是给数组x按顺序赋值;compute的功能是求数组x中除去最大值和最小值外的其他值的平均数。(保留两位小数)

 

任务三

#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;
}

问题一:第一维的大小不能省略。

问题二:函数output功能是按行输出二维数组x;函数init的功能是将二维数组按n行n列输入同一个值value。

任务四

#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){
	if(n%2==0){
		double a;
		a = (double)(x[n/2]+x[n/2-1])/2;
		return a;
	}else{
		return x[(n-1)/2];
	}
}

任务五

#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定义
// 功能: 把一个n*n的矩阵x,每一列向右移, 最右边被移出去的一列绕回左边
void rotate_to_right(int x[][N],int n){
	int y[N][N];
	for(int a=0;a<n;a++){
		for(int b=0;b<n;b++){
			y[a][b]=x[a][b];
		}
	}
	for(int a=0;a<n;a++){
		for(int b=0;b<n-1;b++){
			x[a][b+1]=y[a][b];
		}
		x[a][0]=y[a][n-1];
	}
}

  

 

  任务六

#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){
	if(x==0){
		printf("0");
	}else if(n==2||n==8){
		int a=1,b=0;
	while(x/n!=0){
		b=b+x%n*a;
		x=x/n;
		a=a*10;
	}
	b=b+x*a;
	printf("%d\n",b);
	}
	if(n==16){
		char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		char h[32];
		int i=0;
		while(x>0){
			h[i++]=hex[x%16];
			x/=16;
		}
		for(int j=i-1;j>=0;j--){
			printf("%c",h[j]);
		}
	}
	
}

  

任务七

#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);
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
int is_magic(int x[][N],int n){
	int a[n]={0},b[n]={0},c[n]={0},d[n]={0},A=0,B=0,C=0,D=0;
	for (int i = 0; i < n; ++i) {
		A=0;
     for (int j = 0; j < n; ++j){
     	A=A+x[i][j];
	 }
	 a[i]=A;
     }
	 for(int x=0;x<n;x++){
	 	for(int y=0;y<n;y++){
	 	 if(a[x]!=a[y]){
	 	 	return 0;
		  }
		 }
	 }
	for (int i = 0; i < n; ++i) {
		B=0;
     for (int j = 0; j < n; ++j){
     	B=B+x[j][i];
	 }
	 b[i]=B;
     }
	 	for(int x=0;x<n;x++){
	 	for(int y=0;y<n;y++){
	 	 if(b[x]!=b[y]){
	 	 	return 0;
		  }
		 }
	 }
	for (int i = 0; i < n; ++i) {
     	C=C+x[i][i];
     }  
		for (int i = 0; i < n; ++i) {
     	D=D+x[i][n-1-i];
     }
	if(C!=D||A!=B||A!=C||A!=D||B!=C||B!=D){
		return 0;
	}
  return 1;
}

  

任务八

#include <stdio.h>

int x(int num) {
    int number[10] = {0};
    int two = num * num;
    int three = num * num * num;
    while (two > 0) {
        number[two % 10]++;
        two /= 10;
    }
    while (three > 0) {
        number[three % 10]++;
        three /= 10;
    }
    for (int i = 0; i < 10; i++) {
        if (number[i]!= 1 && i!= 0) {
           return 0;
        }
    }
    return 1;
}

int main() {
    for (int i = 1; i < 10000; i++) {
        if (x(i)) {
            printf("%d\n", i);
            return 0;
        }
    }
    return 0;
}

  

 

  

  

posted on 2024-11-04 13:38  朱乐涛  阅读(21)  评论(0编辑  收藏  举报

导航