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

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


一、完成1-8题

1.1

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

#include <stdio.h>

int main() {
    int arr[5][6];
    int (*ptr)[6] = arr;

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 6; j++) {
            arr[i][j] = i * 6 + j + 1;
        }
    }

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 6; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 6; j++) {
            printf("%d ", *(ptr[i] + j));
        }
        printf("\n");
    }
    printf("\n");

    return 0;
}


思路:
根据题意理解即可。
问题:无
解决:无

1.2

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

#include <stdio.h>

int main() {
    int N;
    printf("请输入矩阵的维数:\n");
    scanf("%d", &N);
    
    int matrix[N][N];
    
    int left = 0, right = N - 1, top = 0, bottom = N - 1;
    int num = 1;

    while (left <= right && top <= bottom) {
        for (int i = left; i <= right; i++) {
            matrix[top][i] = num++;
        }
        top++;
        
        for (int i = top; i <= bottom; i++) {
            matrix[i][right] = num++;
        }
        right--;
        
        if (left <= right && top <= bottom) {
            for (int i = right; i >= left; i--) {
                matrix[bottom][i] = num++;
            }
            bottom--;
            
            for (int i = bottom; i >= top; i--) {
                matrix[i][left] = num++;
            }
            left++;
        }
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}


思路:按题意理解即可
问题:无
解决:无

1.3

题目:7门课程的成绩分别存放在score[n][1]、score[n][2]、...、score[n][7]中,第0列用来存放总成绩。请编写一个函数实现计算成绩表score中每一个学生7门课程的总成绩,并将总成绩存放在该学生的第0列中。请在main函数中构造数据测试你写的函数。

#include <stdio.h>

void CalculateTotalScore(int score[][8], int n) {
    for (int i = 0; i < n; i++) {
        int total = 0;
        for (int j = 1; j <= 7; j++) {
            total += score[i][j];
        }
        score[i][0] = total;
    }
}

int main() {
	// 测试数据
    int score[6][8] = {
        {0, 77, 90, 78, 92, 88, 76, 85},
        {0, 72, 84, 70, 85, 90, 68, 78},
        {0, 61, 88, 92, 85, 47, 80, 82}, 
        {0, 65, 70, 72, 61, 60, 75, 70}, 
        {0, 88, 85, 62, 95, 87, 92, 79},
		{0, 18, 84, 42, 94, 84, 94, 59}  
    };

    int n = 6;  

    CalculateTotalScore(score, n);
    printf("Student\tSum\tCourse1\tCourse2\tCourse3\tCourse4\tCourse5\tCourse6\tCourse7\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%d\t", i + 1, score[i][0]);
        for (int j = 1; j <= 7; j++) {
            printf("%d\t", score[i][j]);
        }
        printf("\n");
    }

    return 0;
}


思路:按题意理解即可
问题:无
解决:无

1.4

题目:将以下定义的含义写出来。

a)int a;  b)int *a;  c)int **a;  d)int a[10];  e)int (*a)[10];

解答:

int a;:定义一个整型变量
int *a;:定义一个整型指针
int **a;:定义一个指向整型指针的指针
int a[10];:定义一个包含10个整数元素的数组
int (*a)[10];:定义一个指向含有10个整数元素的数组的指针

思路:按题意理解即可
问题:无
解决:无

1.5

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

#include <stdio.h>

int main() {
    int a[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int myCopy[3][3];
    
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            *((int *)myCopy + i * 3 + j) = *((int *)a + i * 3 + j);
        }
    }
	printf("原始的数组:\n");
    for (int i = 0; i < 3; i++) {
	        for (int j = 0; j < 3; j++) {
	            printf("%d ", a[i][j]);
	        }
	        printf("\n");
	    }
    printf("\n复制的数组:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", myCopy[i][j]);
        }
        printf("\n");
    }

    return 0;
}

思路:按题意理解即可
问题:无
解决:无

1.6

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

#include <stdio.h>

int stringLength(char *str) {
    int length = 0;
    while (*str != '\0') {
        length++;
        str++;
    }
    return length;
}

int main() {
    char str[] = "I am Chen Yanzhe, I love China.";
    printf("%s\n",str);
    printf("字符串长度: %d\n", stringLength(str));
    return 0;
}


思路:按题意理解即可
问题:无
解决:无

1.7

题目:输出以下内容,并解释每一个输出内容的含义。

  int a[3][4] = {0};

  printf("%d\n",sizeof(a));

  printf("%d\n",sizeof(a[0][0]));

  printf("%d\n",sizeof(a[0]));

  printf("%d\n",sizeof(a[0]+1));

  printf("%d\n",sizeof(*(a[0]+1)));

  printf("%d\n",sizeof(a+1));

  printf("%d\n",sizeof(*(a+1)));

  printf("%d\n",sizeof(&a[0]+1));

  printf("%d\n",sizeof(*(&a[0]+1)));

  printf("%d\n",sizeof(*a));

  printf("%d\n",sizeof(a[3]));)

解答如下:

#include <stdio.h>

int main() {
    int a[3][4] = {0};

    printf("%d\n", sizeof(a));                
    printf("%d\n", sizeof(a[0][0]));          
    printf("%d\n", sizeof(a[0]));             
    printf("%d\n", sizeof(a[0] + 1));         
    printf("%d\n", sizeof(*(a[0] + 1)));      
    printf("%d\n", sizeof(a + 1));            
    printf("%d\n", sizeof(*(a + 1)));         
    printf("%d\n", sizeof(&a[0] + 1));        
    printf("%d\n", sizeof(*(&a[0] + 1)));     
    printf("%d\n", sizeof(*a));               
    printf("%d\n", sizeof(a[3]));             

    return 0;
}

解答:

printf("%d\n",sizeof(a)):a是一个3x4的二维数组,每个元素的大小是int 类型,所以sizeof(a)计算的是整个数组的大小。即3*4*sizeof(int),结果是 48。

printf("%d\n",sizeof(a[0][0])):sizeof(a[0][0])计算的是一个int类型的大小,所以为4。

printf("%d\n",sizeof(a[0])):计算的是第一行数组的大小,所以是4*sizeof(int)=16。

printf("%d\n",sizeof(a[0]+1)):a[0]是一个指向包含4个int元素的数组的指针。a[0]+1是指向第二个int元素的指针。sizeof(a[0]+1)计算的是指针类型的大小,即指针的大小,为8(我的电脑是64位的)。

printf("%d\n",sizeof(*(a[0]+1))):*(a[0]+1)访问第二个int元素,计算的是int类型的大小,即4。

printf("%d\n",sizeof(a+1)):a是一个指向二维数组的指针,a+1是指向数组第二行的指针。sizeof(a+1)计算的是指针类型的大小,是8。

printf("%d\n",sizeof(*(a+1))):a+1是指向数组第二行的指针,*(a + 1)返回第二行数组,sizeof(*(a+1))计算的是第二行数组的大小,为4*4=16。

printf("%d\n",sizeof(&a[0]+1)):&a[0]是指向数组第一行的指针,&a[0]+1是指向数组第二行的指针。sizeof(&a[0]+1)计算的是指针类型的大小,为4

printf("%d\n",sizeof(*(&a[0]+1))):&a[0]+1是指向数组第二行的指针,*(&a[0]+1)返回第二行数组,sizeof(*(&a[0]+1))计算的是第二行数组的大小,即4*sizeof(int)=16。

printf("%d\n",sizeof(*a)):a是二维数组的名字,即指向第一行数组的指针。*a返回第一行数组,sizeof(*a) 计算的是第一行数组的大小,即4*sizeof(int)=16。

printf("%d\n",sizeof(a[3])):a[3]是数组的第四行,它是一个包含4个int元素的数组。sizeof(a[3])计算的是该行数组的大小,即4*sizeof(int)=16。

思路:按题意理解即可
问题:无
解决:无

1.8

题目:
键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。

#include <stdio.h>

int main() {
    char str[30], newStr[30];
    int m;
    
    //用fgets防止空格造成的问题
    fgets(str, 30, stdin);
    scanf("%d", &m);
    
    char *ptr = str + m - 1;
    char *newPtr = newStr;
    
    while (*ptr) {
        *newPtr = *ptr;
        ptr++;
        newPtr++;
    }
    *newPtr = '\0';
    
    printf("%s\n", newStr);
    
    return 0;
}




思路:按题意理解即可
问题:一开始没有很好地解决空格的读取问题
解决:使用了fgets函数,问题就迎刃而解了


三、总结思考:

  1. 复习了C语言读取字符串的各种方法,请点击这里跳转
  2. 复习了二维数组的使用
  3. 通过第七题复习了很多指针相关的内容,让我的基础更为扎实了,受益良多
posted @ 2024-11-17 13:34  空余晚秋  阅读(7)  评论(0编辑  收藏  举报