プログラミングの問題解決

このQ&Aのポイント
  • ファイルの入出力に関する問題と解法について説明します。
  • 構造体を用いたプログラムの作成方法とデータの表示方法を解説します。
  • 2次元配列を使った行列の四則演算のプログラムを作成する方法について説明します。
回答を見る
  • ベストアンサー

プログラミングに関する問題が解けません;;

1 「ファイルの入出力」 以下のプログラムはdata.txtのデータを読み込み,画面に出力するものです. 下記のプログラムの######を埋めて完成させよ. #include <stdio.h> #include <stdlib.h> int main(void){     char dummy[128], filename[128];     FILE *fp;     char x;   sprintf(filename,"data.txt");     fp=fopen(filename, "r");     if(#####(1)####) {        printf("ファイル%s が見つかりません\n",filename);        return(-1);      } while(#########(2)############){ putchar(x); } fclose(fp); return(0); } 2 構造体を用いたプログラム 名前と点数用のメンバを持つ構造体dataを宣言しなさい。 また、名前と点数を表示する関数hyoujiを完成させよ。 #include <stdio.h> (1) void hyouji(###(2)###, int no); int main(void){ struct data member[3] = {{"伊藤", 71},{"小林", 81},{"山田", 67},}; hyouji(member, 3); } void hyouji(####(3)####, int no){ int i; for(i=0; i<no; i++){ printf("%s:%d\n", ###(4)###); mem++; } } 3 「2次元配列を使った行列の四則演算」 次のプログラムは、2次元配列の和を求め結果を表示するためのものである. 関数 mat_tasu()の中身を完成させよ. ただし関数 mat_tasu()は引数を持たない関数とします. #include<stdio.h> int ma[2][2]={{1,2}, {3,4}}; int mb[2][2]={{5,6}, {7,8}}; int mc[2][2]; void mat_tasu(void); int main(void) { int i,j; mat_tasu(); for (i=0; i<2; i++){ for (j=0; j<2; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); } /* 行列の和の計算 */ void mat_tasu(void) {      (1) } 各問題の(1)や(2)みたいになってるところに当てはまるプログラミングを教えてください! 一問だけでもいいので分かる方いましたら、回答お願いいたします!

質問者が選んだベストアンサー

  • ベストアンサー
noname#128134
noname#128134
回答No.1

1-1 if だから何かを判定しているんですよね。オープン出来なかったのは何かですね。 1-2 while だからループですよね。ファイルから1文字読み込んだ値が適切かどうかでしょうか。 2-1 何かinclude か変数の定義でしょうか? 2-2 2-2 と2-3 は同じですね。宣言と定義ですので。んでこの関数が呼ばれている所を探すと、ここにどんな型が入るのか分かりそう 2-4 おそらく配列の個々の値でしょうね。(ヒント:ここは値が複数?) 3-1 mc = ma * mb でしょうね。具体的には行列の計算なんですが・・・。 いかにも課題って感じですね。プログラムの楽しみもへったくれもココから見いだせません。まっ、がんばって。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

おっと, 1 の (2) は処理系によらない書き方ができそうだ. 多分, この問題を出した人間が期待する解答にはならんけど. 単純に getc ではダメなんだよな~.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

みなさん騙されてはいけません. 1 の (1) をよ~く見てください. この if でチェックすべきは「ファイルが存在するかどうか」ですよ. 「ファイルがオープンできたかどうか」ではありません. つまり, 「ファイルはあるけど諸事情でオープンできない」ときにはこの if で引っかかってはいかんのです. で, それをこの 1行で書くことはできません. ちなみにその次の (2) も書きようがなかったりする (厳密に言えば「動かない処理系があっても文句の言えない」プログラムにはできる).

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

これ課題でしょ。自分で考えないと後々困ると思いますが。ヒントだけ。 1.「fopen」「戻り値」で検索。  2番目は http://www1.cts.ne.jp/~clab/hsample/IO/IO14.html  を参照 2.は以下を参照。 http://www.mapee.jp/cpp/post_30.html  その際、文字列を格納する配列はSJISならば文字数×2+1(文字列終端を示す'\x0')分の領域が必要。「hyouji(member, 3);」のところでhyouji関数に構造体配列の先頭アドレスを渡しているのでhyouji側では「->」で参照しなければならない。 3.関数内でi,jを宣言して2重ループにして足せばいいのでは。

関連するQ&A

  • 問題: 以下の2つのプログラムを実装し、時間計算量を実験的に評価せよ。

    問題: 以下の2つのプログラムを実装し、時間計算量を実験的に評価せよ。     (1)1から1万までの整数ちをランダムに1千個生成するプログラム     (2)シェルソートプログラム 質問内容   プログラム()をやったんですが、「時間計算量を実験てきに評価せよ」というのは分かりません。 教えてください。 /* ランダムプログラ*/ #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void main(){ FILE *fp; int i,rnd; fp=fopen("data.dat","w"); srand((int)time(NULL)); for(i=1;i<=N;i++){ rnd = (int)rand()% 10000 + 1; fprintf(fp,"%d\n ", rnd); } fclose(fp); } /* シェルソートプログラム*/ #include <stdio.h> #include <stdlib.h> #define DATA_NUM 1000 void ShellSort(int num[ ], int n) ; void InsSort(int num[ ], int gap, int n); void ShowData(int num[ ], int n); void main(void); /* n 個のデータのシェルソートを行う */ void ShellSort(int num[ ], int n) { int gap; for (gap = n / 2; gap > 0; gap /= 2) InsSort(num, gap, n); } /* n 個のデータの単純挿入ソートを行う */ void InsSort(int num[ ], int gap, int n){ int i, j, temp; for (i = gap; i < n; i ++) { for (j = i - gap; j >= 0; j -= gap) { /* このループで */ if (num[j] <= num[j + gap]) /* j 番目とj + gap 番目と比較 */ break; /* ここにbreak;を挿入。*/ else { temp = num[j]; /* 要素の入れ替え */ num[j] = num[j + gap]; num[j + gap] = temp; ShowData(num,DATA_NUM); /* 途中経過を表示 */ } } } printf("\n"); /* InsSort( ) を抜ける時改行 */ } /* n 個のデータの表示 */ void ShowData(int num[ ], int n) { while (n--) printf("%d ", *num++); printf("\n"); } void main(void) { FILE *fp; int data[DATA_NUM]; int i; fp = fopen("data.dat","r"); if(fp == NULL){ printf("data.dat cannot be opened"); exit(1); } for(i=0;i<DATA_NUM;i++){ if(fscanf(fp,"%d",&data[i])== NULL){ break; } } printf("ソート前\n"); ShowData(data, DATA_NUM); printf("\n"); /* シェルソート */ ShellSort(data, DATA_NUM); printf("\n"); printf("ソート後\n"); ShowData(data,DATA_NUM); printf("\n"); fclose(fp); }

  • cプログラミングについて

    以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく 直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。 (間違えだらけで申し訳ありません) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 500 void mysort(char *word[MAXLINE]) { int i,j; char *tmp; for(i=0;;i++){ for(j=i+1;; j++){ if(strcmp(word[j],word[i])==1){ tmp=word[i]; word[i]=word[j]; word[j]=tmp; } } } } int main(void) { int i; FILE *fp; char str[MAXLINE]; fp= fopen("sample.txt", "r"); if (fp == NULL) { printf("fopen error\n"); exit(1); } while(( fgets( str, MAXLINE, fp )) != NULL) mysort(str); for(i=0;; i++) printf("%s\n", str[i]); return 0; }

  • プログラミング

    C++で、五個の配列を確保し、それらを関数を使って逆順にしたいのですが、別の配列にコピーして逆順にしたいです。下記のプログラムを作ったのですが、どこがいけないのでしょうか? #include "stdafx.h" #include <stdio.h> void reverse (int z[],int w[]); int main(void) { int p[5]={1,2,3,4,5},u[5]; reverse(p,u); printf("逆順=%d\n",p); return 0; } void reverse(int z[],int w[]) { int i; for(i=0;i<=5;i++){ w[i]=z[i-1]; } }

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • プログラミング(ポインタ/文字列処理)を教えて下さい

    プログラミング(ポインタ/文字列処理)を教えて下さい 英単語(最大で15文字まで)を*が現れるまで1つずつ読み込み、読みこんだ英単語の文字数を計算して表示するプログラムです。英単語は文字型配列を使用します。 1、関数の引数及びその中の実行文中で配列を使用 2、関数と引数及びその中の実行文中でポインタ変数を使用する この2つのプログラムを別々に作らなければならないのですが、当方関数をの使い方が今一分らないので以下のプログラムを関数での作成方法を教えて下さい。 これが関数で作らなければいけないプログラムです #include<stdio.h> int main(void) { char mojiretu[15]; int con[15]={0},i,j; printf("課題データ\n"); scanf("%s",mojiretu); while(mojiretu[0]!='*') { for(j=0;mojiretu[j]!='\0'j++) {} con[j-1]++; scanf("%s",mojiretu); } printf("文字数\t出現回数\n") for(i=0;i<=14;i++) printf("%d\t%d\n",i+1,con[i]); } こちらはポインタ変数を用いていますが関数になっていません。 #include<stdio.h> int main(void) { char mojiretu[15],*pmoji int con[15]={0},i,j; pmoji=&mojiretu[0]; printf("課題データ\n"); scanf("%s",mojiretu); while(*pmoji!='*') { for(j=0;*(pmoji+j)!='\0'j++) {} con[j-1]++; scanf("%s",mojiretu); } printf("文字数\t出現回数\n") for(i=0;i<=14;i++) printf("%d\t%d\n",i+1,con[i]); } 2つとも正常に動いてます。どちらか一つでもいいので関数での書き方を詳しくおねがいします。

  • C言語のプログラムについてご指導願えますか?

    ファイルを読み込み、そのなかにI,We,You,He,She,Theyの単語がいくつかるかカウントするプログラムを作成したいのですが、単語のカウントがうまくできません。 下記に作成したソースを記載しますので、間違っている箇所を指摘していただけませんか? #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char filename[FILENAME_MAX]; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; FILE *fp; gets(filename); fp = fopen(filename,"r"); { if(fp==NULL) { printf("ERROR"); return -1; } if(strcmp("I",fp)==0) { j++; } if(strcmp("We",fp)==0) { k++; } if(strcmp("You",fp)==0) { l++; } if(strcmp("He",fp)==0) { m++; } if(strcmp("She",fp)==0) { n++; } if(strcmp("They",fp)==0) { o++; } } printf("I: %d\n",j); printf("We: %d\n",k); printf("You: %d\n",l); printf("He: %d\n",m); printf("She: %d\n",n); printf("They: %d",o); fclose(fp); return 0; }

  • 行列の和のプログラミング

    以下のをCソースを打ち込んでコンパイルすると、 warning: passing arg 1 of `mat_add' from incompatible pointer type warning: passing arg 2 of `mat_add' from incompatible pointer type となります。これは、どういうエラーでどう直せばいいのでしょうか? #include <stdio.h> void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i, j; int ma[2][3] = { {10, -5, 4}, {18, -2, -18} }; int mb[2][3] = { {23, 16, -9}, {-3, 20, 5} }; int mc[2][3] = { 0 }; mat_add(ma, mb, mc); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); }

  • ファイル処理について

    大学の課題なのですが、何度取り組んでもエラーになるため、間違いのご指摘、または正答を教えていただけないでしょうか。 問題は以下のものです。 【問題】 ファイルから整数を読み込み,その値によってfpの読み込み位置をかえ,何度目の読み込みで0を読み込んだかを表示するプログラムを作成せよ. ファイルの内容の例 2,4,0, fpの読み込み位置を変えるにはfseekという関数を利用する. fseekの使い方: 現在の読み取り位置xだけずらすには, fseek(ファイルポインタ, x, SEEK_CUR); と記述する. STEP 1 データを一区切りで読み取る("2,"や"-4,"などの整数とコンマの組) 2 読み取ったデータに応じてfpを移動させる("2,"なら2移動,"-4,"なら-4移動) 3 0を読むまで繰り返す +++++*+++++fseek-exercise.c+++++*+++++ #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // (* ここに解答を書き加える *) while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // (* ここに解答を書き加える *) printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // (* ここに解答を書き加える *) } printf("%d回目です.",count); fclose(fp); return(0); } // 以上になります。 自分で作ったプログラムは以下のようになりました。 #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // fp = fopen(filename,"r"); if(fp == NULL){ printf("cannot open\n"); exit(1); } while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // c = fgetc(fp); printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // if(c > '0' || c< '9'){ i = atoi(&c); count++; if(i == 0){ break; } fseek(fp,i,SEEK_CUR); } } printf("%d回目です.",count); fclose(fp); return(0); } // どこを訂正していいのかわかりません。 どうぞ、よろしくお願いいたします。

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

  • voidについて

    いつもお世話になってます。 最近プログラミングの授業に全然ついていけなくて、1から勉強しようと思ってます。 今回はvoidについて質問なのですが、たとえば下のようなプログラムがあるとします(あえてabcとcdfとxyzを使い分けています。) 数字を入力するとプロトタイプ宣言した関数で足して戻り値が答え(←日本語あってますか?)ってことですよね? 私はvoid関数についてあまり理解できていないので、void関数ではどのように数字が動いているかとどれを一致させなければいけないのかをabcdefxyzを使って詳しく解説していただきたいです。 あと関数の起動の仕方(←日本語あってますか?)も教えていただきたいです。      c=tasu(a,b); printf("%lg\n",c);という方法とか      tasu(a,b); ←これだけとか )   文章ぐだぐだで申し訳ないです。 どなたかおねがいいたします。   ) #include<stdio.h> void tasu(double x, double y, double z); int main(void){ double a,b,c;      printf("1つ目の数字を入力>"); scanf("%lg", &a); printf("2つ目の数字を入力>"); scanf("%lg", &b); c=tasu(a,b); printf("%lg\n",c); return 0; } void tasu(int x, int y, int z) { d = e + f; }

専門家に質問してみよう