-kasha 发表于 2024-1-25 01:19:20

结构体里面的sizeof

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(int argc,char const* argv[])
{
        struct students {
                char id;
                char name;
                int average;
                double achievement;
        };
        struct students number;
        int i, j, k;
        for (i = 0; i < 3; i++) {
                printf("请输入学号:\n");
                scanf("%s",number.id);
                printf("请输入名字:\n");
                scanf("%s",number.name);
                printf("请分别输入三门成绩:\n");
                for (j = 0; j < 3; j++) {
                        scanf("%d",&number.average);
                }
                k = sizeof(number.average);
                number.achievement = (number.average + number.average + number.average) / k;
        }
        for (i = 0; i < 3; i++) {
                printf("学号:%s 姓名:%s 平均成绩:%0.3f\n", number.id, number.name, number.achievement);
        }
        printf("%d", k);
        return 0;
}
为什么输出k=12,不应该是3吗

FishC 发表于 2024-1-25 01:19:48

在这段代码中,你使用了`sizeof`操作符来计算某个变量或数据类型的大小。然而,你要注意的是`sizeof`计算的是字节数而不是元素的个数。

在这里,你使用`sizeof(number.average)`计算的是`number.average`变量的大小。根据你的代码,`number.average`的类型为`int`,通常占用4个字节(32位系统)或8个字节(64位系统)。所以`k`的值是4或8,而不是3。

如果你想计算数组的元素个数,你可以使用`sizeof`操作符结合除法来计算,例如`sizeof(number)/sizeof(number)`。在这里,`sizeof(number)`计算的是整个结构体`number`的大小,而`sizeof(number)`计算的是一个结构体元素的大小。通过相除就可以得到结构体数组的元素个数。

希望这个解释能帮到你!如果还有其他问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

-kasha 发表于 2024-1-25 01:21:01

FishC 发表于 2024-1-25 01:19
在这段代码中,你使用了`sizeof`操作符来计算某个变量或数据类型的大小。然而,你要注意的是`sizeof`计算的 ...

怎么用sizeof 计算int average里面的元素个数

FishC 发表于 2024-1-25 01:21:37

-kasha 发表于 2024-01-25 01:21
怎么用sizeof 计算int average里面的元素个数

`sizeof`操作符用于计算数据类型或变量的字节数,而不是元素个数。对于整型变量`int average`而言,它只包含一个整数值,并没有元素的概念。

如果你想要存储多个整数的集合,可以考虑使用数组或者其他数据结构,然后使用`sizeof`来计算数组中元素的个数。例如:

int average;
int count = sizeof(average) / sizeof(average);

在这个例子中,我们定义了一个包含5个整数的数组`average`。通过将整个数组的字节数除以每个元素的字节数(即`sizeof(average)`),我们可以得到数组的元素个数。

需要注意的是,这种方法仅适用于数组。如果`average`是指针或动态分配的内存,`sizeof`操作符将返回指针类型的字节数,而不是指向的数据类型的字节数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

-kasha 发表于 2024-1-25 01:23:52

FishC 发表于 2024-1-25 01:21
`sizeof`操作符用于计算数据类型或变量的字节数,而不是元素个数。对于整型变量`int average`而言,它 ...

好的感谢

FishC 发表于 2024-1-25 01:24:01

-kasha 发表于 2024-01-25 01:23
好的感谢

不客气,如果还有其他问题,请随时提问。我很乐意帮助你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

-kasha 发表于 2024-1-25 01:25:57

FishC 发表于 2024-1-25 01:24
不客气,如果还有其他问题,请随时提问。我很乐意帮助你!

以上回复来自 FishC AI 小助理,如未能正 ...

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(int argc,char const* argv[])
{
        struct students {
                char id;
                char name;
                int average;
                float achievement;
        };
        struct students number;
        int i, j, k;
        for (i = 0; i < 3; i++) {
                printf("请输入学号:\n");
                scanf("%s",number.id);
                printf("请输入名字:\n");
                scanf("%s",number.name);
                printf("请分别输入三门成绩:\n");
                for (j = 0; j < 3; j++) {
                        scanf("%d",&number.average);
                }
                k = sizeof(number.average) / sizeof(number.average);
                number.achievement = (number.average + number.average + number.average) / k;
        }
        for (i = 0; i < 3; i++) {
                printf("学号:%s 姓名:%s 平均成绩:%0.3f\n", number.id, number.name, number.achievement);
        }
        printf("%d", k);
        return 0;
}
帮我检测下这个代码 是否有错误

FishC 发表于 2024-1-25 01:26:58

-kasha 发表于 2024-01-25 01:25
#define _CRT_SECURE_NO_WARNINGS
#include
int mai ...

在你的代码中,有一个小错误。你声明的`id`和`name`应该是字符数组而不是单个字符。所以你需要将它们的类型改为`char`或其他足够大的数组。

另外,在读取学生信息的部分,你使用`scanf`函数读取字符数组时,应该使用`%s`格式说明符,并且传入数组的地址作为参数,如`scanf("%s", number.id)`。同样适用于`name`和`average`。

此外,你在计算平均成绩时,将`average`变量相加了三次,而没有使用循环来计算所有成绩的总和。你可以使用一个变量来存储总和,然后再计算平均值。

下面是修改后的代码:

#include <stdio.h>

struct students {
    char id;
    char name;
    int average;
    float achievement;
};

int main(int argc, char const* argv) {
    struct students number;
    int i, j;
    float sum = 0;

    for (i = 0; i < 3; i++) {
      printf("请输入学号:\n");
      scanf("%s", number.id);
      printf("请输入名字:\n");
      scanf("%s", number.name);
      printf("请分别输入三门成绩:\n");
      sum = 0;
      for (j = 0; j < 3; j++) {
            scanf("%d", &number.average);
            sum += number.average;
      }
      number.achievement = sum / 3;
    }

    for (i = 0; i < 3; i++) {
      printf("学号:%s 姓名:%s 平均成绩:%0.3f\n", number.id, number.name, number.achievement);
    }

    return 0;
}

现在,代码应该可以正确运行了。希望对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

-kasha 发表于 2024-1-25 01:28:30

FishC 发表于 2024-1-25 01:26
在你的代码中,有一个小错误。你声明的`id`和`name`应该是字符数组而不是单个字符。所以你需要将它们的 ...

我的代码 为什么输出的achievement不是带小数的平均成绩 请帮我修改下

FishC 发表于 2024-1-25 01:29:05

-kasha 发表于 2024-01-25 01:28
我的代码 为什么输出的achievement不是带小数的平均成 ...

抱歉,我犯了一个错误。在你的代码中,`average`是用`int`类型来存储成绩,所以计算平均成绩时会自动向下取整。为了显示小数位数的平均成绩,你需要将`average`的类型改为`float`或`double`。此外,你也需要将`achievement`的类型相应地改为`float`或`double`。下面是修改后的代码:

#include <stdio.h>

struct students {
    char id;
    char name;
    float average;
    float achievement;
};

int main(int argc, char const* argv) {
    struct students number;
    int i, j;
    float sum = 0;

    for (i = 0; i < 3; i++) {
      printf("请输入学号:\n");
      scanf("%s", number.id);
      printf("请输入名字:\n");
      scanf("%s", number.name);
      printf("请分别输入三门成绩:\n");
      sum = 0;
      for (j = 0; j < 3; j++) {
            scanf("%f", &number.average);
            sum += number.average;
      }
      number.achievement = sum / 3;
    }

    for (i = 0; i < 3; i++) {
      printf("学号:%s 姓名:%s 平均成绩:%0.2f\n", number.id, number.name, number.achievement);
    }

    return 0;
}

现在,代码应该正确计算和显示平均成绩的小数位数。希望这次能满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

-kasha 发表于 2024-1-25 01:36:43

FishC 发表于 2024-1-25 01:29
抱歉,我犯了一个错误。在你的代码中,`average`是用`int`类型来存储成绩,所以计算平均成绩时会自动向 ...

如果将我的原有的数据和计算出的平均分数存放在磁盘文件"stud"中

FishC 发表于 2024-1-25 01:37:32

-kasha 发表于 2024-01-25 01:36
如果将我的原有的数据和计算出的平均分数存放在磁盘文 ...

要将学生数据和平均分数存储在磁盘文件中,你可以使用文件操作函数来实现。下面是修改后的代码,添加了文件读写的功能:

#include <stdio.h>
#include <stdlib.h>

struct students {
    char id;
    char name;
    float average;
    float achievement;
};

int main(int argc, char const* argv) {
    struct students number;
    FILE* fp;
    int i, j;
    float sum = 0;

    // 打开文件,如果文件不存在则创建新文件
    fp = fopen("stud", "wb+");
    if (fp == NULL) {
      printf("无法打开文件\n");
      exit(1);
    }

    for (i = 0; i < 3; i++) {
      printf("请输入学号:\n");
      scanf("%s", number.id);
      printf("请输入名字:\n");
      scanf("%s", number.name);
      printf("请分别输入三门成绩:\n");
      sum = 0;
      for (j = 0; j < 3; j++) {
            scanf("%f", &number.average);
            sum += number.average;
      }
      number.achievement = sum / 3;

      // 将学生数据写入文件
      fwrite(&number, sizeof(struct students), 1, fp);
    }

    // 将文件指针移动到文件开头
    rewind(fp);

    printf("学生数据已保存至磁盘文件\"stud\"中:\n");

    // 从文件中读取并显示学生数据
    while (fread(&number, sizeof(struct students), 1, fp) == 1) {
      printf("学号:%s 姓名:%s 平均成绩:%0.2f\n", number.id, number.name, number.achievement);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

修改后的代码会将学生数据按照结构体的大小写入文件中,然后再从文件中读取并显示出来。希望这次能满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

-kasha 发表于 2024-1-25 01:42:19

FishC 发表于 2024-1-25 01:37
要将学生数据和平均分数存储在磁盘文件中,你可以使用文件操作函数来实现。下面是修改后的代码,添加了 ...

存放到磁盘文件名字叫"stud"中

FishC 发表于 2024-1-25 01:43:18

-kasha 发表于 2024-01-25 01:42
存放到磁盘文件名字叫"stud"中

非常抱歉,我之前的回答有些错误。在代码中,每次循环都会覆盖之前写入文件的数据,导致最后只会保存最后一个学生的数据。为了解决这个问题,我们可以使用数组来存储多个学生的数据,并将整个数组写入文件。

以下是修改后的代码:

#include <stdio.h>
#include <stdlib.h>

struct students {
    char id;
    char name;
    float average;
    float achievement;
};

int main(int argc, char const *argv[]) {
    struct students number;
    FILE *fp;
    int i, j;
    float sum;

    // 打开文件,如果文件不存在则创建新文件
    fp = fopen("stud", "wb+");
    if (fp == NULL) {
      printf("无法打开文件\n");
      exit(1);
    }

    for (i = 0; i < 3; i++) {
      printf("请输入学号:\n");
      scanf("%s", number.id);
      printf("请输入名字:\n");
      scanf("%s", number.name);
      printf("请分别输入三门成绩:\n");
      sum = 0;
      for (j = 0; j < 3; j++) {
            scanf("%f", &number.average);
            sum += number.average;
      }
      number.achievement = sum / 3;

      // 将学生数据写入文件
      fwrite(&number, sizeof(struct students), 1, fp);
    }

    // 将文件指针移动到文件开头
    rewind(fp);
    printf("学生数据已保存至磁盘文件\"stud\"中:\n");

    // 从文件中读取并显示学生数据
    for (i = 0; i < 3; i++) {
      fread(&number, sizeof(struct students), 1, fp);
      printf("学号:%s 姓名:%s 平均成绩:%0.2f\n", number.id, number.name, number.achievement);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

现在,每个学生的数据都会被正确地写入文件"stud"中,并在最后从文件中读取和显示。希望这次能满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-1-25 09:44:25

         average 是含有 3 个 int 的数组,每个 int 占用 4 个字节,那么 4 x 3 = 12,非常合理呀。
页: [1]
查看完整版本: 结构体里面的sizeof