配列の問題で質問があります。
田中 一郎
87 76 90 -1(スコア)
木村 和夫
73 63 74 70 -1
佐々木 晴彦
-1
山田 太郎
84 73 83 -1
これを、インプットファイルからアウトプットファイルに同じように表示させる問題です。数字(スコア)のところが全て同じならできるのですが、これは違う(木村、5個、田中、山田、4、佐々木、1)のでどうすればいいかわかりません。
あと、スコアから平均を求めなければならないのですが、これもスコアの数が各々違うし、あとマイナスを除いて(田中なら87 76 90、木村なら73 63 74 70)求めなければなりません。スコアの数が違い、マイナスを含まない平均の求め方を教えてください、お願いします。
少し長くなりましてごめんなさい。
どの辺が配列の問題なのかよくわかりませんが、たとえばこんなの。
void testfunc2() {
const char text[]="12 34 56 -1";
const char* p=text;
int v, n;
while (sscanf(p, "%d%n", &v, &n)==1) {
printf("%d\n", v);
p+=n;
}
}
後は適宜応用すればいいんぢゃないかなー。
平均を取るためには総和と個数が必要とか -1 で終わるにはどうすべきかとか。
1 名前とスコアが何で分けられているかわかりますか。
2 各行を読み込んで配列などに格納できますか。
3 取得した行の各スコアを数値として配列などに格納できますか。
4 スコアがマイナスかどうかの判断はできますか。
5 プラスのスコアの数を求められますか。
6 平均の求め方を知っていますか。
どこまでいってるんでしょうか。
tetrapodさん、麦茶オレさん返信ありがとうございます。
麦茶オレさんの質問を答えるよりも自分のプログラムを見て頂いた方が早いと思うのでのせてみます。
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
void readfile(ifstream& input,ofstream& output);
int main()
{
ifstream input;
ofstream output;
input.open("a\\in.txt"); //最初に書いた上のファイル(もし全員同じ場合)
output.open("a:\\out.txt");
readfile(input,output);
input.close();
output.close();
return 0;
}
void readfile(ifstream& input,ofstream& output)
{
const int size = 4;
string fname[4] = {""};
string lname[4] = {""};
int score1[4] = {0};
int score2[4] = {0};
int score3[4] = {0};
int score4[4] = {0};
int score5[4] = {0};
int i = 0;
double total[4] = {0.0};
double ave[4] = {0.0};
while(!input.eof())
{
input >> fname[i] >> lname[i] >> score1[i] >> score2[i] >> score3[i] >> score4[i] >> score5[i];
cout << "名前" << fname[i] << " " << lname[i] << endl;
cout << "スコア: " << score1[i] << " "<< score2[i] << " " << score3[i] << " " << score4[i] << " " << score5[i]<< endl;
total[i] = score1[i]+score2[i] +score3[i] +score4[i] +score5[i];
ave[i]=total[i];
cout << "平均点" << ave[i] << endl;
++i;
}
}
このようにスコアが同じ場合は出来ます(多少、違ったり変かもしれませんが、ごめんなさい)。
しかし、スコアの数が違うとよく分からなくなります。
あとマイナスは、invalid dateとみなすので、どんな数(−1、−43、
−18など)でもいいみたいです。
これをふまえた上でどうかお願いします。
こんなのは参考になりますか?
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
int main()
{
std::ifstream from( "in.txt" );
std::ofstream to( "out.txt" );
if( from.fail() || to.fail() )
{
std::cout << "file open error" << std::endl;
return 1;
}
while( true )
{
// 行単位でファイル読み込み
std::string name, score;
if( !std::getline( from, name ) ) // 名前
{
break;
}
if( !std::getline( from, score ) ) // スコア
{
break;
}
// "out.txt"ファイル書き込み
to << name << '\n' << score << std::endl;
// スコア計とデータ数
int total = 0, num = 0;
std::istringstream iss( score );
for( int dt; iss >> dt; ++num )
{
total += dt;
}
// 名前,スコア計,データ数,平均値表示
std::cout << name << '\n'
<< " total = " << total << ", num = " << num << '\n'
<< " average = " << static_cast< double >( total ) / num
<< std::endl;
}
}
> マイナスを含まない平均の求め方
しまった。これを見落としていました。
一部修正:
*マイナスのスコアは合計にもデータ数にもカウントしない
*データ数が0の場合(スコアが全てマイナス)の場合は平均は表示しない
// スコア計とデータ数
int total = 0, num = 0;
std::istringstream iss( score );
for( int dt; iss >> dt; )
{
if( dt > 0 )
{
total += dt;
++num;
}
}
// 名前,スコア計,データ数,平均値表示
std::cout << name << '\n'
<< " total = " << total << ", num = " << num << std::endl;
if( num > 0 )
{
std::cout << " average = " << static_cast< double >( total ) / num << std::endl;
}
何度もごめんなさい。「マイナス」を除くならこうでしたね。
// スコア計とデータ数
int total = 0, num = 0;
std::istringstream iss( score );
for( int dt; iss >> dt; )
{
if( dt >= 0 ) // 関係演算子を訂正
{
// 以下略
monkeyさん、返信遅れて大変申し訳ありませんでした。
monkeyさんのプログラムかなり参考になりました。
それと訂正などいろいろして頂きありがとうございました。
大変、感謝しています。