c - 在学生数组中查找字段的最大数量

标签 c

我想找到学生中的最大人数,已经使用十名学生的指针和结构给出的数据。

我的程序给出了错误的答案。

我是编程初学者,谁能告诉我这个程序有什么问题吗?

#include <stdio.h>

struct student
{
    char name[10];
    int rollno;
    int DS_marks;
    int machine_marks;
    int ADE_marks;
    int signal_system_marks;
    int math_marks;
};

int main()
{
    int SIZE;

    struct student st[] = {
        { 'ali', 3, 89, 76, 65, 45, 90},
        { 'ma', 9, 87, 67, 90, 54, 45},
        { 'la', 6, 78, 65, 43, 29, 342}
    };

    // student structure pointer variable
    struct student *ptr;
    ptr = &st;
    SIZE = sizeof(st) / 34;
    if (SIZE == 0)
    {
        printf("there is no student record");
    }
    else
    {
        int max = maximum(ptr, SIZE);
        printf("%d", max);
    }
    return 0;
}

int maximum(struct student *ptr, int SIZE)
{
    int b, i;

    printf("press number for subject\n ");
    printf("press 1 for DS:\n ");
    printf("press 2 for machine:\n ");
    printf("press 3 for ADE:\n ");
    printf("press 4 for signal system:\n ");
    printf("press 5 for math:\n ");
    scanf("%d", &b);

    switch (b)
    {
        int maximum = 0;
        case 1:
        {
            for (i = 0; i < SIZE; i++)
            {
                if ((*ptr).DS_marks > maximum)
                {
                    maximum = (*ptr).DS_marks;
                }
                ++ptr;
            }
            break;
        }
        case 2:
        {
            for (i = 0; i < SIZE; i++)
            {
                if ((*ptr).DS_marks > maximum)
                {
                    maximum =(*ptr).machine_marks;
                }
                ++ptr;
            }
            break;
        }
        case 3:
        {
            for (i = 0; i < SIZE; i++)
            {
                if ((*ptr).ADE_marks > maximum)
                {
                    maximum =(*ptr).ADE_marks;
                }
                ++ptr;
            }
            break;
        }
        case 4:
        {
            for (i = 0; i < SIZE; i++)
            {
                if ((*ptr).signal_system_marks > maximum)
                {
                    maximum =(*ptr).signal_system_marks;
                }
                ++ptr;
            }
            break;
        }
        case 5:
        {
            for (i = 0; i < SIZE; i++)
            {
                if ((*ptr).math_marks > maximum)
                {
                    maximum =(*ptr).math_marks;
                }
                ++ptr;
            }
            break;
        }
        default:
        {
            printf("you have pressed wrong number");
            break;
        }
    }
    return maximum;
}

最佳答案

您的代码中存在多个问题:

  • 您计算 st 中的项目数与 SIZE = sizeof(st) / 34; .这是不正确的,因为 struct student 的大小不太可能是34 :name 之间很可能有一些填充和 rollno成员以确保 int 的正确对齐成员。你不应该像那样依赖手工计算的神奇值,只需使用 SIZE = sizeof(st) / sizeof(st[0]); ,适用于所有数组类型。

  • 函数 maximum应在使用前声明或定义。

  • 你应该检查 scanf("%d", &b); 的返回值避免无效输入的未定义行为:scanf()将返回 EOF如果输入流为空且 0如果它无法从流内容中转换数字,则留下 b未修改,因此未初始化。

  • 初始化 switch 中的局部变量 block 为 int maximum = 0;没有效果。初始化代码被绕过为switch直接分支到适当的case .这是导致您的问题的主要错误,它非常微妙,配置编译器以警告此类问题是明智的。使用 gcc -Wall -Wextra -Werrorclang -Wall -Wextra -Werror以避免愚蠢的错误。将定义和初始化移到 switch 之外声明。

  • 您假设所有字段都是正值。如果您对所有值为负的成员应用相同的算法,这可能会导致问题。正在初始化 maximum到第一个字段的值而不是 0解决了这个问题。

  • case 2你测错了成员:if ((*ptr).DS_marks > maximum)而不是 if ((*ptr).machine_marks > maximum) .剪切/粘贴/修改错误的经典案例。用 < 编写测试将有助于避免现场成员出现在线上相同位置的错误:眼睛会立即发现不对称。事实上,我只是为了可读性重写代码后才发现这个错误(见下文)。

  • 输出应以换行符终止:printf("%d\n", max);等等

  • 不是错误,而是 (*ptr).DS_marks写成 ptr->DS_marks 更具可读性.

  • 不是错误,而是所有大写标识符,例如 SIZE应该为宏和预定义常量保留。在这种情况下,count似乎是更好的选择。

这是更正后的版本:

#include <stdio.h>

struct student {
    char name[10];
    int rollno;
    int DS_marks;
    int machine_marks;
    int ADE_marks;
    int signal_system_marks;
    int math_marks;
};

int maximum(const struct student *ptr, int count);

int main() {
    struct student st[] = {
        { 'ali', 3, 89, 76, 65, 45, 90 },
        { 'ma', 9, 87, 67, 90, 54, 45 },
        { 'la', 6, 78, 65, 43, 29, 342 },
    };
    int max = maximum(&st, sizeof(st) / sizeof(st[0]));

    if (max >= 0) {
        printf("%d\n", max);
    }
    return 0;
}

int maximum(const struct student *ptr, int count) {
    int b, i, maximum;

    if (count <= 0) {
        printf("there are no student records\n");
        return -1;
    }
    printf("enter number for subject\n");
    printf("  enter 1 for DS:\n");
    printf("  enter 2 for machine:\n");
    printf("  enter 3 for ADE:\n");
    printf("  enter 4 for signal system:\n");
    printf("  enter 5 for math:\n");
    if (scanf("%d", &b) != 1) {
        printf("invalid input\n");
        return -1;
    }

    switch (b) {
        case 1: {
            maximum = ptr[0].DS_marks;
            for (i = 1; i < count; i++) {
                if (maximum < ptr[i].DS_marks) {
                    maximum = ptr[i].DS_marks;
                }
            }
            break;
        }
        case 2: {
            maximum = ptr[0].machine_marks;
            for (i = 1; i < count; i++) {
                if (maximum < ptr[i].machine_marks) {
                    maximum = ptr[i].machine_marks;
                }
            }
            break;
        }
        case 3: {
            maximum = ptr[0].ADE_marks;
            for (i = 1; i < count; i++) {
                if (maximum < ptr[i].ADE_marks) {
                    maximum = ptr[i].ADE_marks;
                }
            }
            break;
        }
        case 4: {
            maximum = ptr[0].signal_system_marks;
            for (i = 1; i < count; i++) {
                if (maximum < ptr[i].signal_system_marks) {
                    maximum = ptr[i].signal_system_marks;
                }
            }
            break;
        }
        case 5: {
            maximum = ptr[0].math_marks;
            for (i = 1; i < count; i++) {
                if (maximum < ptr[i].math_marks) {
                    maximum = ptr[i].math_marks;
                }
            }
            break;
        }
        default: {
            printf("you have entered an invalid number\n");
            break;
        }
    }
    return maximum;
}

关于c - 在学生数组中查找字段的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54731669/

相关文章:

c - 为什么在显示后一个 'tot' 时不考虑复合赋值?

objective-c - 可以将另一个项目添加到现有枚举类型吗?

C中指针和整数的比较

c - 从链表中查找最大值

我可以在结构中存储通用数组吗?

c - 如何按 C 中的优先级对列表项进行排序?

ios - Swift 不能使用函数指针吗?

c - C 中结构多态性的最佳方法

c - 如何让 Cilk 与 Cygwin 一起工作?

c - FCGI 应用程序的问题