• 締切済み

構造体を用いた特定数値抽出方法について

こんばんは。 前回、複数回実行方法および構造体の初期化について質問させていただいた者です。 VC++.NET2003を用いてコンソールプログラミングを行っています。 以下に前回示しました構造体を示します。この構造体は4つの整数型のメンバをもっています。 このNpktメンバ変数には、10から11000まで10ずつカウントアップされた値が格納されています。10,20,30,40・・・100,110・・・・11000ということです。そこで、Npktが100,200,300・・・の時のgettime,rPkt,lossPktメンバの値を抽出しファイル出力させたいと思い、以下に示しますプログラムを記述しました。 しかし、10,20,30,40・・・100,110・・・490,510,520・・・ という仮に500がない場合が存在し、Npktが500の値を取得できずにかつそれ以降の600,700・・・1000などを取得できない状態になってしまいます。 そこで、500がない場合は改行をファイル出力し600を探索しだすという方法を考えたのですが、うまく記述できません。 もしよろしければ、ヒントや記述方法を教えていただけないでしょうか? よろしくお願い致します。 (1)構造体 #define MAX 2000 struct tag{  int Npkt;  int gettime;  int rPkt;  int lossPkt; }rdata[MAX]; (2)プログラム概要 while(rdata[e].Npkt!='\0'){  if(rdata[e].Npkt==sa){   de=100;   sa+=de;   fprintf(fp9,"%d\t%d\t%d\t%d\n",rdata[e].Npkt,rdata [e].gettime,rdata[e].rPkt,rdata[e].lossPkt);  }  e++; }

みんなの回答

回答No.2

rdata[e].Npktはちょっと長いので、aとして書きますね。 (a/100) * 100 や a-(a%100) などで計算できると思います。

回答No.1

100ごとに区切りたいのなら、条件式の部分を if(rdata[e].Npkt % 100 == 0){ とされるのでは駄目でしょうか? 改行を出力するようにしたいのであれば、 100ごとの区切りを検出すれば良いかと思います。 具体的には、 if((rdata[e-1].Npkt/100) != (rdata[e].Npkt/100)){ とすれば、いけるかと思います(e-1が0以上でないといけませんが)。 この差をチェックすれば、2回以上一気に飛ばされた場合にも対応できます。 実際にコードを記述し、確かめたわけではありませんが、 少しでも参考になればと思います。

bird0214
質問者

補足

書き込みありがとうございます。 教えていただいた記述を以下のようにしたところ、うまく改行ができました。 ありがとうございました。 もう一つ質問させてください。 以下のプログラムでは、 100 200 300 400 500 (改行) から 600を補いたいです 700 800 ・ ・ ですが、改行としている部分を改行ではなく600という値を補うことは可能でしょうか? よろしくお願い致します。 [プログラム概要] while(rdata[e].Npkt!='\0'){ if(rdata[e].Npkt%100==0){   fprintf(fp9,"%d\t%d\t%d\t%d\n",rdata[e].Npkt,rdata[e].gettime,rdata[e].rPkt,rdata[e].lossPkt); }else{   if((rdata[e-1].Npkt/100) != (rdata[e].Npkt/100)){    fprintf(fp9,"\n");   }  }  e++; }