Bootstrap

11.20作业

题目一:

题目:

// 数组的行列转置

代码:

// 数组的行列转置
#include <stdio.h>
int main()
{
    int a[2][3], i, j, b[3][2];
    printf("输入一个两行三列的数组a:\n");
    for (i = 0; i < 2; i++)
        for (j = 0; j < 3; j++)
        {
            scanf("%d", &a[i][j]);
        }

    for (i = 0; i < 2; i++)
        for (j = 0; j < 3; j++)
        {
            b[j][i] = a[i][j];
        }

    printf("转置后得到的一个三行两列的数组b:\n");
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 2; j++)
        {
            printf("%d\t", b[i][j]);
        }
        printf("\n");
    }
}

题目二:

题目:

// 打印杨辉三角

代码:

#define N 11
#include <stdio.h>
int main()
{
    int i, j, a[N][N];

    for (i = 1; i < N; i++)
    {
        a[i][i] = 1;
        a[i][1] = 1;
    }

    for (i = 3; i < N; i++)
    {
        for (j = 2; j <= i - 1; j++)
        {
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
        }
    }

    for (i = 1; i < N; i++)
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

题目三:

题目:

// 数组对角线元素求和

代码:

#include <stdio.h>
#define N 3
int main()
{
    int a[N][N];
    int i, j, sum = 0;

    printf("输入%d行%d列的数组:\n", N, N);
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }

    for (i = 0; i < N; i++)
    {
        sum = sum + a[i][i] + a[i][N - 1 - i];
    }
    if (N % 2 != 0)
    {
        sum = sum - a[N / 2][N / 2];
    }
    printf("对角线元素求和为:%d",sum);
}

 

题目四:

题目:

//求 主对角线元素的最大值 主对角线元素的积 主对角线元素的平方和

代码:

//求 主对角线元素的最大值 主对角线元素的积 主对角线元素的平方和
#include <stdio.h>
#define N 3
int main()
{
    int a[N][N];
    int i, j, sum = 0, max, p = 1, sqSum = 0;
    printf("输入%d行%d列的数组:\n", N, N);
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    max = a[0][0];
    for (i = 0; i < N; i++)
    {
//主对角线元素的最大值
        if (a[i][i] > max)
        {
            max = a[i][i];
        }

//主对角线元素的积
        p = p * a[i][i];

//主对角线元素的平方和
        sqSum = sqSum + a[i][i] * a[i][i];
    }

    printf("主对角线元素的最大值: %d\n", max);
    printf("主对角线元素的积: %d\n", p);
    printf("主对角线元素的平方和: %d\n", sqSum);
}

 

题目五:

题目:

//找出5个数中的最小值

代码:

//找出5个数中的最小值
#include <stdio.h>

int min(int x, int y) {
    return (x < y ? x : y);   //condition ? expression1(true) : expression2(false);
}

int main() {
    int a[5], i, m;
    printf("输入五个数:");
    for (i = 0; i < 5; i++) {
        scanf("%d", &a[i]);
    }
    m = a[0];
    for (i = 1; i < 5; i++) {
        m = min(m, a[i]);
    }
    printf("最小值为:%d\n", m);
    return 0;
}

 

题目六:

题目:

//定义了一个二维数组score,用于存储10个学生4门课程的成绩,打印出每个学生的索引和他们的成绩总和

代码:

//定义了一个二维数组score,用于存储10个学生4门课程的成绩,打印出每个学生的索引和他们的成绩总和

#include <stdio.h>

int sum(int x, int y, int z) {
    return (x + y + z);
}

int main() {
    int score[5][4], i, j;


    // 输入每个学生的三门成绩
    printf("依次输入每个学生的三门课程成绩:\n");
    for(i = 0; i < 5; i++) {
        for(j = 1; j < 4; j++) {
            scanf("%d", &score[i][j]);
        }
        // 计算总分并存储在 score[i][0]
        score[i][0] = sum(score[i][1], score[i][2], score[i][3]);
    }

    // 输出每个学生的编号及其总分
    for(i = 0; i < 5; i++) {
        printf("Student %d: Total Score = %d\n", i + 1, score[i][0]);
    }

    return 0;
}

题目七:

题目:

//计算数组中每个元素的第 k 位数字之和

代码:

//计算数组中每个元素的第 k 位数字之和

#define N 10
#include<stdio.h>
int fun(int n, int k) {
    int i;
    for (i = 1; i <= k - 1; i++) {
        n = n / 10;
        n = n % 10;
    }
    return n;
}

int main() {
    int a[N], k, i, sum = 0;
    printf("输入十个数:\n");
    for (i = 0; i < N; i++) {
        scanf("%d", &a[i]);
    }
    printf("Input k:\n");
    scanf("%d", &k);
    for (i = 0; i < N; i++) {
        sum += fun(a[i], k);
    }
    printf("The k sum is %d\n", sum);
    return 0;
}

题目八:

题目:

//用冒泡排序算法对数组进行排序,并在排序前后打印数组

代码:

//用冒泡排序算法对数组进行排序,并在排序前后打印数组
#include<stdio.h>

void sort(int b[], int n) {
    int i, j, t;
    for (i = 1; i < n; i++) {
        for (j = 0; j < n - i; j++) {
            if (b[j] > b[j + 1]) {
                t = b[j];
                b[j] = b[j + 1];
                b[j + 1] = t;
            }
        }
    }
}

void printarr(int b[], int n) {
    int i;
    for (i = 0; i < n; i++)
        printf("%5d", b[i]);
    printf("\n");
}

int main() {
    int a[10] = {11, 12, 63, 97, 58, 80, 48, 32, 73, 36};
    printf("Before sort:\n");
    printarr(a, 10);
    sort(a, 10);
    printf("After sort:\n");
    printarr(a, 10);
    return 0;
}

代码优化:

#include <stdio.h>

void sort(int b[], int n) {
    int i, j, t;
    int swapped;
    for (i = 0; i < n - 1; i++) {  // 外层循环控制排序的轮数
        swapped = 0;  // 记录这一轮是否有交换
        for (j = 0; j < n - 1 - i; j++) {  // 内层循环进行相邻元素比较
            if (b[j] > b[j + 1]) {
                t = b[j];
                b[j] = b[j + 1];
                b[j + 1] = t;
                swapped = 1;  // 如果发生交换,则标记为 1
            }
        }
        if (!swapped) {  // 如果这一轮没有交换,数组已经有序,提前退出
            break;
        }
    }
}

void printarr(int b[], int n) {
    int i;
    for (i = 0; i < n; i++)
        printf("%5d", b[i]);  // 每个数字占5个字符宽度
    printf("\n");
}

int main() {
    int a[10] = {11, 12, 63, 97, 58, 80, 48, 32, 73, 36};
    printf("Before sort:\n");
    printarr(a, 10);
    sort(a, 10);
    printf("After sort:\n");
    printarr(a, 10);
    return 0;
}

 

;