高级程序设计第七次个人作业

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

@

1.定义一个二维数组和指向该数组的指针,分别以数组下标和指针的形式引用数组各个元素进行赋值与输出

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

int main() {
    // 定义二维数组
    int arr[3][4];
    // 定义指向二维数组的指针
    int (*ptr)[4] = arr;
    
    printf("=== 使用数组下标赋值和输出 ===\n");
    // 使用数组下标赋值
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4; j++) {
            arr[i][j] = i * 4 + j + 1;
        }
    }
    
    // 使用数组下标输出
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4; j++) {
            printf("%3d", arr[i][j]);
        }
        printf("\n");
    }
    
    printf("=== 使用指针赋值和输出 ===\n");
    // 使用指针赋值
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4; j++) {
            *(*(ptr + i) + j) = (i * 4 + j + 1) * 10;
        }
    }
    
    // 使用指针输出
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4; j++) {
            printf("%3d", *(*(ptr + i) + j));
        }
        printf("\n");
    }
    
    return 0;
}

结果:
image

2.构造螺旋方阵。对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里

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

int main() {
    int N;
    printf("请输入N: ");
    scanf("%d", &N);
    
    int spiral[10][10] = {0};
    int num = 1;
    int top = 0, bottom = N - 1, left = 0, right = N - 1;
    
    // 螺旋填充数字
    while(num <= N * N) {
        // 从左到右填充上边
        for(int i = left; i <= right && num <= N * N; i++) {
            spiral[top][i] = num++;
        }
        top++;
        
        // 从上到下填充右边
        for(int i = top; i <= bottom && num <= N * N; i++) {
            spiral[i][right] = num++;
        }
        right--;
        
        // 从右到左填充下边
        for(int i = right; i >= left && num <= N * N; i--) {
            spiral[bottom][i] = num++;
        }
        bottom--;
        
        // 从下到上填充左边
        for(int i = bottom; i >= top && num <= N * N; i--) {
            spiral[i][left] = num++;
        }
        left++;
    }
    
    // 输出螺旋方阵
    printf("螺旋方阵:\n");
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            printf("%3d", spiral[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

结果:
image

3.请编写一个函数实现计算成绩表score中每一个学生7门课程的总成绩,并将总成绩存放在该学生的第0列中。

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

// 计算总成绩的函数
void calculateTotalScore(int score[][8], int n) {
    for(int i = 0; i < n; i++) {
        score[i][0] = 0; // 初始化总成绩
        for(int j = 1; j < 8; j++) {
            score[i][0] += score[i][j]; // 累加各科成绩
        }
    }
}

int main() {
    // 初始化成绩表,第0列用于存放总成绩
    int score[3][8] = {
        {0, 85, 90, 78, 92, 88, 76, 95}, // 学生1
        {0, 72, 68, 85, 90, 79, 82, 88}, // 学生2
        {0, 95, 92, 87, 84, 90, 86, 91}  // 学生3
    };
    
    // 调用函数计算总成绩
    calculateTotalScore(score, 3);
    
    // 输出结果
    printf("学生成绩表:\n");
    for(int i = 0; i < 3; i++) {
        printf("学生%d: 总成绩=%d, 各科成绩: ", i+1, score[i][0]);
        for(int j = 1; j < 8; j++) {
            printf("%d ", score[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

结果:

image

4.将以下定义的含义写出来

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

int main() {
    printf("各种定义的含义:\n\n");
    
    printf("a) int a;        // 定义一个整型变量a\n");
    printf("b) int a[10];    // 定义一个包含10个整数的数组a\n");
    printf("c) int *a;       // 定义一个指向整型的指针变量a\n");
    printf("d) int **a;      // 定义一个指向整型指针的指针变量a(二级指针)\n");
    printf("e) int (*a)[10]; // 定义一个指向包含10个整数的数组的指针a\n\n");
    
    // 实际示例
    int a;                    // 整型变量
    int arr[10];              // 整型数组
    int *ptr;                 // 整型指针
    int **pptr;               // 指向整型指针的指针
    int (*arrayPtr)[10];      // 指向包含10个整数的数组的指针
    
    printf("实际使用示例:\n");
    a = 10;
    printf("int a = %d\n", a);
    
    ptr = &a;
    printf("int *ptr = &a, *ptr = %d\n", *ptr);
    
    pptr = &ptr;
    printf("int **pptr = &ptr, **pptr = %d\n", **pptr);
    
    arrayPtr = &arr;
    printf("int (*arrayPtr)[10] = &arr\n");
    
    return 0;
}

结果:

image

5.给定一个二维数组,使用指针把数组中的数字复制到另一个数组中相同的位置

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

int main() {
    // 定义原数组和目标数组
    int src[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int dest[2][3];
    
    // 使用指针复制数组
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 3; j++) {
            // 使用指针形式复制元素
            *(*(dest + i) + j) = *(*(src + i) + j);
        }
    }
    
    // 输出原数组
    printf("原数组:\n");
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 3; j++) {
            printf("%d ", src[i][j]);
        }
        printf("\n");
    }
    
    // 输出复制后的数组
    printf("复制后的数组:\n");
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 3; j++) {
            printf("%d ", dest[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

结果:

image

6.请编写一个函数,接受一个字符串指针作为参数,并返回该字符串的长度,不包括字符串结尾的空字符

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

// 计算字符串长度的函数
int stringLength(const char *str) {
    int length = 0;
    // 遍历字符串直到遇到空字符
    while(*str != '\0') {
        length++;
        str++;  // 移动指针到下一个字符
    }
    return length;
}

int main() {
    char testStr1[] = "Hello, World!";
    char testStr2[] = "C Programming";
    char testStr3[] = "";
    
    printf("字符串长度计算:\n");
    printf("'%s' 的长度: %d\n", testStr1, stringLength(testStr1));
    printf("'%s' 的长度: %d\n", testStr2, stringLength(testStr2));
    printf("空字符串的长度: %d\n", stringLength(testStr3));
    
    return 0;
}

结果:

image

7.输出以下内容,并解释每一个输出内容的含义

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

int main() {
    int a[3][4] = {0};
    
    printf("分析结果:\n\n");
    
    // 1. sizeof(a) - 整个数组的大小
    printf("sizeof(a) = %zu\n", sizeof(a));
    printf("含义: 整个二维数组a的大小 = 3行 × 4列 × sizeof(int) = 3×4×4 = 48字节\n\n");
    
    // 2. sizeof(a[0][0]) - 单个元素的大小
    printf("sizeof(a[0][0]) = %zu\n", sizeof(a[0][0]));
    printf("含义: 数组单个元素的大小 = sizeof(int) = 4字节\n\n");
    
    // 3. sizeof(a[0]) - 第一行的大小
    printf("sizeof(a[0]) = %zu\n", sizeof(a[0]));
    printf("含义: 第一行数组的大小 = 4列 × sizeof(int) = 4×4 = 16字节\n\n");
    
    // 4. sizeof(a[0]+1) - 指针运算
    printf("sizeof(a[0]+1) = %zu\n", sizeof(a[0]+1));
    printf("含义: a[0]在表达式中退化为指针,a[0]+1是指向第二列的指针,大小为指针大小(8字节)\n\n");
    
    // 5. sizeof(*a[0]+1) - 解引用后的值加1
    printf("sizeof(*a[0]+1) = %zu\n", sizeof(*a[0]+1));
    printf("含义: *a[0]得到a[0][0]的值,加1后还是int类型,大小为4字节\n\n");
    
    // 6. sizeof(a+1) - 数组指针运算
    printf("sizeof(a+1) = %zu\n", sizeof(a+1));
    printf("含义: a在表达式中退化为指针,a+1是指向第二行的指针,大小为指针大小(8字节)\n\n");
    
    // 7. sizeof(*a+1) - 解引用后加1
    printf("sizeof(*a+1) = %zu\n", sizeof(*a+1));
    printf("含义: *a得到第一行数组的首地址,*a+1是指向第一行第二列的指针,大小为指针大小(8字节)\n\n");
    
    // 8. sizeof(&a[0]+1) - 取地址后加1
    printf("sizeof(&a[0]+1) = %zu\n", sizeof(&a[0]+1));
    printf("含义: &a[0]是指向第一行的指针,&a[0]+1是指向第二行的指针,大小为指针大小(8字节)\n\n");
    
    // 9. sizeof(*(&a[0]+1)) - 解引用指向第二行的指针
    printf("sizeof(*(&a[0]+1)) = %zu\n", sizeof(*(&a[0]+1)));
    printf("含义: *(&a[0]+1)得到第二行数组,大小为4×4=16字节\n\n");
    
    // 10. sizeof(*a) - 解引用数组名
    printf("sizeof(*a) = %zu\n", sizeof(*a));
    printf("含义: *a得到第一行数组,大小为4×4=16字节\n\n");
    
    // 11. sizeof(a[3]) - 超出边界的行
    printf("sizeof(a[3]) = %zu\n", sizeof(a[3]));
    printf("含义: a[3]虽然超出数组边界,但sizeof在编译时确定类型,仍按int[4]计算,大小为16字节\n");
    
    return 0;
}

结果:

image

8.键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出

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

int main() {
    char str[31];        // 原始字符串,最大长度30+1
    char newStr[31];     // 新字符串
    int m, len;
    
    // 输入字符串
    printf("请输入一个字符串(长度1-30): ");
    fgets(str, sizeof(str), stdin);
    
    // 去除换行符
    len = strlen(str);
    if(len > 0 && str[len-1] == '\n') {
        str[len-1] = '\0';
        len--;
    }
    
    // 输入m
    printf("请输入正整数m(1-%d): ", len);
    scanf("%d", &m);
    
    // 验证m的范围
    if(m < 1 || m > len) {
        printf("错误: m必须在1到%d之间\n", len);
        return 1;
    }
    
    // 使用指针处理字符串复制
    char *srcPtr = str + (m - 1);  // 指向第m个字符
    char *destPtr = newStr;        // 指向新字符串开头
    
    // 复制剩余字符
    while(*srcPtr != '\0') {
        *destPtr = *srcPtr;
        srcPtr++;
        destPtr++;
    }
    *destPtr = '\0';  // 添加字符串结束符
    
    // 输出结果
    printf("原始字符串: %s\n", str);
    printf("从第%d个字符开始复制\n", m);
    printf("新字符串: %s\n", newStr);
    
    return 0;
}

结果:

image

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