实验4

test_1

#include<stdio.h>
#define N 4
#define M 2

void test_1()
{
    int x[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]);
    }
    
    printf("x = %p\n", x);
}

void test_2()
{
    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");
    test_1();
    
    printf("\n测试2: int型二维数组\n");
    test_2();
    
    return 0;
}

问题1:连续存放。一样。

问题2:按行连续存放。x的值、x[0]、&x[0][0]其值在字面上是一样的。相差16。差值的意义是每一行所占字节数。

 

test_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;
    int i;
    double answer;
    
    while(printf("Enter n: "), scanf("%d",&n)!=EOF)
    {
        input(x, n);
        answer = compute(x, n);
        printf("answer = %.2f\n\n", answer);
    }
    
    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;
    int high, low;
    double answer;
    
    high = low = x[0];
    answer = 0;
    
    for(i=0; i<n; i++)
    {
        answer += x[i];
        
        if(x[i] > high)
        {
            high = x[i];
        }
        else if(x[i] < low)
        {
            low = x[i];
        }
    }
    
    answer = (answer - high - low)/(n-2);
        
    return answer;
}

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

问题:input功能是为数组元素赋值。compute的功能是求数组去最大值和最小值后的平均值。

 

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

观察: 形参是int x[][N]&int x[N][N](主函数)。实参是x。

问题1:第二维的大小不可省略。

问题2:output功能是按矩阵格式输出数组。init的功能是为数组的每一个元素赋值。

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

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

void sort(int x[], int n)
{
    int i, t;
    int m = 0;
    
    for(i=0; i<n; i++)
    {
        for(t=0; t<n; t++)
        {
            if(x[i]<x[t])
            {
                m = x[i];
                x[i] = x[t];
                x[t] = m;
            }
        }
    }    
    
}

 

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

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

task_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 sum_row(int x[][N], int n);
int sum_colunm(int x[][N], int n);
int sum_diagonal(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)
{
    if(sum_row(x, n) && sum_colunm(x, n) && sum_diagonal(x, n))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int sum_row(int x[][N], int n)
{
    int row[N];
    int i, j;
    int count = 0;
    
    for(i=0;i<n;i++)
    {
        row[i] = 0;
    }
    
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            row[i] += x[i][j]; 
        }
        if(row[i] == n*(n*n+1)/2)
        {
            count++;
        }
    }

    if(count == n)
        return 1;
    else
        return 0;
}

int sum_colunm(int x[][N], int n)
{
    int colunm[N];
    int i, j;
    int count = 0;
    
    for(j=0;j<n;j++)
    {
        colunm[j] = 0;
    }
    
    for(j=0;j<n;j++)
    {
        for(i=0;i<n;i++)
        {
            colunm[j] += x[i][j];
        }
        
        if(colunm[j] == n*(n*n+1)/2)
        {
            count++;
        }
    }
    
    if(count == n)
        return 1;
    else
        return 0;
}

int sum_diagonal(int x[][N], int n)
{
    int p = 0, m = 0;
    int i, j;
    
    for(i=0,j=0;i<n,j<n;i++,j++)
    {
        p += x[i][j];
    }
    
    for(i=0,j=n-1;i<n,j>=0;i++,j--)
    {
        m += x[i][j];
    }
    
    if(p == n*(n*n+1)/2 && m == n*(n*n+1)/2)
        return 1;
    else
        return 0;
}

实验8不会

问了同学之后再做

posted @ 2024-11-10 19:47  骄傲的蒂花之秀  阅读(2)  评论(0编辑  收藏  举报