我需要帮助在C中解决这个代码

时间:2013-12-05 13:29:40

标签: c arrays malloc expand realloc

我的问题..

a。)使用内存分配创建一个float数组来存储GPA分数 10名学生。为其分配值(您的选择)

b。)找到此阵列中的最大GPA。

c。)将此数组的内容写入文件 alloc.txt

d。)展开阵列以容纳5名学生的GPA分数。

e。)将此扩展数组的内容写入另一个文件 realloc.txt

f。)将 realloc.txt 的内容读取到另一个名为展开的浮点数组。

g。)打印出Expand数组的内容。

到目前为止,我有......

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

main ()
{

int i = 0;

float StudentGPA [9];
StudentGPA [0] = 3.7;
StudentGPA [1] = 2.9;
StudentGPA [2] = 3.8;
StudentGPA [3] = 2.5;
StudentGPA [4] = 3.4;
StudentGPA [5] = 1.9;
StudentGPA [6] = 2.4;
StudentGPA [7] = 4.0;
StudentGPA [8] = 3.1;
StudentGPA [9] = 3.9;
float *arrayStart = (float*) malloc(sizeof(float));

for (i=0; i<StudentGPA; i++) { 
(*arrayStart + i);   
} 
float maxValue = *arrayStart; 

for (int i=1; i<StudentGPA; i++) { 
if ( *(arrayStart + i) > maxValue ) 
maxValue = *(arrayStart + i); 
} 
const char(0) fileName = "alloc.txt"; 
FILE* outputFile = fopen (fileName, "w"); 
if (outputFile) { 
for (int i=0; i<StudentGPA; i++) { 
printf(outputFile,"%.2f\n", *(arrayStart + i)); 
} 
fclose(outputFile); 
} 

outputFile = NULL;

}

我被困在这里,我意识到这还没有完成,但我不能再完成了。我的编译器会通知多个错误。有人请帮忙。 提前谢谢!

3 个答案:

答案 0 :(得分:0)

我不明白你在做什么。 第一个for循环什么也没做。它计算内存地址,但不执行任何操作。此外,它不应该工作,因为你只分配     的sizeof(浮点) 并不是     10 * sizeof(浮动)

我理解arrayStart是一个指针。如果是这样,你应该申报     float * arrayStart; 要找到最大值,您只需要以下循环     max = StudentGPA [0];     for(int i = 0; i&lt; 10; i ++){       if(StudentGPA [i]&gt; max){max = StudentGPA [i]}     } 我是一个索引,应该取0和数组大小之间的值 扩展数组,这是创建新数组并将旧数组复制到其中的最简单方法。 否则,请使用链接列表。

答案 1 :(得分:0)

这听起来像是家庭作业。你的课本材料可以说什么?如果你在没有理解的情况下来到这里寻找答案,那么你可以通过作业,但你不会从课程中学习。

假设您将使用此信息进行学习,这里有一些信息可以帮助您入门。

a。)使用内存分配创建一个浮点数组,以存储10名学生的GPA分数。为其分配值(您的选择)

为此,您需要使用malloc。您的代码当前使用堆栈,将其声明为常量大小的数组。相反,你应该做这样的事情:

float* studentGPA = (float*)malloc(10 * sizeof(float));

然后用值初始化它。他们这样做的方式很好。

b。)找到此阵列中的最大GPA。

我不知道你为什么使用奇怪的指针算法,但是在数组中找到最大值很容易。只需循环遍历数组范围并与之前已知的值进行比较。例如。

float maxVal = studentGPA[0];
for (int i=1; i<10; i++) 
  if (studengGPA[i] > maxVal) 
    maxVal = studentGPA[i];

c。)将此数组的内容写入文件alloc.txt

有很多方法可以做到这一点。可以使用write直接编写内容,或使用fprintf将其打印到文件中。前者更精确,但后者实际上是一个人类可读的文件。例如,如果将整数16写入文件,则实际上将写入4个字节(通常为整数的大小),值(以十六进制表示)将为0x10 0x00 0x00 0x00。但是,如果您打印数字,则会写入字符“1”和“6”。这些映射到0x31和0x36的ascii值。在这个例子中,打印产生一个较小的文件,但一般来说,它是另一种方式。整数可以表示非常大的数字,打印每个数字需要一个字节。但是,写入总是需要4个字节。

也就是说,这是一种打印到文件的快捷方式。

FILE* outfile=fopen("alloc.txt", "w");
for (i=0; i<10; i++) 
  fprintf(outfile, "%f\n", studentGPA[i]);

d。)展开阵列以容纳5名学生的GPA分数。

您可以通过分配大小为15的新数组,然后将旧数组复制到该数组来手动执行此操作。但是,realloc可能正是您所寻找的。

realloc((void*)studentGPA, 15 * sizeof(float));

e。)将此扩展数组的内容写入另一个文件realloc.txt

见上文。

f。)将realloc.txt的内容读取到名为Expand。

的另一个float数组中

fprintf类似,您可以使用fscanf。它会将格式化输入读入您的值。

float* expand = (float*)malloc(15 * sizeof(float));
FILE* infile=fopen("realloc.txt", "r");
for (i=0; i<15; i++)
  fscanf(infile, "%f", &(expand[i]));

g。)打印出Expand数组的内容。

只需使用printf即可在屏幕上打印。

for (i=0; i<15; i++)
  printf("%f\n", expand[i]);

答案 2 :(得分:0)

首先,您声明了一个大小为9的数组,但是您尝试使用它,因为它有10个元素。 将数组声明更改为:

float StudentGPA[10];