• 締切済み

プログラミングの課題です、助けてください。

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

みんなの回答

回答No.3

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 )とすれば、 そのエントリのみ返すことができるでしょう。

caramel777
質問者

お礼

なるほど、今ようやく#include<stdlib.h>が用意されていたのかが、わかりました。 わかりやすい回答ありがとうございます。

回答No.2

まず、プログラムの概要から、確認したいと思います。 このプログラムは、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とか)は、 設問に従ってください。

caramel777
質問者

お礼

具体的で、わかりやすい回答をありがとうございます。 がんばってみます。

回答No.1

>設問のプログラミングがわかる方がいらっしゃいましたら、 プログラムのおおよその流れはわかりますが、 >「以下のプログラムで、引数としてスコア(100等の数字)を与えると、そのスコア以上のエントリだけを検索して、出力するように変更する」 の「スコア」(は変数から何となくわかるとして)や「エントリー」とは何のことでしょうか? >教えていただけると大変助かります。 結局、何を教えればいいのでしょうか?

参考URL:
http://okwave.jp/kotaeru_reply.php3?q=5049430
caramel777
質問者

補足

わかりにくい説明ですいません。 まずエントリというのはここではタブ区切りファイルとして出力したものの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言語が初心者のため、具体的にどこをどのように改良すればよいのか、またそのためにはどの分野を参照すればよいかなどを教えていただけると大変助かります。

関連するQ&A

  • C言語の課題なのですが、助けてください

    C言語のプログラミングの課題で、「以下のプログラムをキーワードを引数として入力できるように変更する(argvを利用する)」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #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); }

  • ファイル名の変換

    たびたびですいませんが、まったくの初心者で全然わからずお手上げ状態で困っています。よろしくお願いします 「以下のプログラムで入力ファイル名をID(ref|~~|の~~の部分のことです、例えばNP_000166.2.txtなど)の形に変更しなさい」といった作業をしたいのです。 #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]; if (argc != 2){ printf("エラー:プログラム名 入力ファイル\n"); return(0); } if((rfp = fopen(argv[1], "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } i = 0; while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ sprintf(fname,"files/%d.txt",i); if ((wfp =fopen(fname,"w")) == NULL) { printf("出力ファイルが存在しません\n"); return (EXIT_FAILURE); } fprintf(wfp,"%s\t%s\t%d\t%f", id, name, score, evalue); fclose(wfp); i++; } fclose(rfp); return (EXIT_SUCCESS); }

  • C言語のシェルプログラミングの課題が分かりません。

    C言語のシェルプログラミングを作れという課題で、以下のように作ったんですが、実行して何度かコマンドを入力した後、exitによって一発で終わらせることができません。どのように書き換えればいいか教えて下さい。 また、他にも書き換えた方がよいと思えるところがあったら是非教えて下さいm(_ _)m #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <sys/types.h> #include MAX_ARGS 10 #include MAX_LEN 100 extern char **environ; void child(int argc, char *argv[MAX_ARGS]); int main(void){ int argc, n = 0; int status; char input[MAX_LEN], *argv[MAX_ARGS], *cp; const char *delim = "\t\n"; while (1){ ++n; printf("$ "); fflush(stdout); if(fgets(input, sizeof(input), stdin) == NULL){ break; } cp = input; for(argc = 0; argc < MAX_ARGS; argc++){ if((argv[argc] = strtok(cp, delim)) == NULL) break; cp = NULL; } if(strcmp(argv[0], "exit") == 0){ exit(0); } pid_t pid = fork(); if(pid == -1){ perror("fork"); exit(1); }else if(pid == 0){ child(argc, argv); }else{ wait(&status); } } return 0; } void child(int argc, char *argv[MAX_ARGS]{ execvp(argv[0], argv); }

  • プログラミングの課題でシェルプログラミングが出たのですが・・・全くわけがわからないので助言を…

    先日学校でプログラミングの課題が出たのですが、いきなり説明もなく出されたためにまったく理解ができなくて非常に困っています。 内容はシェルプログラミングでプログラムを実行しろというモノですが、まだプログラミングを始めて幼いものでして、何が何やら理解できていないというのが現状です。 詳しい内容は #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> main(int argc, char *argv[]) { int len, pid, st; static char prompt[64]="> "; char command[256]; printf("%s",prompt); while (fgets(command, 256, stdin) != NULL){ if ((len = strlen(command)) == 1) break; command[len-1] = '\0'; if((pid = fork()) == 0) { if (execl(command,command,(char *)0)==(-1)){ printf("%s", "exec error.\n"); exit(1); } } else if(pid >= 1) { wait(&st); printf("%s", prompt); } else { perror("fork"); exit(1); } } exit(0); } というプログラム(自作なのであってるかは…)なのですが、これにはコマンドに引数があると、exec() でエラーになるという欠点があります。また、パス検索機能も指定されていないので、コマンドはフルパスで入力してあります。そこで問題なのですが、パス検索機能を追加するとともに、コマンドに引数があっても、exec() でプログラムが正常に実行できるように改良しろ。という内容の問題です。 上記のようにプログラムを作ることまではできたのですが、その先ができません。なんとかできるようにはできないでしょうか? ぜひ時間のある方回答お願いします。

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

  • c言語プログラミング実行時エラーについて質問です。

    c言語プログラミングを実行しようとすると、 エラーが出て次のようなメッセージが出てしまいました。 「「7行目」で記述エラーを発見しました。「constant expression」を付け忘れています。」 どなたか原因を教えてください。よろしくお願いいたします。 以下が失敗したプログラムです。 #include <stdio.h> int main(int argc, const char * argv[]) { const char FILENAME[] = "/Users/user/Desktop/date3.txt"; const int LEN = 100; char line [LEN]; char name [LEN]; char birth [LEN]; char address [LEN]; FILE *dat; dat = fopen(FILENAME, "r"); if ( dat == NULL ) { printf(" ファイル %s がオープンできません. ", FILENAME); return -1; } while( fgets( line, LEN, dat) != NULL ) { sscanf( line "%s, %s, %s", name ,birth, address ); printf("name = %s, address = %s\n", name, address ); } fclose(dat); return 0; }

  • テキストファイルの内容を2次元配列に格納したい

    課題で用意されたテキストファイルを読み込み、空白を区切りとする文字列の単位で配列に格納したいのですが、やりかたがわかりません。 ソースプログラムですが #include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 1000 int TextSplit(char *fname, char (*SpStr)[50]); int main(void) { int i, n; char fname[MAX], SpStr[MAX][50]; int Split; FILE *fp; printf("input File =>"); scanf("%s", fname); Split = TextSplit(fname, SpStr); printf("\n %d[文字列数] \n", Split); return 0; } int TextSplit(char *fname, char (*SpStr)[50]) { int i, j, k; char Readstr[MAX]; FILE *fp; fp = fopen(fname, "r"); if(fp == NULL) { printf("ファイルオープン失敗"); return 1; } i = 0; while(fscanf(fp, "%s", SpStr) != EOF) { i++; } fclose(fp); return i; } 以上のソースプログラムですが、内容は「空白で区切る文字列の単位の総数を表示する」ものになっています。 今日の20時までに終わらせないといけないので、ご教授お願いします。 使ってるソフトはMicrosoft Visual Studioです。

  • 入力されたテキスト行の中で最も長い行を表示するプログラム

    下のプログラムのmainの***************部とgetl()をどのように書いたらいいかわかりません。 出来ればプログラミングで書いていただけると嬉しいです。 #include <stdio.h> #define MAXLINE 1000 int getl(char s[] , int lim) { } void copy(char to[], char from[] ) { int i; i= 0; while((to[i] = from[i]) ! = ‘\0’) ++i; } int main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; 本で調べたところ、ループが終わる条件はEOFか、\nが出たときと、limitを超えるときのようなんですが・・・ お願いいたします。

  • プログラムのことについてご質問します。

    プログラムのことについてご質問します。 先日から以下のプログラムのことについて悩んでいます。 #include<stdio.h> #include<math.h> int main(int argc,char *argv[]){ FILE *rfp; FILE *wfp; int nline = 0; double score[100]; double sum_score = 0; char name[100][256]; int i; double heikinn; double hensati[100]; double ga[100]; double g[100]; double gg=0; double d=0; if (argc != 3){ fprintf(stderr,"使い方:%s 入力ファイル 出力ファイル\n",argv[0]); return -1; } if ((rfp=fopen(argv[1],"r")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[1]); return -1; } if ((wfp=fopen(argv[1],"w")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[2]); return -1; } while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){ sum_score += score[nline]; nline ++; } heikinn=sum_score/nline; for (i=0; i<=nline; i++){ ga[i]=(score[i]-heikinn); g[i] = ga[i]*ga[i]; gg += g[i]; } for (i=0; i<=nline; i++){ d= gg/(nline-1); hensati[i]=10*ga[i]/sqrt(d)+50; } for(i=0; i<=nline; i++){ fprintf(wfp,"Average score is %s, %5.2lf,%5.2lf.\n",name[i],&score[i],hensati[i]); } fclose(wfp); fclose(rfp); return 0; } エラーは、出ないのですがプログラムが完了できません。 皆様のお力をおかりできないでしょうか? よろしくお願いします。

  • プログラミングの課題で困ってます。

    正弦関数x=sintのグラフを■で描きなさい(31行程度で)。数値xに対する■の数はウインド各行に表示される しきれる範囲内で任意に定めてよい。 という課題が出ました。よくわからなくて困っています。 下記に書いてるプログラミングを参考に答えを教えていただきたいと思い、質問させていただきました。よろしくお願いします。 また、下記を参考にしなくてもよいです。 プログラミングはvisual C++ 2008を使ってます。 #include "stdafx.h" #include<stdio.h> #include<math.h> int _tmain(int argc, _TCHAR* argv[]) { double x[100]; int i , j; for(i=0; i<31; i++){ x[i]=sin(0.1*i); } // for(j=0; j<31; j++){ // printf("%lf\n",y[j]); // } for(i=0; i<31; i++){ for(j=0; j<x[i]*20; j++){ printf("■"); } printf("\n"); } return 0; }

専門家に質問してみよう