高级程序语言设计第六次作业

这个作业属于哪个课程 <班级的链接>
这个作业要求在哪里 <作业链接>
学号 092300303
姓名 池博洋

@

目录

1.设计一个按值传递和按地址传递呈现不同效果的程序

点击查看代码
#include <stdio.h>

void swap_by_value(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

void swap_by_address(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    
    printf("Before swap_by_value: x = %d, y = %d\n", x, y);
    swap_by_value(x, y);
    printf("After swap_by_value: x = %d, y = %d\n", x, y);
    
    printf("Before swap_by_address: x = %d, y = %d\n", x, y);
    swap_by_address(&x, &y);
    printf("After swap_by_address: x = %d, y = %d\n", x, y);
    
    return 0;
}

结果:

image

2.编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回

点击查看代码
#include <stdio.h>

int isPrime(int n) {
    if (n <= 1) return 0;      // 1 和 0 都不是素数
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

void fun(int m, int *k, int xx[]) {
    *k = 0;   // 统计个数
    for (int i = 1; i < m; i++) {
        if (!isPrime(i)) {    // 非素数
            xx[*k] = i;
            (*k)++;
        }
    }
}

int main() {
    int m, k;
    int xx[100];   // 存放非素数的数组

    printf("请输入一个整数 m: ");
    scanf("%d", &m);   // 只需要输入 m

    fun(m, &k, xx);

    printf("小于 %d 的非素数共有 %d 个:\n", m, k);
    for (int i = 0; i < k; i++) {
        printf("%d ", xx[i]);
    }

    return 0;
}

结果:
image

3.编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串

点击查看代码
#include <stdio.h>
#include <string.h>

void copyFromM(char s[], int m, char t[]) {
    int i = m - 1;   // 将用户输入的“第 m 个字符”转换为数组下标
    int j = 0;

    while (s[i] != '\0') {
        t[j] = s[i];
        i++;
        j++;
    }
    t[j] = '\0';  // 别忘记结束符
}

int main() {
    char s[100], t[100];
    int m;

    printf("请输入一个字符串: ");
    gets(s);   // 为简单起见,用 gets(课堂常用)

    printf("请输入要从第 m 个字符开始复制: ");
    scanf("%d", &m);

    copyFromM(s, m, t);

    printf("新字符串为: %s\n", t);

    return 0;
}

结果:
image

4.编写函数用冒泡法将数组按从小到大的顺序排列

点击查看代码
#include <stdio.h>

void bubbleSort(int a[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {   // 交换
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}

int main() {
    int n, i;
    int a[100];

    printf("请输入数组长度 n: ");
    scanf("%d", &n);

    printf("请输入 %d 个整数:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    bubbleSort(a, n);

    printf("从小到大排序后的数组为:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    return 0;
}

结果:
image

5.将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现

点击查看代码
#include <stdio.h>

void reverse(int *a, int n) {
    int i, temp;
    int *p1 = a;            // 指向开头
    int *p2 = a + n - 1;    // 指向结尾

    while (p1 < p2) {
        temp = *p1;
        *p1 = *p2;
        *p2 = temp;

        p1++;
        p2--;
    }
}

int main() {
    int n, i;
    int a[100];

    printf("请输入整数个数 n: ");
    scanf("%d", &n);

    printf("请输入 %d 个整数:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    reverse(a, n);

    printf("逆序后的数组为:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    return 0;
}

结果:
image

6.写一个函数打印arr数组的内容,不使用数组下标,使用指针

点击查看代码
#include <stdio.h>

void printArr(int *p, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", *(p + i));  // 只用指针,不用下标
    }
}

int main() {
    int arr[100], n;

    printf("请输入数组长度 n: ");
    scanf("%d", &n);

    printf("请输入 %d 个整数:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    printf("数组内容为:\n");
    printArr(arr, n);

    return 0;
}

结果:
image

7.编写程序,分别找出多个n×m数组的最大值、最小值,并输出两个值的下标

点击查看代码
#include <stdio.h>

int main() {
    int t;          // 数组个数
    int n, m;       // 行列
    int a[100][100];

    printf("请输入要处理的数组个数 t: ");
    scanf("%d", &t);

    while (t--) {
        printf("\n请输入数组的行数 n 和列数 m: ");
        scanf("%d %d", &n, &m);

        printf("请输入这个 %d×%d 数组的元素:\n", n, m);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                scanf("%d", &a[i][j]);
            }
        }

        int max = a[0][0], min = a[0][0];
        int max_r = 0, max_c = 0;
        int min_r = 0, min_c = 0;

        // 找最大值和最小值
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (a[i][j] > max) {
                    max = a[i][j];
                    max_r = i;
                    max_c = j;
                }
                if (a[i][j] < min) {
                    min = a[i][j];
                    min_r = i;
                    min_c = j;
                }
            }
        }

        printf("最大值:%d   位置:(%d, %d)\n", max, max_r, max_c);
        printf("最小值:%d   位置:(%d, %d)\n", min, min_r, min_c);
    }

    return 0;
}

结果:
image

8.判断上三角矩阵。上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵

点击查看代码
#include <stdio.h>

int main() {
    int n;
    int a[100][100];
    int flag = 1;   // 假设是上三角矩阵

    printf("请输入方阵的阶 n: ");
    scanf("%d", &n);

    printf("请输入这个 %d×%d 方阵的元素:\n", n, n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    // 判断主对角线以下是否全为 0
    for (int i = 1; i < n; i++) {      // 从第 2 行开始
        for (int j = 0; j < i; j++) {  // j < i 部分是对角线以下
            if (a[i][j] != 0) {
                flag = 0;
                break;
            }
        }
        if (!flag) break;
    }

    if (flag)
        printf("这是上三角矩阵。\n");
    else
        printf("这不是上三角矩阵。\n");

    return 0;
}

结果:
image

9.给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询

点击查看代码
#include <stdio.h>

int searchMatrix(int a[][100], int m, int n, int target) {
    int r = 0;        // 从右上角开始
    int c = n - 1;

    while (r < m && c >= 0) {
        if (a[r][c] == target)
            return 1;
        else if (a[r][c] > target)
            c--;     // 太大 → 左移
        else
            r++;     // 太小 → 下移
    }
    return 0;         // 没找到
}

int main() {
    int m, n, target;
    int a[100][100];

    printf("请输入矩阵的行数 m 和列数 n: ");
    scanf("%d %d", &m, &n);

    printf("请输入按升序排列的 %d×%d 矩阵:\n", m, n);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    printf("请输入要查找的目标值: ");
    scanf("%d", &target);

    if (searchMatrix(a, m, n, target))
        printf("找到了!目标值 %d 存在于矩阵中。\n", target);
    else
        printf("未找到,目标值 %d 不在矩阵中。\n", target);

    return 0;
}

结果:

image

10.编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)。n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1

点击查看代码
#include <stdio.h>

// 判断是否为质数
int isPrime(int x) {
    if (x <= 1) return 0;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return 0;
    }
    return 1;
}

// 分解为两个质数之和
int split(int n, int *a, int *b) {
    for (int i = 2; i < n; i++) {
        if (isPrime(i) && isPrime(n - i)) {
            *a = i;
            *b = n - i;
            return 1;   // 成功分解
        }
    }
    return 0;   // 无法分解
}

int main() {
    int n, a, b;

    printf("请输入一个整数 n: ");
    scanf("%d", &n);

    if (split(n, &a, &b))
        printf("%d = %d + %d\n", n, a, b);
    else
        printf("无法将 %d 分解为两个质数之和。\n", n);

    return 0;
}

结果:
image

11.编写函数void shift(char* s, int n),请原地将字符串s循环左移n次。例如,字符串“hello”左移3次得到“lohel”

点击查看代码
#include <stdio.h>
#include <string.h>

// 交换两个字符
void swap(char *a, char *b) {
    char t = *a;
    *a = *b;
    *b = t;
}

// 翻转字符串的某一段
void reverse(char *s, int left, int right) {
    while (left < right) {
        swap(&s[left], &s[right]);
        left++;
        right--;
    }
}

// 原地循环左移 n 位
void shift(char *s, int n) {
    int len = strlen(s);
    if (len == 0) return;

    n = n % len;       // 处理 n 大于字符串长度的情况
    if (n == 0) return;

    // 使用“三次翻转法”进行左移
    reverse(s, 0, n - 1);       // 翻转前 n 个字符
    reverse(s, n, len - 1);     // 翻转后面的字符
    reverse(s, 0, len - 1);     // 整体再翻转一次
}

int main() {
    char s[100];
    int n;

    printf("请输入字符串:");
    gets(s);

    printf("请输入左移次数 n: ");
    scanf("%d", &n);

    shift(s, n);

    printf("左移后的字符串为:%s\n", s);

    return 0;
}

结果:

image

12.写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和

点击查看代码
#include <stdio.h>

int main() {
    int n;
    int a[50][50];

    printf("请输入方阵的阶 n: ");
    scanf("%d", &n);

    printf("请输入这个 %d×%d 的矩阵元素:\n", n, n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    int magic = 1;   // 假设是魔方阵
    int targetSum = 0;

    // 计算第一行的和,作为比较的标准
    for (int j = 0; j < n; j++)
        targetSum += a[0][j];

    // 1. 检查每一行的和
    for (int i = 1; i < n; i++) {
        int rowSum = 0;
        for (int j = 0; j < n; j++)
            rowSum += a[i][j];
        if (rowSum != targetSum) {
            magic = 0;
            break;
        }
    }

    // 2. 检查每一列的和
    if (magic) {
        for (int j = 0; j < n; j++) {
            int colSum = 0;
            for (int i = 0; i < n; i++)
                colSum += a[i][j];
            if (colSum != targetSum) {
                magic = 0;
                break;
            }
        }
    }

    // 3. 主对角线
    if (magic) {
        int diag1 = 0;
        for (int i = 0; i < n; i++)
            diag1 += a[i][i];
        if (diag1 != targetSum)
            magic = 0;
    }

    // 4. 副对角线
    if (magic) {
        int diag2 = 0;
        for (int i = 0; i < n; i++)
            diag2 += a[i][n - 1 - i];
        if (diag2 != targetSum)
            magic = 0;
    }

    // 输出判断结果
    if (magic)
        printf("这是一个魔方矩阵。\n");
    else
        printf("这不是魔方矩阵。\n");

    return 0;
}

结果:
image

13.利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)

点击查看代码
#include <stdio.h>
#include <ctype.h>

// 1 表示相等,0 表示不同
int equalIgnoreCase(char *s1, char *s2) {
    while (*s1 && *s2) {
        if (tolower(*s1) != tolower(*s2))
            return 0;
        s1++;
        s2++;
    }
    return *s1 == '\0' && *s2 == '\0';
}

int main() {
    char s1[100], s2[100];

    printf("请输入第一个字符串:");
    gets(s1);

    printf("请输入第二个字符串:");
    gets(s2);

    if (equalIgnoreCase(s1, s2))
        printf("两个字符串相等(忽略大小写)。\n");
    else
        printf("两个字符串不相等。\n");

    return 0;
}

结果:
image

14.定义一个一维数组和二维数组,按顺序打印出数组中每个元素的地址

点击查看代码
#include <stdio.h>

int main() {
    int a[5] = {1, 2, 3, 4, 5};            // 一维数组
    int b[3][4] = {                       // 二维数组
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    printf("一维数组 a 的元素地址:\n");
    for (int i = 0; i < 5; i++) {
        printf("a[%d] 的地址:%p\n", i, (void*)&a[i]);
    }

    printf("\n二维数组 b 的元素地址:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("b[%d][%d] 的地址:%p\n", i, j, (void*)&b[i][j]);
        }
    }

    return 0;
}

结果:
image

15.设计一个分别使用数组名和指针引用数组元素的程序

点击查看代码
#include <stdio.h>

int main() {
    int a[5] = {10, 20, 30, 40, 50};
    int *p = a;   // 指针指向数组首元素

    printf("使用数组名访问数组元素:\n");
    for (int i = 0; i < 5; i++) {
        printf("a[%d] = %d\n", i, a[i]);
    }

    printf("\n使用指针访问数组元素:\n");
    for (int i = 0; i < 5; i++) {
        printf("*(p + %d) = %d\n", i, *(p + i));
    }

    return 0;
}

结果:
image

posted @ 2025-11-23 14:41  aaa(zzz)  阅读(0)  评论(0)    收藏  举报