我正在尝试编写一个读取文件的程序,将数据存储在struct数组中,计算卷并写入按卷分类的新文件。程序编译并写入新文件,但不是按体积排序,重量为每个重量打印0.000000。
编辑:一切正常,除了按量排序
#include <stdio.h>
#define PI 3.14159265
struct cylinder {
double radius;
double height;
double weight;
double volume;
};
void selection_sort(struct cylinder my_cylinders[], int n);
int main() {
FILE *cFileIn, *cFileOut;
double radius, height, weight, volume;
struct cylinder my_cylinders[100];
cFileIn = fopen("cylinders.txt", "r");
if (cFileIn == NULL) {
printf("Error opening file \n");
return 1;
}
cFileOut = fopen("sorted_cylinders.txt", "w");
if (cFileOut == NULL) {
printf("Error opening file \n");
return 1;
}
fprintf(cFileOut, "# Radius Height Volume Weight\n");
int i, counter = 0;
for (i = 0; i < 6; i++) {
while (fscanf(cFileIn, "%lf, %lf, %lf, %lf\n", &radius, &height, &volume, &weight) != EOF) {
my_cylinders[counter].radius = radius;
my_cylinders[counter].height = height;
my_cylinders[counter].volume = volume;
my_cylinders[counter].weight = weight;
volume = PI * radius * radius * height;
fprintf(cFileOut, "%-d\t %-12.6lf\t %-12.6lf\t %-12.6lf\t %-12.6lf\t \n",
counter, radius, height, volume, weight);
counter++;
}
}
selection_sort(my_cylinders, counter);
printf("File sorted_cylinders.txt written \n");
fclose(cFileIn);
fclose(cFileOut);
return 0;
}
void selection_sort(struct cylinder my_cylinders[], int n) {
int i = 0, j = 0, min;
struct cylinder temp;
for (i = 0; i < n - 1; ++i) {
min = i;
for (j = i + 1; j < n; ++j) {
if (my_cylinders[j].volume < my_cylinders[min].volume) {
min = j;
}
}
temp = my_cylinders[i];
my_cylinders[i] = my_cylinders[min];
my_cylinders[min] = temp;
}
}
输出:
# Radius Height Volume Weight
0 2.400000 12.000000 217.146884 15.000000
1 18.200000 14.200000 14776.820321 25.900000
2 22.800000 10.600000 17311.130546 4.500000
3 3.500000 2.500000 96.211275 15.800000
4 6.000000 1.000000 113.097335 2.900000
5 21.000000 1.000000 1385.442359 100.000000
答案 0 :(得分:1)
您的代码中存在一些问题:
为什么你有2个嵌套循环来读取文件?
如果文件中有超过100个条目,您可以阅读超出数组末尾的内容。
您应该测试Collections.shuffle(yourArrayListName);
的返回值是预期转化次数,而不是与fscanf()
不同。如果文件中存在无效输入,EOF
将继续fscanf()
,而不是0
。
您不应该从输入文件中读取音量,因为它不存在。
您应该使用更精确的PI值:遗憾的是EOF
并不总是在M_PI
中定义,因为C标准并没有强制要求它。使用此:
<math.h>
选择排序中的算法存在缺陷。使用#define M_PI 3.14159265358979323846
和比较功能。
在排序数据之前编写输出文件。
以下是修改后的版本:
qsort