实验4

 实验任务一:

源代码:

#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");

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

 实验问题回答:

问题一:连续;x[0]和&x[0]的值相同

问题二:是按行连续存放;两者的值相同;差10字节;差值表示该二维数组一行占用的总字节

实验任务二:

源代码:

#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

 实验问题回答:

问题一:形参:int x[],实参:x

问题二:input的功能是将输入的n个数(n小于等于100且n为整数)从x[0]开始依次赋值给x[i];compute的功能是通过循环判断出n个数中的最大值和最小值,并求出n个数字的平均值

实验任务三:

源代码:

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

}

代码运行结果:

image

实验问题回答:

问题一:形式参数:x[][N];实际参数:x

问题二:不可以,编译器报错

image

 问题三:output的功能是打印n行输入的数(value),每行有n个value,及打印n*n个value

Init的功能是通过循环令x[][N]的值等于value

实验任务四:

源代码:

#include <stdio.h>
#define N 100

void input(int x[N],int n);
double median(int x[N],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[N],int n)
{
    int i;

    for(i = 0;i < n;++i)

    scanf("%d",&x[i]);

}



double median(int x[N],int n)
{
    int i,j,t;

    double ans = 0.0;

    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]+x[n/2-1])/2.0;

    return ans;

}

代码运行结果:

image

 实验任务五:

源代码:

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

 代码运行结果:

image

 实验任务六:

源代码:

#include <stdio.h>
#include <stdlib.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)
{
    char num[] = "0123456789ABCDEF";
    char result[100];
    int i = 0;
     
    if(x == 0)
    {
        printf("0\n");
        return;
    }
    
    while(x > 0)
    {
        int remain = x % n;
        result[i] = num[remain];
        i++;
        x = x / n;
    }
        for(int j = i-1;j >= 0;j--)
        printf("%c",result[j]);
        printf("\n");
    
    
}

代码运行结果:

image

 实验任务七:

源代码:

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

is_magic(int x[][N],int n)
{
    int num = n*n;
    int i,j;
    for(i = 0;i < n;i++)
    for(j = 0;j < n;j++)
    {
        int a = x[i][j];
        if(a < 1||a > num)
        return 0;
    }
    for(i = 0;i < n;i++)
    for(j = 0;j < n;j++)
    {
        int compare = x[i][j];
        for(int k = i;k < n;k++)
        {
            int b = (k ==i) ? j + 1 : 0;
            for(int chongfu = b;chongfu < n;chongfu++)
            if(compare == x[k][chongfu])
            return 0;
        }
    }
    
    int right_sum = n * (n * n + 1) / 2;
    int hang_sum;
    for (int i = 0; i < n; i++) 
    {
        hang_sum = 0;
        for (int j = 0; j < n; j++) 
        hang_sum =hang_sum + x[i][j];
        if (hang_sum != right_sum) 
        return 0;
    }

    int lie_sum;
    for (int j = 0; j < n; j++) 
    {
        lie_sum = 0;
        for (int i = 0; i < n; i++) 
        lie_sum =lie_sum + x[i][j];
        if (lie_sum != right_sum) 
        return 0;
    }

    int djx1 = 0; 
    int djx2 = 0; 
    for (int i = 0; i < n; i++) 
    {
        djx1 = djx1 + x[i][i];
        djx2 = djx2 + x[i][n - 1 - i];
    }
    if (djx1!= right_sum || djx2!= right_sum) 
    return 0; 

    return 1;
}

代码运行结果:

image

image

image

 

posted @ 2025-11-15 10:56  Lantesry  阅读(11)  评论(1)    收藏  举报