- 締切済み
プログラミングの課題です、助けてください。
C言語のプログラミングの課題で、「以下のプログラムで、引数としてスコア(100等の数字)を与えると、そのスコア以上のエントリだけを検索して、出力するように変更する」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; char keyword[] = "glu"; for(i = 0; i < 100; i++){ sprintf(fname,"files/%d.txt",i); if((rfp = fopen(fname, "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ if (strstr(name,keyword) != NULL){ printf("%s\n",id); } } fclose(rfp); } return (EXIT_SUCCESS); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- genso-cake
- ベストアンサー率65% (23/35)
argvを利用するとありましたので、その方法を。 コマンドから " >abc.exe 100 "と入力された場合、 argv[0] = "abc.exe" argv[1] = "100" が入ってきます。 引数の位置や数が決まっているなら、argv[1]のように決めうちでやるのが楽です。 argv[1]の値は数値ではなく文字列なので、 数値に変換しないといけません。 これを行ってくれるのが、atoi()関数(stdlib.h)です。 int border = atoi(argv[1]); if( border == 0 ){ printf("引数が不正です。\n"); return (EXIT_FAILURE); } とすれば、変換ができます。 あとは、if( score >= border )とすれば、 そのエントリのみ返すことができるでしょう。
- genso-cake
- ベストアンサー率65% (23/35)
まず、プログラムの概要から、確認したいと思います。 このプログラムは、for( i = 0 ; i < 100 ; i ++ )のループより、 番号.txtという形式のファイル名で保存された、 タブ区切りのファイルがいくつかあり、それを順に読んでいくものとみました。 (ファイル名は0からの連番。最大で99まで) このタブ区切りの1行は、id,name,score,evalueの4つのフィールドから出来ている。 (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue)より) **** さて、上記のプログラムでは、if(strstr(name,keyword)!=NULL)なら idを出力するような条件になっています。(nameに'glu'が含まれているものを検索) ここをif( score >= 100 ) に書き換えれば、 100以上のエントリのみ返すことが出来ます。 「100」をどのように与えるか(mainの引数とかscanfとか)は、 設問に従ってください。
お礼
具体的で、わかりやすい回答をありがとうございます。 がんばってみます。
- SilverThaw
- ベストアンサー率32% (260/806)
>設問のプログラミングがわかる方がいらっしゃいましたら、 プログラムのおおよその流れはわかりますが、 >「以下のプログラムで、引数としてスコア(100等の数字)を与えると、そのスコア以上のエントリだけを検索して、出力するように変更する」 の「スコア」(は変数から何となくわかるとして)や「エントリー」とは何のことでしょうか? >教えていただけると大変助かります。 結局、何を教えればいいのでしょうか?
補足
わかりにくい説明ですいません。 まずエントリというのはここではタブ区切りファイルとして出力したものの1行分のデータのことです。全部コピペできませんが、たとえば ref|NP_001035561.1| glucose 1082 0.0 ref|NP_032181.1| glucose 1060 0.0 ref|XP_867955.1| PREDICTED: 1056 0.0 ref|NP_997475.1| glucose 1045 0.0 ref|XP_001365167.1| PREDICTED: 1004 0.0 ref|XP_002189312.1| PREDICTED: 991 0.0 ref|NP_001006128.1| glucose 988 0.0 ref|XP_001510188.1| PREDICTED: 969 0.0 の一行ごとのことです。 あと上に上げた、ソースの訂正なのですが、argvを利用して、コマンドライン引数が対応するように、keywordをargv[]で書き換えたもので、引数としてスコアの値を与えると該当する行(エントリ)だけ出力するようにプログラムを改良したいのです。 C言語が初心者のため、具体的にどこをどのように改良すればよいのか、またそのためにはどの分野を参照すればよいかなどを教えていただけると大変助かります。
お礼
なるほど、今ようやく#include<stdlib.h>が用意されていたのかが、わかりました。 わかりやすい回答ありがとうございます。