データに番号をふりたい – プログラミング – Home

データに番号をふりたい
 
通知
すべてクリア

[解決済] データに番号をふりたい

固定ページ 1 / 2

ぴよん
 ぴよん
(@ぴよん)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

テキストファイルからデータを入力して
そのデータごとに番号を(No.1 80,No.2 70,No.3 90,etc)ふりたいのですがそのやり方
がわからなくてこまってます。
ただ番号を振るだけならfor文とかで
i番目は~です
とやればいいとはおもうのですが、これだと上から順に番号を読むだけになってしまう
と思うのです。
このデータをたとえば大きい順に並び替えたときに
No.3 90
No.1 80
No.2 70
となるようにしたいんですが・・・

つたない日本語で申し訳ありませんがご指導のほどよろしくお願いします。


引用未解決
トピックタグ
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

まず環境を書きましょう。

次に何がしたいのかを明確にしましょう。
// だいたいOKですが、ここでいう『番号を振る』という言葉があいまい。
// ソートすればいいの? 順番は変えずに番号つきで出力すればいいの?

次に、どこまでできているのかをはっきりと示しましょう。
// データの入力自体はできているのか? データは保持できているのか、など。


返信引用
ぴよん
 ぴよん
(@ぴよん)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

すいませんでした。
環境はWindowsXPHEでVC++6.0です。

えーっと、例えば成績の点数を羅列したテキストファイルがあるとしますよね。(これ
は点数のみでだれが何点とかはかいてないです)
これを取り込んで、上から順番にNo.1,No.2・・・と番号をふっていきたいんです。
それでこれを大きい順にソートしてその結果を出力したいのです。
そうするとその結果は
No.5 --
No.3 --
No.2 --



と点数の大きい順になると思うんです。
つまりソートしたあとは上から順にNo.1,No.2,・・・とかにはならないと。
ソートしたりはできるのですが、番号をふるやり方がわからなくて困ってます。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

なるほど、つまり
 『(降順)ソートしたら何番になるか?』を付加して入力と同じ順番で出力。
ということですね。

…って結構大変そうですね。

入力した値と、何番目のデータかを(pairとかで)いっしょにとっておいて、
コピーを取って、片方入力値でソートしてもう一回紐つけてやれば
できるはずですけど・・・

スマートではないですね。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

ちょっと気分転換に作ってみました。
// 今の仕事が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;
}


返信引用
MK
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

はずしてたらすみません。

ぴよんさんはNoを振ることも、ソートすることも出来ると文面から
判断しました。

そうでしたら、入力時に90 NO1、80 NO2・・と番号を付与し
ソートして出力するときにNOを頭にもって来れば良いのではないでしょうか?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

構造体を使うのが自然なのでは?あえて避けてます?

struct data {
int No;
int Score;
};

この配列を人数分用意して、点数を読み込みながらNoも入力。
Scoreの降順にソートして、No.をつけたりしながら出力。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> そうでしたら、入力時に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;
}


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

あっ

http://cgi2.html.ne.jp/~piro/bbs/wforum.cgi?
no=2227&reno=no&oya=2227&mode=msgview&page=0


返信引用
ぴよん
 ぴよん
(@ぴよん)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

すいません・・・他のとこにも書くのってマナー違反だったのですね・・・きをつけま
す。
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;
}
というコードをかきました。
これでソートそのものはできるんですが、番号をふるとなるとどうすればいいかわから
なくて困ってしまいました。


返信引用
ぴよん
 ぴよん
(@ぴよん)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

そして、自分なりに参考書を見て構造体変数を利用してみたものが次のコードです。
#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どこがエラーなのか全くわからなくて困っています。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

#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;
}


返信引用
ぴよん
 ぴよん
(@ぴよん)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

επιστημηさん
お返事ありがとうございます。
えっと、pT->weight[i]とかアロー演算子を使うのではないということでしょうか?
上記のコードをビルドしたところエラーはでなかったのですが、
出力ふぁいるが変な数字が羅列されて出てきました。
んー・・・なにが原因なんでしょう。。。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

fout << 'No.' << pT[j].number
<< setw(5) << pT[j].weight << 'kg' << endl;

'をに変更してください。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

追加です。
アロー演算子を使いたいならば、(pT+i)->weight の様になります。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました