【问题标题】:enhancing a program - complete failure增强程序 - 完全失败
【发布时间】:2012-02-10 08:01:44
【问题描述】:

大家好。 我在试图弄清楚如何增强我的程序时遇到了一些麻烦。

问题来了:

编写一个程序来计算课程的数字成绩。课程记录位于将作为输入文件的文件中。输入文件的格式如下:每一行包含一个学生的姓氏,然后是一个空格,然后是学生的名字,然后是一个空格,然后是十个测验分数,所有这些都在一行上。测验分数是整数,并用一个空格分隔。您的程序将从该文件中获取输入并将其输出发送到第二个文件。输出文件中的数据将与输入文件中的数据相同,只是在每一行的末尾会有一个额外的数字(双精度型)。这个数字将是学生十次测验分数的平均值。如果这是作为课堂作业完成的,请从您的教师那里获取文件名。使用至少一个将文件流作为其全部或部分参数的函数。

我成功地完成了第一部分。下面是代码:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
    fstream infile("grades.txt",ios::in);
    if(!infile){cerr<<"file could not be found!";exit(1);}

    fstream outfile("average.txt",ios::out);
    if(!outfile){cerr<<"file could not be created!";exit(1);}


    char fname[20];
    char lname[20];
    int grades[10];
    char c;
    int x;
    cout<<"how many students?";
    cin>>x;

        for(int k=0;k<x;k++)
        {
            infile>>fname;
            infile>>lname;
            for(int i=0;i<10;i++)
            infile>>grades[i];
            outfile<<fname<<" "<<lname<<" ";
            double sum=0;
            for(int j=0;j<10;j++) 
            {

                outfile<<grades[j]<<" ";
                sum+=grades[j];

            }

            double avg=0;
            avg=sum/10;
            outfile<<avg<<endl;
        }


    system("pause");
    return 0;
}

我无法完成第二部分的 (a) 部分。我尝试将 Grades[10] 数组初始化为零,但我没有得到任何正确的输出。有什么帮助吗?谢谢。

在以下所有方面增强您为(问题 10)编写的程序 方法。

a-每行的测验分数列表将包含十个更少的测验 分数。 (如果测验分数少于十个,这意味着 学生错过了一项或多项测验。)平均分数为 仍然是测验分数的总和除以 10。这相当于 对于任何错过的测验,给学生一个 0。

b-输出文件将在开头包含一行(或多行) 解释输出的文件。使用格式化指令 使布局整洁易读。 c- 放置所需的后 在输出文件中输出,您的程序将关闭所有文件,然后 将“输出”文件的内容复制到“输入”文件中 最终效果是更改输入文件的内容。
使用至少两个将文件流作为全部或部分的函数 他们的论点。如果这是作为课堂作业完成的, 从您的指令中获取文件名。


这是我的代码现在的样子

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
    fstream infile("grades.txt",ios::in);
    if(!infile){cerr<<"file could not be found!";exit(1);}

    fstream outfile("average.txt",ios::out);
    if(!outfile){cerr<<"file could not be created!";exit(1);}


    char fname[20];
    char lname[20];
    int grades;
    int sum=0;
    int linecount=0;
    char c;

    while(!infile.eof())
    {
            infile>>lname;
            infile>>fname;
            outfile<<lname<<" "<<fname<<" ";
            for(int i=0;i<10;i++){if(infile>>grades)outfile<<grades<<" ";else {outfile<<"0 ";break;} sum+=grades;}
            outfile<<double(sum/10.0);
    }
            system("pause");
            return 0;
}

但是当我运行程序时,我得到的只是一个黑色空间。我无法修复循环以读取文件的所有行。

【问题讨论】:

  • 提示:你不需要用零初始化你的数组。您甚至不需要等级数组;)您的解决方案不是最佳解决方案,但到目前为止它正在起作用。您应该考虑如何检测当前行中是否有少于 10 个等级。也许中断语句(msdn.microsoft.com/en-us/library/37zc9d2w(v=vs.80).aspx)会有所帮助(最优雅的解决方案也不需要中断,但它可能会有所帮助)。另一个问题:小心除以10,因为它会进行整数除法而不是双除法。改用/10.0/10f
  • 如果我没有成绩数组,我将如何处理成绩并获得平均值?
  • 您只是在加载下一个年级,添加到总和并阅读下一个年级,......然后信息就在您的总和中:while(&lt;next grade exists&gt;){sum += readNextGrade();} avg = sum/10.0for(int j=0;j&lt;10;j++){int curGrade = &lt;readNextGrade&gt;; if(&lt;error occured&gt;) break; sum+=curGrade} avg=sum/10.0
  • 我不认为可以这样做,因为文件的内容是 Jackson Tom 95 97 94 87 67 84 99 45 99 87 Jackson Michael 43 23 34 77 64 35 89 56 75 85 Johnson Sara 84 93 64 57 89 99 74 64 75 35 91
  • 一般 C++ 建议:如果您的代码包含像 1020 这样的魔法文字,那么您做错了 :-)

标签: c++ file text


【解决方案1】:

从第一部分开始:您的代码并没有完全解决给定的问题。给出的问题并不是说您输入了许多学生,但您应该处理文件中的所有学生,无论他们有多少。此外,您忽略了以下部分:“使用至少一个将文件流作为其全部或部分参数的函数。”

无论如何,我建议您逐行阅读文件,然后使用ostringstream 单独处理每一行。这样一来,检测到没有更多学生跟随的方式与在第 1 部分检测到没有更多学生跟随的方式相同。

提示:查看流错误状态,尤其是fail,并在第 1 部分使用 while 循环,在第 2 部分使用break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 2013-01-11
    • 2021-11-03
    • 2014-12-02
    • 2015-04-07
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多