头歌实践教学平台—C语言程序设计(数组)

C语言程序设计

第四章节4-15~4-23

4-15编程实现交换数组a和数组b中的对应元素

#include <stdio.h>
void swap_elements(int *a, int size_a, int *b, int size_b) {
    int i;
    for (i = 0; i < size_b && i < size_a; i++) {
        int temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}
int main() {
    int size_a, size_b, i;
    // 读取数组a的大小和元素
    printf("Enter the size of array a: ");
    scanf("%d", &size_a);
    int a[size_a];
    printf("Enter the elements of array a: ");
    for (i = 0; i < size_a; i++) {
        scanf("%d", &a[i]);
    }
    // 读取数组b的大小和元素
    printf("Enter the size of array b: ");
    scanf("%d", &size_b);
    int b[size_b];
    printf("Enter the elements of array b: ");
    for (i = 0; i < size_b; i++) {
        scanf("%d", &b[i]);
    }
    // 交换对应元素
    swap_elements(a, size_a, b, size_b);
    // 打印交换后的数组a和数组b
    printf("\nArray a after swapping:\n");
    for (i = 0; i < size_a; i++) {
        printf("%d ", a[i]);
    }
    printf("\nArray b after swapping:\n");
    for (i = 0; i < size_b; i++) {
        printf("%d ", b[i]);
    }
    return 0;
}

4-16冒泡排序(一)

第1关:比较相邻两个元素求最大值

#include <stdio.h>
void bubbleOnePass(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            // 交换 arr[i] 和 arr[i + 1]
            int temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
        }
    }
}
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}
int main() {
    int n;
    scanf("%d", &n);
    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    bubbleOnePass(arr, n);
    printArray(arr, n);
    return 0;
}

4-16冒泡排序(二)

第2关:冒泡排序

#include <stdio.h>
void bubbleSort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换相邻的两个元素
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        for (int k = 0; k < n; k++) {
            printf("%d ", arr[k]);
        }
        printf("\n");
    }
}
int main() {
    int n, i;
    scanf("%d", &n);
    int arr[n];
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    bubbleSort(arr, n);
    return 0;
}

4-17选择排序(一)

#include<stdio.h>
#define N 100
int main()
{
    int i,j,k,n;
    int a[N];
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
    }
    i = 0;
    k = i;//指向最小数
    for(j=i+1; j<n; j++)
    {
        if(a[j]<a[k])
        {
            k = j;
        }
        //交换a[k]和a[k]
    }
    if(k!=i)
    {
        int temp = a[k];
        a[k] = a[i];
        a[i] = temp;
    }
    for(i=0; i<n; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

 

4-17选择排序(二)

#include <stdio.h>
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}
void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        // 在第i趟排序中交换找到的最小值和第i个元素
        swap(&arr[i], &arr[minIndex]);
        // 打印当前数组状态
        printArray(arr, n);
    }
}
int main() {
    int n;
    scanf("%d", &n);
    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }    printArray(arr, n-n);
    selectionSort(arr, n);
    return 0;
}

 

4-18插入排序(一)

#include<stdio.h>
int main(){
    int n,i,j;
    scanf("%d",&n);
    int a[n+1];
    for(i=0;i<=n;i++)
    scanf("%d",&a[i]);
    for(i=0;i<n;i++) if(a[i]>a[n])
    {a[i]=a[i]+a[n];a[n]=a[i]-a[n];a[i]=a[i]-a[n];}//交换
    for(i=0;i<=n;i++)
    printf("%d ",a[i]);
    return 0;
}

 

4-18插入排序(二)

#include <stdio.h>
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}
void insertionSort(int arr[], int n) {
    int i, key, j;
    for (i = 2; i < n; i++) {
        key = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
        printArray(arr, n);
    }
}
int main() {
    int n;
    scanf("%d", &n);
    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    printArray(arr, n);
    insertionSort(arr, n);
    printArray(arr, 0);
    return 0;
}

 

4-19有一个3行4列的矩阵,编程求出其中最大的那个元素的值,以及它所在的行号与列号

#include <stdio.h>
int main() {
    int matrix[3][4];
    int i, j;
    int max = matrix[0][0];
    int maxRow = 0;
    int maxCol = 0;
    // 假设输入是手动输入的,实际应用中可能是从文件或用户输入中读取
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            scanf("%d", &matrix[i][j]);
 
            // 如果当前元素大于已知的最大值,则更新最大值及其位置
            if (matrix[i][j] > max) {
                max = matrix[i][j];
                maxRow = i;
                maxCol = j;
            }
        }
    }
    // 打印矩阵内容
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }
    // 输出最大值及其位置
    printf("max:%d\n", max);
    printf("row:%d\n", maxRow + 1); // 行号从1开始计数,而非0
    printf("colum:%d\n", maxCol + 1); // 列号从1开始计数,而非0
    return 0;
}

 

4-20输入5个学生的成绩,计算并输出每一门课程的平均成绩和每一位学生的平均成绩

#include <stdio.h>
#define STUDENTS 5
#define SUBJECTS 3
int main() {
    int scores[STUDENTS][SUBJECTS];
    double subjectAverages[SUBJECTS] = {0};
    double studentAverages[STUDENTS] = {0};
    // 读取学生的成绩
    for (int i = 0; i < STUDENTS; i++) {
        for (int j = 0; j < SUBJECTS; j++) {
            scanf("%d", &scores[i][j]);
            subjectAverages[j] += scores[i][j];
            studentAverages[i] += scores[i][j];
        }
    }
    // 计算每门课程的平均分
    for (int j = 0; j < SUBJECTS; j++) {
        subjectAverages[j] /= STUDENTS;
    }
    // 计算每个学生的平均分
    for (int i = 0; i < STUDENTS; i++) {
        studentAverages[i] /= SUBJECTS;
    }
    // 输出每个学生的平均分
    printf("每个学生的平均分:\n");
    for (int i = 0; i < STUDENTS; i++) {
        for (int j = 0; j < SUBJECTS; j++) {
            printf("%d\t", scores[i][j]);
        }
        printf("%.1f\n", studentAverages[i]);
    }
    // 输出每门课程的平均分
    printf("每门课的平均分:\n");
    for (int j = 0; j < SUBJECTS; j++) {
        printf("%.1f\t", subjectAverages[j]);
    }
    printf("\n");
    return 0;
}

 

4-21输入M行N列的矩阵A和B,编程计算并输出矩阵A与B之和

#include <stdio.h>
#define MAX_SIZE 100 // 假设矩阵的最大尺寸为100x100
int main() {
    int m, n;
    int A[MAX_SIZE][MAX_SIZE], B[MAX_SIZE][MAX_SIZE];
    // 输入矩阵的行数和列数
    scanf("%d %d", &m, &n);
    // 输入矩阵A
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            scanf("%d", &A[i][j]);
        }
    }
    // 输入矩阵B
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            scanf("%d", &B[i][j]);
        }
    }
    // 输出矩阵A+B
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            printf("%d ", A[i][j] + B[i][j]);
        }
        printf("\n"); // 换行
    }
 
    return 0;
}

 

4-22编程计算m×s阶矩阵A和s×n阶矩阵B之积

#include <stdio.h>
#include <stdlib.h>
int main() {
    int m, s, n;
    scanf("%d %d %d", &m, &s, &n);
    // 分配矩阵内存
    int **A = (int **)malloc(m * sizeof(int *));
    int **B = (int **)malloc(s * sizeof(int *));
    int **C = (int **)malloc(m * sizeof(int *));
 
    for (int i = 0; i < m; i++) {
        A[i] = (int *)malloc(s * sizeof(int));
    }
    for (int i = 0; i < s; i++) {
        B[i] = (int *)malloc(n * sizeof(int));
    }
    for (int i = 0; i < m; i++) {
        C[i] = (int *)malloc(n * sizeof(int));
    }
    // 读取矩阵A和B的元素
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < s; j++) {
            scanf("%d", &A[i][j]);
        }
    }
    for (int i = 0; i < s; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &B[i][j]);
        }
    }
    // 计算矩阵A和B的乘积C
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            C[i][j] = 0;
            for (int k = 0; k < s; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
    // 输出矩阵C
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d\t", C[i][j]);
        }
        printf("\n");
    }
    // 释放内存
    for (int i = 0; i < m; i++) {
        free(A[i]);
        free(C[i]);
    }
    for (int i = 0; i < s; i++) {
        free(B[i]);
    }
    free(A);
    free(B);
    free(C);
    return 0;
}

 

4-23打印杨辉三角形

#include <stdio.h>
int main() {
    int n;
    scanf("%d", &n);
    int triangle[n][n];
    // 初始化第一列和对角线元素为1
    for (int i = 0; i < n; i++) {
        triangle[i][0] = 1;
        triangle[i][i] = 1;
    }
    // 根据杨辉三角形的性质,计算其他元素
    for (int i = 2; i < n; i++) {
        for (int j = 1; j < i; j++) {
            triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
        }
    }
    // 打印杨辉三角形
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            printf("%d\t", triangle[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

posted @ 2024-05-21 16:59  CYHMS  阅读(396)  评论(0)    收藏  举报