C言語でプログラムを作成する方法

このQ&Aのポイント
  • C言語を使用してプログラムを作成する方法について説明します。
  • 入力ファイルから1レコードを入力し、不要なデータを除去して出力ファイルに保存する処理を行います。
  • エラーが発生した場合にはエラーの表示を行います。
回答を見る
  • ベストアンサー

C言語でプログラムを作成しなさい!といわれたんですが...

◎プログラム仕様 C言語を使用 入力ファイルから1レコードを入力する。改行マークまで入力する。 2番目の「:」以前のデータを有効とする。 2番目の「:」からは、不要です。 出力ファイルへ出力する。 この処理を最終レコードまで行う。 処理の例 yoneko:ksgtgsmbnisysbnka:sjkmakshs7s:sksksk99jjs: 入力データ yoneko:ksgtgsmbnisysbnka                出力データ 入力ファイル名・出力ファイル名は、任意に指定できるものとする。 入力ファイルの1レコード当たりの最大バイト数は、100バイトします。 それぞれの処理でエラーが発生した場合は、エラーの表示を行う。 を依頼されました。 まったく意味が分りません。 わかりやすく説明していたでけないでしょうか。 C言語、自体わかりません。

noname#1264
noname#1264

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.7

みっともない英文を書いたので、そのお詫びがてら、コメントを。 #include <string.h> #include <stdio.h> int main() {   char buf[1024];  /* 大き目に読込バッファをとっておく */   buf[101] = -99;  /* 超えてはいけないところに、ASCII文字以外のコードを埋めておく(番人) */   while (gets(buf)) /* 標準入力から一行読み込んで EOF かエラーを返すまで */   {     char* p;     if (buf[101] != -99) /* 番人として埋めたコードが置き換わっていたら、1レコードの制限を越えたと判断 */     {       fprintf(stderr, "input record maybe exceeds the limits (100 bytes).\n");       exit(1);     }     if (p = strchr(buf, ':'))  /* 最初に出てくる ':' の位置を p に入れる */     {       p = strchr(p + 1, ':'); /* 最初の ':' の次の位置から ':' を(つまり二個目)探す */       if (p)      /* 二個目の ':' があれば */         *p = '\0';  /* そこを文字列の終端にする */       /* 二個目の ':' が無ければ、入力レコードはそのまま */     }     /* 一個目の ':' が無ければ、入力レコードはそのまま */     puts(buf);       /* 二個目の ':' 以降をちょん切った文字列を標準出力に書き込み */     if (ferror(stdout))  /* 一応、書き込みエラーのチェック */     {       fprintf(stderr, "write error\n");       exit(1);     }   }   if (ferror(stdin))  /* 一応、gets() のエラーチェック */   {     fprintf(stderr, "read error\n");     exit(1);   }   return 0; } 後、マニュアルを読めば分かることですが、strchr() は、一つ目の引数で 示される位置から、二つ目の引数で示される文字を探す関数です。 もし、文字が見つかればその位置を、見つからなければ NULL を返します。 省略した書き方をしていますが、   if (p = strchr(buf, ':')) は、   if ((p = strchr(buf, ':')) != NULL) もっと(他の言語を知っているとして)わかりやすく書けば   char* pos;   pos = p = strchr(buf, ':');   if (pos != NULL) です。 後、いんちき英語についても弁解をしておこう。 「日本語の方がわかりやすい」ということについては、ametsuchi さんの いう通り。 ただ、いんちきでも良いから、なるべく英語を近くにおいておく習慣を つけておいた方が良いです。 日本語が表示できない環境はほとんど無いと言っても良いが、日本語を 入力できない環境はままあったりするし、なにしろ最新の情報は、まず 英語圏から発信されることが多い。 また、日本語のマニュアルの意味が良く分からないなあ、と思ったら、 テクニカルタームを良く知らない人が和訳をしているだけで、英語の マニュアルでは意味が一目瞭然だったり。 なるべく書くようにしておけば、間違っていても、指摘をしてくれる人も 居るわけで (^^;

noname#1264
質問者

お礼

コメントありがとうございます。 標準入出力とリダイレクトについて勉強中です。

その他の回答 (6)

  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.6

a-kumaさんの回答素晴らしいのだけれど、英文のメッセージおかしくないですか? 私の英語力もメチャひどいのだけれど... 1)Excess:名詞です。ここに名詞がくるのはおかしいのでは?動詞であるExceeds(3人称単数、現在)、またはExceed?因みに昔読んだ米国人の書いたソースコード(=Fortran)では「Exceeds the limit」というような表現だったと思う。 2)byte--->bytes?(複数形) 私もFortran時代は、無理してインチキ英語でコメントやらメッセージを書いていたが、最近は日本語。日本人が読むのであればそれが一番です。書く方も楽。 madaraさんにも、それをオススメします。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

「答えて」系のサイトに書き込むのだから、他の方のように 質問者の背景や質問の理由は敢えて問いません。 素直じゃないところが何ヶ所かあるので、学校の課題だと 突っ込まれるところがあるかも。せめて、マニュアル程度を 引いて、意味を調べておくことをすすめます。 もし、仕事なら、それが研修の課題であろうと、実務であろ うと、意味が分かってないと、将来苦労するでしょうから やっぱり、少しは調べておいた方が良いでしょうね。 #include <string.h> #include <stdio.h> int main() {   char buf[1024];   buf[101] = -99;   while (gets(buf))   {     char* p;     if (buf[101] != -99)     {       fprintf(stderr, "input record maybe excess 100 byte.\n");       exit(1);     }     if (p = strchr(buf, ':'))     {       p = strchr(p + 1, ':');       if (p)         *p = '\0';     }     puts(buf);     if (ferror(stdout))     {       fprintf(stderr, "write error\n");       exit(1);     }   }   if (ferror(stdin))   {     fprintf(stderr, "read error\n");     exit(1);   }   return 0; } ファイルの指定は、標準入出力を使っているので、リダイレクト で指定してね。 # 「わかりやすく説明」という意味では、落第点の回答ですね

noname#1264
質問者

お礼

回答してくださってありがとうございます。 このプログラムがどういう意味なのかが分らないので a-kumaさんのすばらしさがわからないのが残念です。 ただいま少しずつ勉強中です。

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.4

皆さんも言っておられるとおり仕事で来ているなら変ですね。断るしかないでしょう。 実際のところ、学校の課題かなにかように見えるのですが・・・ 答え自体は簡単ですが、勉強している人ならなおの事、お答えしかねます。(つめたいようですが・・・)

  • korei
  • ベストアンサー率30% (22/72)
回答No.3

こんにちは。 依頼された・・ということは、お仕事なのですか? C言語が解らなくて、このプログラム仕様がまったく意味がわからないのであれば、 無理でしょう。 説明しても、理解はできないのではないでしょうか? もし、ここでコーディング例を書いて、それでお仕事をこなしたとしても、 お仕事であればメンテナンスも発生してくるでしょうし。。 理解できていないとメンテもできませんよね? どういう経緯で依頼がきたのか解りませんが・・。 他の言語でプログラミングはできますか? それともプログラミング自体がわからない?? madaraさんの知識の範囲がわかりませんので、なんとも・・・。

noname#5824
noname#5824
回答No.2

C言語がわからないと、さっぱりだと思いますよ。 多分、基礎知識がないとどんな説明をしても 出来ないと思います。 何故こんな仕事が来たのかも疑問ですし。 これはもともとプログラマがするようなことですし。 (それほど難しくないけど) ファイル入出力があるので、 ド素人では不可能です。

  • rally
  • ベストアンサー率28% (32/111)
回答No.1

C言語がまったくわからない人に、何故こういう依頼が来たのでしょうか? まずはここが疑問です。仕事ならなおさらです。 これくらいのプログラムなら、わかる人には30分もあれば作れると 思うのですが、これが仕事ならお金をもらわないと割りが合いません。 C言語をまったくわからない人に、わかりやすく説明するのは難しいと思います。 ちなみにどういう言語はOKなんですか?

関連するQ&A

  • Solaris上のC言語でCRLFのファイル作成は

    こんばんは。 Solarisの環境下で、 ファイルをオープン&編集&別ファイルを作成する処理において、 改行コードをCRLFにしたいと考えています。 プログラムはC言語で作成されています。 生成後のファイルは、文字コード:EUC、改行コード:LFで作成されています。 今回は、文字コード:SJIS、改行コード:CRLFで作成したいです。 現在、「\n」で、改行コードをLFとして作成しているようです。 この改行コードをCRLFにしたい、という意味です。 ファイルレコードの行末に「\n」を入れている処理の個所を、 「\r\n」に変更すれば、CRLFになるのでしょうか? プログラミング言語の仕様というよりは、 その実行モジュールが、どこのOS上で動くかに左右されるような気もしているのですが、どうでしょうか? よろしくお願いします。

  • C言語でヒストグラムを作成するプログラムを作りたいのですが

    C言語でヒストグラムを作成するプログラムを書いたのですが、正しい濃度値が出力されずに困っています。 ヘッダなしの2バイト画像データを読み込みヒストグラムを書き出すプログラムです。 gccを使っています。 よろしくお願いします。

  • C言語での改行コードの扱いについて教えてください。

    改行コードは一般的に、 Windows・・・「CR+LF」 UNIX or Linux・・・「LF」 だと思うのですが、改行コードが「LF」のファイルをWindows上で、C言語で編集したらどういった改行コードになるのでしょうか。 (例えば、単純にファイルを1レコードずつ読み込んで別ファイルに書き込むといった処理) 出力時に「CR+LF」になってくるのでしょうか?それともまったく別のものになってしまうのでしょうか? 詳しい方、ぜひ教えてください。 ※改行コード「LF」のテキストファイルは、UNIXサーバから「HULFT」というファイル転送ソフトの「バイナリ転送モード」でWindowsサーバに送られてくる予定です。

  • C言語プログラム

    C言語プログラム ある数を入力して、入力された数を一辺とする図形を描くプログラムを作りたいんです。 分かりやすくすると、 入力された数が5だった時、画面には ***** ***** ***** ***** ***** ↑こう出力させたいんです。 四角だけじゃなくて、 * ** *** **** ***** ↑こういう三角とか、逆三角とか、 *        * **     *** ***  ***** **     *** *        * こんなかんじでいろんな形を描けるようにしたいんです。 C言語で、for文の二重ループを使うようにとのことなんですが、 どうすればいいでしょうか。 こういうのってズルですけど、何かヒントでも貰えればと思っています...。

  • アセンブリ言語とC言語について。

    以下のURLで、 https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al … No.14のC 言語の write の仕様そのもので、第一引数はファイルディスクリプタですね。 (ファイルディスクリプタについては御自身で調べてみてください) 固定値として定義されているのは、標準ストリーム ファイルの  0 … 標準入力 (write では使われない)  1 … 標準出力  2 … 標準エラー出力 です。(3 以降は各プロセスでオープンされたファイルやソケットやデバイスを 指しており、固定値ではなくプロセス毎に異なる値となります。) 括弧の所がよくわかりません。教えていただけると幸いです。すみません。

  • C言語のプログラミング問題(難解)について

    C言語のプログラミング問題(難解)について教えてください! C言語の勉強し始めましたが次の問題のプログラミングが分かりません 分かる方がいましたらよろしくお願いします。 以下の問題です。 次の作業を実現するためのプログラミングを描け。 機能名:リストファイルの分割処理 ■概要:部門1、部門2の商品が混合して書かれたファイルがある。 部門毎に分けたファイルを新たに作成する。 ■条件 (1)ファイルを1行ずつ読み込み、ポインタで受け取り関数で渡すこと。 (2)出力ファイルの最終行には各部門の品種数を入力すること (3)出力ファイルは固定長とし、空きが出る場合は半角スペースでレコード長を合わせること。 (4)エラー発生時にはエラーメッセージを表示し、終了すること。 ■ファイルレイアウト(入力ファイル) レコード長:26(固定長) 長さ 項目名 1 |部門コード1 1 |(区切り文字カンマ) 6 |商品名1 1 |(区切り文字カンマ) 1 |部門コード2 1 |(区切り文字カンマ) 6 |商品名2 1 | (区切り文字カンマ) 1 |部門コード゛3 1 |(区切り文字カンマ) 6 | 商品名3 ■ファイルレイアウト(出力ファイル) レコード長:20(固定長) 長さ | 項目名 6 |商品名1 1 ||(区切り文字カンマ) 6 |商品名2 1 ||(区切り文字カンマ) 6 |商品名3 (1)入力ファイル(LIST_INPUT.txt) 1,菓子A,1,菓子B,1,菓子C 2,野菜A,2,野菜B,2,野菜C 1,菓子D,1,菓子E,2,野菜D 1,菓子F,1,菓子G,2,野菜E 1,菓子H,2,野菜F,1,菓子I 1,菓子J,1,菓子K,2,野菜G (2)出力ファイル1(菓子)(LIST1.txt) 菓子A,菓子B,菓子C 菓子D,菓子E,菓子F, 菓子G,菓子H,菓子I 菓子J,菓子K 11 (3)出力ファイル2(LIST2,txt) 野菜A,野菜B,野菜C 野菜D,野菜E,野菜F 野菜G 7 *出力ファイルの最終行に品種数を追加すること。 よろしくお願い致しますm(__)m

  • C言語につて、教えてください!!

    C言語について教えてください テキストファイル CD_DATA|45 DVD_DATA|601 MD_DATA|24 メイン関数と読み込み関数で、テキストファイルの'|'より後ろを構造体に書き込み エラー処理でテキストファイルに'|'が無い時エラーメッセージをだす。 テキストファイルの中の行数が違った時エラーメッセージをだす。 以上です、教えてくださいお願いします。

  • C言語でファイルの入出力

    C言語についての質問です。 統計学のシュミレータを作っていまして 大量の数値データ(1000程度)のデータを入力する必要があるのですが scanfなどで入力要求するには、数に無理がありますので 外部テキストファイルからプログラムに読み込みたいのですが 方法が分かりません。 希望としては、まずテキストファイルに 1000個の数値データを入力しておいて (数値データのみをコンマとか改行で区切ったものをあらかじめ作成しておく) それを1000個の配列 int data[1000]に 順番にインポートできるようにしたいです。 データ数は1000個で固定、すべてint型でOKです。 数値として処理したいので 文字列としてインポートしてしまうのはダメです。 あくまでint型の数値として考えてください。 回答よろしくお願いします。

  • C言語配列

    c言語初心者ですよろしくお願いします。 ファイルから読み込んだ100万件のデータをstaticを使わずに配列に格納したいのですが。 どういった方法があるでしょうか? 私のpcでは変数名[10000]くらいがエラーのでない限界みたいです。

  • c言語に関する質問です

    こんにちは。 私はとある大学の機械工学科の学生です。 先日プログラミングの授業で課題が出されたのですが、さっぱりわかりません。 目的を達成するために、下のプログラム(使ってるものはC++)の間違いを2か所訂正しなさいというものです。 どこをどう直せばいいのか教えてください。 一番左の数字は、ここで指摘しやすくするための行数です。 1 #include <stdio.h> 2 #include <stdlio.h> 3 // 計算処理をするための関数 4 void operation(FILE* ifp,FILE* ofp) 5 { 6 const int LOOPLIMIT = 10000; //ループ最大回数を規定。エラー対策 7 8 if((ifp==NULL)||(ofp==NULL)){//ファイルポインタのエラー処理 9      fprintf(stderr,"[ERROR]null file poimter detected.\n); 10      exit(-1); 11     } 12 13 for(int i=0;i<LOOPLIMIT;i++){//入力ファイルは1万行までサポート 14 if(fscanf(ifp,"%f%f",&a,&b) == EOF) //入力ファイルから数値2個読み込み 15 break;//読み込めなかったら処理を終了 16 float c = a*b; 17 fprintf(ofp,"%g,%g,%g\n",a,b,c); 18   } 19} 20 // メイン関数 21 int main(int argc,char* argv[]) 22 { 23 FILE* ifp = NULL; //入力用ファイルポインタ 24 FILE* ofp = NULL; //出力用ファイルポインタ 25 char* ifile = NULL; //入力ファイル名 26 char* ofile = NULL; //出力ファイル名 27 28 if(argc!=3){ 29 fprintf(stderr,"Usage:%s inputfile outputfile\n,argv[0]); 30 exit(1); 31 } 32 33 ifile = argv[1]; //パラメータの1番目を入力ファイル名 34 ofile = argv[2]; //パラメータの2番目を出力ファイル名 35 36 if((ifp = fopen(ifile,"rt"))==NULL{ //入力ファイルを開く 37 fprintf(stderr,"Can't open file %s\a\n",ifile); //開けなかったら終了 38 exit(2); 39 } 40 if((ifp = fopen(ofile,"wt"))==NULL{ //出力ファイルを開く 41 fprintf(stderr,"Can't open file %s\a\n",ofile); //開けなかったら終了 42 exit(3); 43 } 44 45 operation(ifp,ofp); 46 47 fclose(ofp); 48 fclose(ifp); 49 return(0); 50 } 入力ファイル例(inputdata.txt) 147 0.369 258 0.147 369 0.258 ファイル出力結果の例(outputdata.csv) 147, 0.369, 54.243 258, 0.147, 37.926 369, 0.258, 95.202 画面出力結果の例 147 x 0.369 = 54.243 258 x 0.147 = 37.926 369 x 0.258 = 95.202 ご面倒かもしれませんが、お願いいたします。

専門家に質問してみよう