- 締切済み
プログラミングの問題です。
下記のプログラムのソースが全くわかりません。 しっかりとした回答お願いします!結構至急なのでよろしくお願いします。 (ア) 身体測定データ保存処理:学籍番号、氏名、身長、体重を表す変数は全て文字列(char[])型とし、これをカンマ区切りで連結し一つの文字列を生成する。これを身体測定データファイル body.txt に追記する。これを、学籍番号L00000が入力されるまで繰り返す。 (イ) 身体測定データ検索処理:身体測定データファイル body.txtを開き、一行ずつ文字列に読み込む。文字列の先頭から最初のカンマが現れるまでの部分文字列が入力された学籍番号と一致するか否かを判定する。一致する場合はファイルから読み取った行をそのまま表示した上でプログラムを終了させ、一致しない場合には次の行を読み込む。これを EOF(ファイル終了)に到達するまで繰り返す。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- TT414
- ベストアンサー率18% (72/384)
>(ア)身体測定データ保存処理:学籍番号、氏名、身長、体重を表す変数は全て文字列(char[])型とし、これをカンマ区切りで連結し一つの文字列を生成する。これを身体測定データファイル body.txt に追記する。これを、学籍番号L00000が入力されるまで繰り返す。 とありますが、各データ間はカンマで区切りはいいとして、人ごとの区切りは何なのでしょうかカンマでいいのでしょうか? >(イ)身体測定データ検索処理:身体測定データファイル body.txtを開き、一行ずつ文字列に読み込む。文字列の先頭から最初のカンマが現れるまでの部分文字列が入力された学籍番号と一致するか否かを判定する。一致する場合はファイルから読み取った行をそのまま表示した上でプログラムを終了させ、一致しない場合には次の行を読み込む。これを EOF(ファイル終了)に到達するまで繰り返す。 一行に一人ずつと決まっているのでしょうか、一行に数人のデータが入っていたり、一人のデータが数行にわたって入っていたりしないのでしょうか? >しっかりとした回答お願いします!結構至急なのでよろしくお願いします。 不可能です、しっかりとした質問をしてください。
- jacta
- ベストアンサー率26% (845/3158)
#4です。 いい加減に作ったのでバグがありました。 せっかくですので、自分で直してください。
- jacta
- ベストアンサー率26% (845/3158)
(ア)だけ作ってみました。 コメント・説明一切なしですので自分で考えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> struct string { size_t length; char data[]; }; struct string *input_field(FILE *stream) { struct string *result = malloc(sizeof(struct string)); if (result == NULL) return NULL; result->length = 0; for (size_t size = 4; !feof(stream); size *= 2) { while (result->length < size) { int c = getc(stream); if (c == EOF || isspace(c)) return result; result->data[result->length++] = c; } struct string *p = realloc(result, sizeof(struct string) + size); if (p == NULL) break; result = p; } free(result); return NULL; } int main(void) { struct string *fields[4] = { NULL }; for (;;) { size_t size = sizeof fields / sizeof fields[0]; for (size_t i = 0; i < sizeof fields / sizeof fields[0]; i++) { fields[i] = input_field(stdin); if (fields[i] == NULL) goto failure; size += fields[i]->length; if (i == 0 && strncmp(fields[i]->data, "L00000", fields[i]->length) == 0) { free(fields[i]); return EXIT_SUCCESS; } } char buffer[size]; char *ptr = buffer; for (size_t i = 0; i < sizeof fields / sizeof fields[0]; i++) ptr += sprintf(ptr, "%.*s,", fields[i]->length, fields[i]->data); ptr[-1] = '\n'; FILE *stream = fopen("body.txt", "a"); if (stream == NULL) goto failure; fwrite(buffer, sizeof(char), size, stream); fclose(stream); for (size_t i = 0; i < sizeof fields / sizeof fields[0]; i++) { free(fields[i]); fields[i] = NULL; } } failure: for (size_t i = 0; i < sizeof fields / sizeof fields; i++) free(fields[i]); fputs("error!\n", stderr); return EXIT_FAILURE; } > 学籍番号、氏名、身長、体重を表す変数は全て文字列(char[])型とし、 とのことなのですが、char[]型が使えるのは構造体の中だけなので、こんな風にしてみました。
- Rilakkuma_san
- ベストアンサー率32% (33/101)
こんにちわ。 学校の宿題かなんかかな? 自分で考えないと後々大変ですよ。 カテゴリがCだから環境はCですかね? 提示できる情報は提示しないいと 有効な回答はあまり期待できませんよ。 (ア) 1.配列となっている身体測定データをString.Joinメソッドを使ってカンマ区切りの文字列にする。 2.IOクラスのStreamWriterを使ってbody.txtに1の文字列を書き出す 3.学籍番号にL00000が入力されていたら処理を終了する (イ) 1.IOクラスのStreamReaderでbody.txtから1行ずつを読み込む 2.String.Splitメソッドでカンマ区切りから配列変数に格納 3.学籍番号にあたる配列のインデックスと検索対象の学籍番号を比較する 4.比較し一致したら書き出し、body.txtを閉じる プログラムの流れはこんな感じになると思います。 あくまで一例です、他にもいろんな方法があります。 「C テキストファイル 読み込み」とかで検索すれば いろいろとヒットすると思います。
- maru_yoshi_
- ベストアンサー率39% (17/43)
仕様が不明確なのでプログラムが作成できません。 プログラム環境は? 学籍番号、氏名、身長、体重の取得方法は? 「学籍番号L00000が入力されるまで繰り返す」とあるので、キーボードから入力するんだろうけど氏名、身長、体重はどうするの? それぞれの文字列長さ、入力可能な文字種類、数値だったら有効数字は(小数点以下何桁まで)? 入力エラー(上記範囲外の入力)に対する処理内容は? 等々 後、プログラム作成を人に頼むには(丸投げするには)一般に仕様、希望納期を明確にして見積依頼することから始めて、報酬は要相談だと思うけど。(報酬:なし、納期:至急を希望ってことかな)
補足
プログラム環境はC言語を扱い、 学籍番号、氏名、身長、体重に関しては(ア)で適当に 学籍番号L10035、氏名hanaoka taro、身長180、体重66といったようなデータを3人分くらい body.txtに作成し、最後にL00000を入力してからbreakといった形でプログラムを作成するような感じです。 それと(ア)のプログラムで作成したbody.txtのデータを使用して(イ)のプログラムを作成するような形になります。 基本的に身長や体重の入力の範囲は制限なしとしてもらって大丈夫です。 情報がなさすぎて大変失礼いたしました!! 時間が残されていないためかなり焦っているので 至急でお願い致します。
- Tacosan
- ベストアンサー率23% (3656/15482)
「ソースが」分からないということは, フローは完全にわかっていると思っていいんだね? じゃあそれを書きだしてみて.
補足
申し訳ありません、ソースもフローもわからないくらい 手探り状態な感じです。 僕自身も先程の文章をそのまま問題としていただいたので どこからどう手に付けていいものやら…って感じです。 PAD図の作成すらも手につかないような状態です。 大変恐縮なのですが、できる限りでよろしいんでお力添えを頂けたらと思います。
お礼
非常参考になりました!ありがとうございます。 かなり急ぎであったために提示する情報量の少なさ、ご了承ください。 21日の16時までが提出期限なのでそれまでにわからないことがあれば 時間に余裕があるときで大丈夫なんでお力添えもらえたらと思います。