实验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[N][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");
      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("测试2:int 型二维数组\n");
      test2();
      return 0;
}

image

问题1:一维数组在内存中是连续存放的。x和&x[0]的值相同。
问题2:二维数组在内存中是连续存放的。x和&x[0]的值相同。
实验任务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:在input函数中,形参书写形式分别是数组x[]和一个整数n,实参书写形式分别是数组名x和整数n。
问题2:input函数存放输入的数组,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;
}

屏幕截图 2025-11-11 194048

 

问题1:在output函数中,两维数组作为函数参数时,形参书写形式分别是省略行的数组x[][N]和整数n,实参书写形式分别是数组名x和整数n。

问题2:两维数组作为函数形参时,第二维大小不能省略不写。

问题3:函数 output 的功能是输出一个二维数组,函数 init 的功能是将value赋值给二维数组的每个元素。

实验任务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){
    int i;
    for(i=0;i<n;++i)
        scanf("%d",&x[i]);
}
double median(int x[],int n){
    int i,j,t;
    double ans;
    for(j=0;j<n-1;++j){
        for(i=0;i<n-j-1;++i)
            if(x[i]>x[i+1]){
                t=x[i];
                x[i]=x[i+1];
                x[i+1]=t;
            }        
    }
    if(n%2!=0)
        ans=x[(n-1)/2];
    else  
        ans=(x[n/2-1]+x[n/2])/2.0;
    return ans;
}

    

4

实验任务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 temp[n][1]={0};
    for(i=0;i<n;++i){
        temp[i][1]=x[i][n-1];
        for(j=n-1;j>0;--j)
            x[i][j]=x[i][j-1];      
    } 
    for(i=0;i<n;++i)
        x[i][0]=temp[i][1];  
}   

5

 

实验任务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);
        dec_to_n(x,8);
        dec_to_n(x,16);
        printf("\n");
    }
    return 0;
}
void dec_to_n(int x,int n){
    int size=0;
    int i;
    
    if(n==2){
        int a[32];
        if(x==0){
            printf("0");
            return;
        }
        while(x>0){
            a[size]=x%2;
            x/=2;
            size++;    
        }
        for(i=size-1;i>=0;--i) 
            printf("%d",a[i]);
        printf("\n");
    }
    if(n==8){
        int a[32];
        if(x==0){
            printf("0");
            return;
        }
        while(x>0){
            a[size]=x%8;
            x/=8;
            size++;    
        }
        for(i=size-1;i>=0;--i) 
            printf("%d",a[i]);
        printf("\n");
    }
    if(n==16){
        char a[100];
        if(x==0){
            printf("0");
            return;
        }
        while(x>0){
            if(x%16<10){
                a[size]=x%16+'0';
                x/=16;
                size++;        
            }
            else{
                a[size]=x%16-10+'A';
                x/=16;
                size++;
            }
        }
        for(i=size-1;i>=0;--i) 
            printf("%c",a[i]);    
        printf("\n");
    }        
}

6

 实验任务7

 

#include<stdio.h>
#define N 100
void input(int x[][N],int n);
void output(int x[][N],int n);
bool 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");
    }
}
bool is_magic(int x[][N],int n){
    int i,j;
    int a[n]={0};
    int b[n]={0};
    int sum0;
    int sumdiag1=0;
    int sumdiag2=0;
    for(i=0;i<n;++i){
        for(j=0;j<n;++j)    
        a[i]+=x[i][j];
    }
    sum0=n*(n*n+1)/2;
    for(j=0;j<n;++j){
        for(i=0;i<n;++i)    
        b[j]+=x[i][j];
    }    
    for(j=0;j<n;++j){
        for(i=0;i<n;++i){
            if(i==j)
                sumdiag1+=x[i][j];
            if(i+j==n-1)
                sumdiag2+=x[i][j];
        }    
    }
    for(i=0;i<n;++i){
        if(a[i]!=sum0)
            return 0;
    }
    for(j=0;j<n;++j){
        if(b[j]!=sum0)
            return 0;    
    }
    if(sumdiag1!=sum0)
        return 0;
    if(sumdiag2!=sum0)
        return 0;
    return 1;    
}    

AE01397C1E43EF32BF24DF943A5C62A5

 

 

posted @ 2025-11-11 21:09  tensiontension  阅读(6)  评论(0)    收藏  举报