プロが教えるわが家の防犯対策術!

下記の内容が入力されているtxtファイルを読み込んで、一番下の内容のような感じに横一列に変換して別のtxtファイルで出力するプログラムを、C、C++で作成したいです。
Numberの下の数字を正規化して、1行目から17行目合わせて1.0になるように変換したいです。
***が並んでいるのは読み込み時無視してください。
_____は半角スペース5つ分で、_は1つ分という意味です。
説明不足かも知れませんがわかる方よろしくお願い致します!
----------------------------------------------------------------------
Label:Number|Histograms
_____1:_____0|
_____2:_____77|*******
_____3:_____101|**********
_____4:_____5|
_____5:_____28|**
_____6:_____0|
_____7:_____45|****
_____8:_____64|******
_____9:_____0|
_____10:_____1|
_____11:_____4|
_____12:_____505|****************
_____13:_____22|**
_____14:_____1|
_____15:_____49|****
_____16:_____2|
_____17:_____96|*********


----------------------------------------------------------------------
1:0.10160_2:0.00006665_3:0.0025560_4:0.00666_~~_15:0.0044458_16:0.00555_17:0.00099

質問者からの補足コメント

  • 最大値1、最小値0になるように正規化したいです。

      補足日時:2016/01/02 07:44
  • ご回答ありがとうございます!当方非常に初心者なもので、仕様がわかってもプログラムにあらわすことができません。もしよければコピーしてすぐ使えるようなソースコード(C/C++)をご提示いただいてもよろしいでしょうか。お手数かけますがどうぞよろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/01/02 08:59

A 回答 (2件)

#include <iostream>


#include <vector>
using namespace std;

struct HISTOGRAMS {
int number;
double histograms;
};

vector<HISTOGRAMS>* read_hist() {
FILE *fp;
auto *hist = new vector<HISTOGRAMS>();
int number;
double histograms;
char buf[100];

fopen_s(&fp, "hoge.txt", "r");
fscanf_s(fp, "%s", buf, 100);

while (fscanf_s(fp, "%d%*c%lf%*s", &number, &histograms) != EOF) {
HISTOGRAMS temp;
temp.number = number;
temp.histograms = histograms;
hist->push_back(temp);
}
fclose(fp);
return hist;
}

void write_hist(vector<HISTOGRAMS>* hist) {
FILE *fp;
fopen_s(&fp, "huga.txt", "w");
for (auto it = hist->begin(); it != hist->end(); it++) {
fprintf_s(fp, "%d:%f ", (*it).number, (*it).histograms);
}
fclose(fp);
}

int sum_hist(vector<HISTOGRAMS>* hist) {
int sum = 0;
for (auto it = hist->begin(); it != hist->end(); it++) {
sum += (int)(*it).histograms;
}
return sum;
}

void normalize_hist(vector<HISTOGRAMS>* hist) {
int sum = sum_hist(hist);
for (auto it = hist->begin(); it != hist->end(); it++) {
if (sum != 0) {
(*it).histograms /= sum;
}
}
}

int main() {
vector<HISTOGRAMS>* hist = read_hist();
normalize_hist(hist);
write_hist(hist);
delete hist;

return 0;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!非常に助かります!

お礼日時:2016/01/02 12:57

・読み込んで、数値のところを抜き出して、配列に入れる


・全部の合計値を求める
・各値について、 元の値 / 合計値 を出力

となりますけど、わからないのはどこですか?

Cでやるなら
・読み込んで、数値のところを抜き出して、全部の合計値を求める
・ファイルの読み出し位置を先頭に戻す
・再度読み込んで、数値のところを抜き出して、各値について、 元の値 / 合計値 を出力(整数/整数にならないように注意)
がいいかも。




C/C++でやらなければならない積極的な理由がなければ、
Perl,Ruby,Python,PHP等のテキスト処理が得意な言語を使うとか、
Excelで区切り位置で分割して... とかを使うとかの方が楽です。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!