zoukankan      html  css  js  c++  java
  • 未解决问题:指针作参数、二重指针、指针数组、动态内存分配

    题目:输入m个学生n门课的成绩,计算每个学生的平均成绩,输入学生编号后输出该学生各门课的成绩。

    先直接上源码:(有错误的源码)

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
     int **pointer_counterpart = NULL;
    
    int main()
    {
        void Input_number(int *m, int *n);              //输入m个学生n门课成绩
        void allocation(int m, int n);
        //void display(int **pointer, int m, int n);    
        void calculation(int **pointer, int m, int n);   //计算平均成绩
        void Search(int **pointer, int m, int n);        //查询学生成绩
        void Free(int **pointer, int m);
    
        int students_number, subjects_number;
    
        Input_number(&students_number, &subjects_number);
        allocation(students_number, subjects_number);
        //display(pointer_counterpart, students_number, subjects_number);
        calculation(pointer_counterpart, students_number, subjects_number);
        Search(pointer_counterpart, students_number, subjects_number);
        Free(pointer_counterpart, students_number);
        return 0;
    }
    void Input_number(int *m, int *n)
    {
        printf ("Please input the numbers of students and subjects:
    ");
        scanf ("%d%d", m, n);
    }
    void allocation(int m, int n)
    {
        int *pointer[m];
    
        for (int i = 0; i < m; ++i) {
            pointer[i] = (int*)malloc(n * sizeof(int));
        }
        for (int i = 0; i < m; ++i) {
             printf ("Please input %d students %d grades:
     ", i + 1, n);
              for (int j = 0; j < n; ++j) {
                scanf ("%d", *(pointer + i) + j);
            }
        }
        /**完整运行完成后再回来看这里
        for (int i = 0; i < m; ++i) {
             pointer[i] = (int*)malloc(n * sizeof(int));
             printf ("Please input %d students %d grades:
     ", i + 1, n);
              for (int j = 0; j < n; ++j) {
                scanf ("%d", *(pointer + i) + j);
            }
        }*/
    
        /*print to try
        for (int i = 0; i < m; ++i) {
            printf ("The %d student's grades are:
    ", i + 1);
            for (int j = 0; j < n; ++j) {
                printf ("%d ", *(*(pointer + i) + j));
            }
            printf ("
    ");
        }right****/
        pointer_counterpart = pointer;
    }
    /*
    void display(int **pointer, int m, int n)
    {
        printf ("Matrix:
    ");
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                printf ("%d ", *(*(pointer + i) + j));
            }
            printf ("
    ");
        }
    }*/
    void calculation(int **pointer, int m, int n)
    {
        int average;
        int sum;
        ///print to try
        printf ("%p  %p
    ", pointer_counterpart, *pointer_counterpart);
        printf ("%p  %p
    ", pointer, *pointer);
        ///end
        for (int i = 0; i < m; ++i) {
            sum = 0;
            average = 0;
            for (int j = 0; j < n; ++j) {
                sum += *(*(pointer + i) + j);   ///学生数 = 3, 科目数 = 3时此处算第三个平均数有错误
            }
            average = sum / n;
            printf ("%d students' average is %d.
    ", i + 1, average);
        }
    }
    void Search(int **pointer, int m, int n)
    {
        int num;
        bool condition = true;
        while (condition) {
            printf ("Please input the student's number to search his grades:
    ");
            scanf ("%d", &num);
            if (num < 1 || num > m) {
                char flag;
                printf ("ERROR, reinput 'y', exit 'n':");
                scanf ("%c", &flag);
                if (flag == 'n' || flag == 'N') {
                    condition = false;
                    break;
                }
                else  {
                    condition = true;
                    break;
                }
            }
            else {
                printf ("The %d students' grades are:
    ", num);
                for (int i = 0; i < n; ++i) {
                    //printf ("%p
    ", *pointer);
                    printf ("%d ", *(*(pointer + num - 1) + i));
                    ///printf ("%d ", *(*(pointer_counterpart + num - 1) + i));///此处输出仍然有错误
                }
                printf ("
    ");
                condition = false;
            }
        }
    
    }
    void Free(int **pointer, int m)
    {
        for (int i = 0; i < m; ++i) {
            free (*(pointer + i));
            *(pointer + i) = NULL;
        }
    }

    第一个未解决问题:在allocation函数中动态内存分配问题

    void allocation(int m, int n)
    {
        int *pointer[m];
    
        for (int i = 0; i < m; ++i) {
            pointer[i] = (int*)malloc(n * sizeof(int));
        }
        for (int i = 0; i < m; ++i) {
             printf ("Please input %d students %d grades:
     ", i + 1, n);
              for (int j = 0; j < n; ++j) {
                scanf ("%d", *(pointer + i) + j);
            }
        }
        /**上面使用一个for先把指针数组内存分配好后,然后两个for循环输入数据是成功的。但是当如下这种分配赋值方式就有错误,错误就是在函数calculation中,当
        学生数 = 3, 科目数 = 3时,算第三个平均数有错误,calculation完整源码有标示,中至今没找出哪里有错误来。。。
        for (int i = 0; i < m; ++i) {
             pointer[i] = (int*)malloc(n * sizeof(int));
             printf ("Please input %d students %d grades:
     ", i + 1, n);
              for (int j = 0; j < n; ++j) {
                scanf ("%d", *(pointer + i) + j);
            }
        }有错误的*/
    
        /*print to try
        for (int i = 0; i < m; ++i) {
            printf ("The %d student's grades are:
    ", i + 1);
            for (int j = 0; j < n; ++j) {
                printf ("%d ", *(*(pointer + i) + j));
            }
            printf ("
    ");
        }right 尝试上面输入是否正确,结果没问题****/
        pointer_counterpart = pointer;
    }

    第二个未解决问题:

    void Search(int **pointer, int m, int n)
    {
        int num;
        bool condition = true;
        while (condition) {
            printf ("Please input the student's number to search his grades:
    ");
            scanf ("%d", &num);
            if (num < 1 || num > m) {
                char flag;
                printf ("ERROR, reinput 'y', exit 'n':");
                scanf ("%c", &flag);
                if (flag == 'n' || flag == 'N') {
                    condition = false;
                    break;
                }
                else  {
                    condition = true;
                    break;
                }
            }
            else {
                printf ("The %d students' grades are:
    ", num);
                for (int i = 0; i < n; ++i) {
                    //printf ("%p
    ", *pointer);
                    printf ("%d ", *(*(pointer + num - 1) + i));
                    ///printf ("%d ", *(*(pointer_counterpart + num - 1) + i));///此处输出仍然有错误,当指针数组的地址传进来以后此处就是不对,脑袋要炸。。
                }
                printf ("
    ");
                condition = false;
            }
        }
    
    }
  • 相关阅读:
    Solaris 10学习笔记初学
    EBS R12中文升级补丁
    EXPDP,今天犯了个愚蠢的错误
    LOGSTDBY status: ORA01418,Logical standby問題可真多
    ORA04045,Standby停止Apple log处理一例
    无法relay信件处理一例
    cordova启动页面和图标的设置
    CSS布局探密02
    CSS布局探密01
    CSS布局探密03
  • 原文地址:https://www.cnblogs.com/gzl0928/p/7766140.html
Copyright © 2011-2022 走看看