我想找到学生中的最大人数,已经使用十名学生的指针和结构给出的数据。
我的程序给出了错误的答案。
我是编程初学者,谁能告诉我这个程序有什么问题吗?
#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 -Werror
或clang -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/