テキストファイルからデータを入力して
そのデータごとに番号を(No.1 80,No.2 70,No.3 90,etc)ふりたいのですがそのやり方
がわからなくてこまってます。
ただ番号を振るだけならfor文とかで
i番目は~です
とやればいいとはおもうのですが、これだと上から順に番号を読むだけになってしまう
と思うのです。
このデータをたとえば大きい順に並び替えたときに
No.3 90
No.1 80
No.2 70
となるようにしたいんですが・・・
つたない日本語で申し訳ありませんがご指導のほどよろしくお願いします。
まず環境を書きましょう。
次に何がしたいのかを明確にしましょう。
// だいたいOKですが、ここでいう『番号を振る』という言葉があいまい。
// ソートすればいいの? 順番は変えずに番号つきで出力すればいいの?
次に、どこまでできているのかをはっきりと示しましょう。
// データの入力自体はできているのか? データは保持できているのか、など。
すいませんでした。
環境はWindowsXPHEでVC++6.0です。
えーっと、例えば成績の点数を羅列したテキストファイルがあるとしますよね。(これ
は点数のみでだれが何点とかはかいてないです)
これを取り込んで、上から順番にNo.1,No.2・・・と番号をふっていきたいんです。
それでこれを大きい順にソートしてその結果を出力したいのです。
そうするとその結果は
No.5 --
No.3 --
No.2 --
・
・
・
と点数の大きい順になると思うんです。
つまりソートしたあとは上から順にNo.1,No.2,・・・とかにはならないと。
ソートしたりはできるのですが、番号をふるやり方がわからなくて困ってます。
なるほど、つまり
『(降順)ソートしたら何番になるか?』を付加して入力と同じ順番で出力。
ということですね。
…って結構大変そうですね。
入力した値と、何番目のデータかを(pairとかで)いっしょにとっておいて、
コピーを取って、片方入力値でソートしてもう一回紐つけてやれば
できるはずですけど・・・
スマートではないですね。
ちょっと気分転換に作ってみました。
// 今の仕事がJavaでC++から離れてるため禁断症状が出そうで・・・ってどうでもいいですね。
ご参考になれば。
#include<utility>
#include<vector>
#include<algorithm>
#include <iostream>
using namespace std;
// pair<int, int> の secondで比較する
bool LessSecond( const pair<int, int>& l, const pair<int, int>& r )
{
return l.second < r.second;
};
int main(int argc, char* argv[])
{
vector<pair<int, int> > a, b;
int tmp;
int i=0;
// 入力、『何番目の入力か』もとっておく
while( cin >> tmp ) a.push_back( make_pair( i++, tmp));
b = a;
// second(入力値) でソート
sort( a.begin(), a.end(), LessSecond );
// ソートした結果のインデックスを、取っといた入力のコピーのfirstに入れる
vector<pair<int, int> >::const_iterator it;
for( it = a.begin(); it != a.end(); it++ ){
b[ it->first ].first = int(it-a.begin());
}
// 出力
for( it = b.begin(); it != b.end(); it++ ){
std::cout << it->first << : << it->second << endl;
}
return 0;
}
はずしてたらすみません。
ぴよんさんはNoを振ることも、ソートすることも出来ると文面から
判断しました。
そうでしたら、入力時に90 NO1、80 NO2・・と番号を付与し
ソートして出力するときにNOを頭にもって来れば良いのではないでしょうか?
構造体を使うのが自然なのでは?あえて避けてます?
struct data {
int No;
int Score;
};
この配列を人数分用意して、点数を読み込みながらNoも入力。
Scoreの降順にソートして、No.をつけたりしながら出力。
> そうでしたら、入力時に90 NO1、80 NO2・・と番号を付与し
> ソートして出力するときにNOを頭にもって来れば良いのではないでしょうか?
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <utility>
int main() {
typedef std::pair<std::string,int> item; // 名前と番号
std::vector<item> v;
v.push_back(item(zero, 0));
v.push_back(item(one, 1));
v.push_back(item(two, 2));
v.push_back(item(three,3));
v.push_back(item(four, 4));
v.push_back(item(five, 5));
v.push_back(item(six, 6));
v.push_back(item(seven,7));
v.push_back(item(eight,8));
v.push_back(item(nine, 9));
std::sort(v.begin(), v.end());
for ( int i = 0; i < v.size(); ++i ) {
std::cout << No. << v[i].second << : << v[i].first << std::endl;
}
return 0;
}
すいません・・・他のとこにも書くのってマナー違反だったのですね・・・きをつけま
す。
PAIさん、επιστημηさん
書いてくださってありがたいのですが、自分はincludeするものとして
iostream,fstream,iomanipくらいしかしらない初心者でして、書いてあることがりかい
できませんでしたm(__)m
MKさん
いいえ、番号をふることすらできていませんです。
たいちうさん
私も構造体変数をつかえば出来るのではないかとおもい挑戦してみてはいたのですが、
ビルドしたところたくさんのエラーがでてなにがエラーなのかもわかりませんでした。
今作ろうとしているものはdata.txtファイルとして
5
54
75
35
73.7
73.4
というものがあり、(一番上はデータ入力する数、そのあとは個々の体重です。)
これをファイル入力し、上から番号をふった上でresult.txtファイルとして
No.2 75
No.4 73.7
No.5 73.4
No.1 54
No.3 35
と出力するようなものをつくりたいのです。それで、
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream fin(data.txt);
if(!fin){
cout << ファイルをオープンできませんでした。 << endl;
return 1;
}
int ninzu;
double* pT;
fin >> ninzu;
pT = new double [ninzu];
for(int i=0; i<ninzu; i++){
fin >> pT[i];
}
for(int s=0; s<ninzu-1; s++){
for(int t=s+1; t<ninzu; t++){
if(pT[t] > pT[s]){
double tmp = pT[t];
pT[t] = pT[s];
pT[s] = tmp;
}
}
}
ofstream fout(result.txt);
if(!fout){
cout << ファイルをオープンできませんでした。 << endl;
return 1;
}
for(int j=0; j<ninzu; j++){
fout << j+1 << 番の体重は << pT[j] << kgです。 << endl;
}
fout.close();
cout << 作業を終了しました。 << endl;
delete[] pT;
return 0;
}
というコードをかきました。
これでソートそのものはできるんですが、番号をふるとなるとどうすればいいかわから
なくて困ってしまいました。
そして、自分なりに参考書を見て構造体変数を利用してみたものが次のコードです。
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
struct sokutei{
int number;
double weight;
};
int main()
{
ifstream fin(data.txt);
if(!fin){
cout << ファイルをオープンできませんでした。 << endl;
return 1;
}
int ninzu;
sokutei* pT;
fin >> ninzu;
pT = new sokutei [ninzu];
for(int i=0; i<ninzu; i++){
pT->number[i] = i;
fin >> pT->weight[i];
}
for(int s=0; s<ninzu-1; s++){
for(int t=s+1; t<ninzu; t++){
if(pT->weight[t] > pT->weight[s]){
double tmp = pT->weight[t];
pT->weight[t] = pT->weight[s];
pT->weight[s] = tmp;
}
}
}
ofstream fout(result.txt);
if(!fout){
cout << ファイルをオープンできませんでした。 << endl;
return 1;
}
for(int j=0; j<ninzu; j++){
fout << 'No.' << pT->number[j] << setw(5) << pT->weight[j]
<< 'kg' << endl;
}
fout.close();
cout << 作業を終了しました。 << endl;
delete[] pT;
return 0;
}
・・・エラーが14個でましたTTどこがエラーなのか全くわからなくて困っています。
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
struct sokutei {
int number;
double weight;
};
int main() {
ifstream fin(data.txt);
if ( !fin ) {
cout << ファイルをオープンできませんでした。 << endl;
return 1;
}
int ninzu;
sokutei* pT;
fin >> ninzu;
pT = new sokutei[ninzu];
for ( int i=0; i < ninzu; i++ ) {
pT[i].number = i;
fin >> pT[i].weight;
}
for ( int s = 0; s < ninzu-1; s++ ) {
for ( int t = s+1; t < ninzu; t++ ) {
if ( pT[t].weight > pT[s].weight ) {
double tmp = pT[t].weight;
pT[t].weight = pT[s].weight;
pT[s].weight = tmp;
}
}
}
ofstream fout(result.txt);
if ( !fout ) {
cout << ファイルをオープンできませんでした。 << endl;
return 1;
}
for ( int j = 0; j < ninzu; j++ ) {
fout << 'No.' << pT[j].number
<< setw(5) << pT[j].weight << 'kg' << endl;
}
fout.close();
cout << 作業を終了しました。 << endl;
delete[] pT;
return 0;
}
επιστημηさん
お返事ありがとうございます。
えっと、pT->weight[i]とかアロー演算子を使うのではないということでしょうか?
上記のコードをビルドしたところエラーはでなかったのですが、
出力ふぁいるが変な数字が羅列されて出てきました。
んー・・・なにが原因なんでしょう。。。
fout << 'No.' << pT[j].number
<< setw(5) << pT[j].weight << 'kg' << endl;
'をに変更してください。
追加です。
アロー演算子を使いたいならば、(pT+i)->weight の様になります。