实验四

task1

#include <stdio.h>
#define N 4  //定义两个常量,如N=4,M=2 
#define M 2

void test1(){
    int x[N]={1,9,8,4};//将N初始化,赋予N初始值1,9,8,4
    int i;
    
    printf("sizeof(x)=%d\n",sizeof(x));//输出数组x占用的内存字节数
    
    for(i=0;i<N;++i){
        printf("%p:%d\n",&x[i],x[i]);//输出每个元素的地址、值 
        //%p是格式控制符,专门用于输出变量存储的内存地址 
        //第一个x[i]是取该元素内存地址,第二个x[i]则表示具体数值 
    } 
    printf("x=%p\n",x);//输出数组名x对应的值 
}

void test2(){
    int x[M][N]={{1,9,8,4},{2,0,4,9}};//定义并初始化一个二维数组,定义两行四列,第一行1,9,8,4。第二行2,0,4,9 
    int i,j;
    
    printf("sizeof(x)=%d\n",sizeof(x));//输出二维数组x占用的内存字节数
    
    for(i=0;i<M;++i){
        for(j=0;j<N;++j){
            printf("%p:%d\n",&x[i][j],x[i][j]);//第一个x[i]是取该元素内存地址,第二个x[i]则表示具体数值 
        }
        printf("\n");
    } 
    printf("x=%p\n",x);//输出二维数组名x对应的地址=第0行的起始地址 
    printf("x[0]=%p\n",x[0]);//输出第0行的数组名x[0]对应的地址=第0行第0列元素的起始地址 
    printf("x[1]=%p\n",x[1]);//输出第1行的数组名x[1]对应的地址=第1行第0列元素的起始地址 
    printf("\n");
}

int main(){
    printf("测试1:int型一维数组\n");
    test1();
    
    printf("测试2:int型二维数组\n");
    test2();
    
    return 0;
}

task1 运行截图

实验4 task1运行截图

ans1:一维数组x在内存中连续存放,x和&x[0]的值完全相同
ans2:二维数组x在内存中连续存放,x[0]和&x[0][0]的值完全相同,x[0]和x[1]相差16,该差值的含义是 相差一行字节(4个)的内存字节数4*4=16

task2

#include <stdio.h>
#define N 100//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];//x[0]=0 
    ans=0;
    
    for(i=0;i<n;++i){
        ans+=x[i];//计算ans总结果 
        
        if(x[i]>high)//取最大值最小值过程 
        high=x[i];
        else if(x[i]<low)
        low=x[i];
    }
    
    ans=(ans-high-low)/(n-2);//计算减去最大值最小值后的平均数 
    
    return ans;
}

task2 运行截图

实验4 task2运行截图

ans1:input的形参是int x[],实参书写形式是数组
ans2: input的功能是将用户外部输入的数字储存于数组之中,compute的功能是计算用户输入数字去掉最大值与最小值后的平均值

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

task 3运行截图

实验4 task3运行截图

ans1:output的形参是intx[][N],实参是数组x[i][j]
ans2:不可以省略,如果省略便会导致不知数组范围,导致编译器无法识别并进行。
ans3:output作用为输出数组x[i][j]数值,init的作用为将value的值赋予数组,便于函数output的运行。

task 4

#include <stdio.h>
#define N 100

double median(int x[],int n);
void input(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,j,t;
    
    for(i=0;i<n;++i){
        scanf("%d",&x[i]);
        } 
    for(i=0;i<n;++i){
        for(j=0;j<n;++j){
            if(x[j]>x[j+1]){
                t=x[j];
                x[j]=x[j+1];
                x[j+1]=t;
        }
    }
    }
}

double median(int x[],int n){
    double ans;
    if(n%2==1){
        ans=x[(n+1)/2];
    }
    else{
        ans=(x[n/2]+x[n/2-1])/2.0;
    } 
    
    return ans;
}

task 4运行截图

实验4 task4运行截图

task 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 t[N][N],i,j;
    
    for(i=0;i<n;++i){
        t[i][0]=x[i][n-1];
        for(j=n-2;j>=0;--j){
            x[i][j+1]=x[i][j];
        }
        x[i][0]=t[i][0];
    }
}

task 5 运行截图

实验4 task5运行截图

task 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 ans[N];
    int i=0,j;
    
    while(x!=0){
        ans[i]=x%n;
        x=x/n;
        ++i;
    }
    
    for(j=i-1;j>=0;--j){
        if(ans[j]>=10){
            printf("%c",'A'+ans[j]-10);
        }
        else{
            printf("%d",ans[j]);
        }
    }
    
    printf("\n");
}

task 6 运行截图

实验4 task6运行截图

 task 7

#include <stdio.h>
#define N 100
#include <math.h>
#define _CRT_SECURE_NO_WARNINGS

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 i,j;
    int sum1,sum2,sum3=0,sum4=0;
    
    if(n%2==0){
        return 0;
    }
    
    //判断有没有重复元素
    int y[N*N+1]={0};
    for(i=0;i<n;++i){
        for(j=0;j<n;++j){
            int a=x[i][j];
            if(y[a]!=0){
                return 0;
            }
            else if(a<1||a>(n*n)){
                return 0;
            }
            y[a]=1; 
            }
        }
    
    int ans=0;
    
    for(j=0;j<n;++j){
        ans+=x[0][j];
    }
    //
     for(i=1;i<n;++i){
         int sum1=0;
         for(j=0;j<n;++j){ 
             sum1+=x[i][j];
        }
        if(sum1!=ans){
             return 0;
        }
     }
     //
     for(j=0;j<n;++j){
         int sum2=0;
         for(i=0;i<n;++i){
             sum2+=x[i][j];
        }
        if(sum2!=ans) 
        return 0;
     }
     //主对角线 
     for(i=0;i<n;++i){
             sum3+=x[i][i];
        }
        if(sum3!=ans){
            return 0;
        }
     //副对角线 
     for(i=0;i<n;++i){
             sum4+=x[i][n-1-i];
    }
    if(sum4!=ans){
             return 0;
        }
    
    return 1;
}

task 7 运行截图

实验4 task7运行截图(1)实验4 task7运行截图(2)实验4 task7运行截图(3)实验4 task7运行截图(4)

 

posted @ 2025-11-16 20:11  瀮昀  阅读(7)  评论(0)    收藏  举报