初めまして。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Mr.Red

初めまして。

#1

投稿記事 by Mr.Red » 8年前

皆さん、初めまして。プログラミングが好きなMr.Redと申します。
まだ、入ったばかりですがよろしくお願いします。

早速ですが、助けてほしいことがあります。
128名分が記憶可能になるような構造体の配列のプログラムを作成しているのですがうまくいきません。
申し訳ありませんが、教えてください。
後、データを身長の高い順に出力するようなプログラム(上記に述べたプログラムの変更版)も教えてください。

※名前と身長と血液型を0、0、0(三つとも全て)と入力すると終了する。
または、一つの構造体の各メンバの値を表示する関数を作成すること。


以下は、私が書いたソースコードです。
#include <stdio.h>
#include <string.h>
#define N (64)
#define BUFFER_SIZE (128)
struct data//一つの構造体の各メンバの値を表示する関数
{
 char name[N];
 float height;
 char bloodType[N];
};
int main(void)//main関数
{
 struct data p;
 int n;
 char buf[BUFFER_SIZE];
 for(n=1; n<=BUFFER_SIZE; n++)
 {
  printf("%d人目のデータ", n);
  fgets(p.name, BUFFER_SIZE, stdin);
  if(p.name == 0 && p.height == 0 && p.bloodType == 0)
  {
   break;
  }
 }
 printf("名前 身長 血液型\n");
 printf("%s \n", p.name);
 printf("%f \n", p.height);
 printf("%s \n", p.bloodType);
 return 0;
}


出力結果は以下のような感じです。
名前   身長   血液型
A君    150.5   AB
B様    159.4   O

nil
記事: 428
登録日時: 8年前

Re: 初めまして。

#2

投稿記事 by nil » 8年前

コードタグをお使いください。
詳しい使い方はこちらを見てください。

気になった点がいくつかあったのですが、
char buf[BUFFER_SIZE]は何のために定義したのですか?
fgetsの第二引数はNではなくBUFFER_SIZEなのですね?

まず、構造体配列を作らなくてはなりません。
次に、fgetsではなくscanfを使ったほうがいいです。
あと、仮に0と入力があったとしてもp.nameに代入されるのは文字列"0"であり数値0ではありません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初めまして。

#3

投稿記事 by softya(ソフト屋) » 8年前

フォーラムルールをご確認下さい。マルチポストの場合は、相互リンクをお願いしております。
http://dixq.net/board/board.html

「プログラミングを学んでいる大学生です。 128名分が記憶可能になるような構造体の... - Yahoo!知恵袋」
http://detail.chiebukuro.yahoo.co.jp/qa ... r=pofee_pc

あと課題っぽいですが正直にお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Mr.Red

Re: 初めまして。

#4

投稿記事 by Mr.Red » 8年前

>>涼雅さん。
わかりました。次からは質問するときにコードタグは使います。
defineのNは構造体の名前と血液型の制限時数を定義していて、BUFFER_SIZEは128名分を定義してます。
あと、fgets()を入力するときに、BUFFER_SIZEではなくNであることに気が付きました。

>>ソフト屋さん。
はい、学校に提出しなければいけない課題です。
正確に言います。
問題は「128名分が記憶可能になるような構造体の配列のプログラム」について、上記のソースコードを入力したのですが出力結果(※)のようになることができません。
何回も何回も訂正をしたのですが、原因を突き止めることはできませんでした。

出力結果(※)がならない原因。
fgets()で各人の名前、身長、血液型のデータを1行で入力の仕方。
各データを身長の高い順に出力するようになる変更の仕方。
if文で名前と身長と血液型を0、0、0(三つとも全てゼロ)と入力すると終了させるタイミング。

以上の四つを教えてください。
本当におねがいします。

※出力結果
名前   身長   血液型
A君    150.5   AB
B様    159.4   O

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初めまして。

#5

投稿記事 by softya(ソフト屋) » 8年前

申し訳ないですがフォーラムルールを守って頂かないと回答できませんので、よろしくおねがいします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ookami
記事: 214
登録日時: 9年前
住所: 東京都

Re: 初めまして。

#6

投稿記事 by ookami » 8年前

こんにちは、ookamiです。
Mr.RedさんのC言語への理解度を知りたいので、
上記のmain関数の各行に、その行で何をしているか、書いてみてくれませんか?

最初の2行は書いてみました。

コード:

int main(void)//main関数
{
 struct data p;                      // data型のpを定義
 int n;                              // int型のnを定義
 char buf[BUFFER_SIZE];              // :   こんな感じで、すべての行にコメントを追加してください。
 for(n=1; n<=BUFFER_SIZE; n++)
 {
  printf("%d人目のデータ", n);
  fgets(p.name, BUFFER_SIZE, stdin);
  if(p.name == 0 && p.height == 0 && p.bloodType == 0)
  {
   break;
  }
 }
 printf("名前 身長 血液型\n");
 printf("%s \n", p.name);
 printf("%f \n", p.height);
 printf("%s \n", p.bloodType);
 return 0;
}

Mr.Red

Re: 初めまして。

#7

投稿記事 by Mr.Red » 8年前

ソフト屋さん>>
返信が遅くなってすいません。
わかりました、以後は気を付けます。

ookamiさん>>
私のC言語への理解度は、初心者並程度(printf,ifなど基礎は一応知っている)です。
以下のmain関数の各行には、構造体のデータを入力する装置のような感じです。

コード:

int main(void)  //main関数
{
 struct data p;
 int n;       //nは人数(最大128人)分とする
 char buf[BUFFER_SIZE];  //メモリ領域の用意

 for(n=1; n<=BUFFER_SIZE; n++)
 {
  printf("%d人目のデータ", n);
  fgets(p.name, BUFFER_SIZE, stdin);
  if(p.name == 0 && p.height == 0 && p.bloodType == 0)
  {
   break;
  }
 }

 printf("名前 身長 血液型\n");
 printf("%s \n", p.name);
 printf("%f \n", p.height);
 printf("%s \n", p.bloodType);
 return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初めまして。

#8

投稿記事 by softya(ソフト屋) » 8年前

Mr.Red さんが書きました:ソフト屋さん>>
返信が遅くなってすいません。
わかりました、以後は気を付けます。
補足などを使って相互リンクを直ちに行なって下さい。
実際に実行して頂かないと意味がありません。

【補足】
相互リンクの意味がわからなければ質問して下さい。
それはookamiさんへの返答でも同様です。聞かれていることと回答がずれていますので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 8年前

Re: 初めまして。

#9

投稿記事 by nil » 8年前

Mr.Red さんが書きました: defineのNは構造体の名前と血液型の制限時数を定義していて、BUFFER_SIZEは128名分を定義してます。
尋ねたのはNとBUFFER_SIZEのことではなく、
char buf[ BUFFER_SIZE ]をなぜ定義したのか、です。
みたところプログラム内でbufは使用されていませんよね?
Mr.Red さんが書きました: あと、fgets()を入力するときに、BUFFER_SIZEではなくNであることに気が付きました。
変更は見られないようですが……

次に
0,'0',"0"のそれぞれの違いを述べられますか?

あと、構造体配列について理解はありますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初めまして。

#10

投稿記事 by softya(ソフト屋) » 8年前

みなさんにお願いします。
フォーラルルールの違反となりますので、回答をお待ち頂けると助かります。

Mr.Redさんへ。
相互リンクもですが知恵袋の回答者にも失礼のないように放置しないで下さいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Mr.Red

Re: 初めまして。

#11

投稿記事 by Mr.Red » 8年前

ソフト屋さん>>
今更ですいませんが。知恵袋の回答者については私と同一人物です。
あと、相互リンクはわかりません。

涼雅さん>>
なぜchar buf[ BUFFER_SIZE ]をなぜ定義したのは、fgets()を入力するときに必須だと思ったからです。
0,'0',"0"のそれぞれの違いは、0はただの数字、'0'はNULL文字の一種、"0"は端末に表示されるだけの文字です。
構造体配列については、まだ習い始めたばかりなので理解はあんまりありません(ゼロというわけではありません)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初めまして。

#12

投稿記事 by softya(ソフト屋) » 8年前

Mr.Red さんが書きました:ソフト屋さん>>
今更ですいませんが。知恵袋の回答者については私と同一人物です。
あと、相互リンクはわかりません。
相互リンクは同じ質問を多数に掲示板にしている場合、その掲示板の利用者が他の掲示板でも同じ質問をしていることを分かることが出来るようにするためリンクを貼ることを言います。これで回答者の無駄骨を防ぐって意図になりますね。
補足を使って、次のような感じで行なって下さい。

私はこの質問を他の掲示板でもさせて頂いています。
質問しているのは下記の掲示板です。
http://dixq.net/forum/viewtopic.php?f=3&t=11008
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: 初めまして。

#13

投稿記事 by へにっくす » 8年前

Mr.Red さんが書きました:あと、相互リンクはわかりません。
互いにリンクすること。検索すればすぐ分かるはずですけど、、
だから、知恵袋の方にも、ここのリンクをはることです(補足で書けばいいでしょう)。

なぜ貼るかといえば、もう解決してるのに一方ではまだ質問受け付けとなるのを避けるためです。
こういうのは回答者に対する礼儀として身につけるべきです。
written by へにっくす

アバター
ookami
記事: 214
登録日時: 9年前
住所: 東京都

Re: 初めまして。

#14

投稿記事 by ookami » 8年前

# Mr.Redさん
ちょっと私の聞き方があいまいだったかもしれませんね。
1行ごとの役割を書いてほしかったのです。

言い方を変えると...
下の ○○○○○○○○ を埋めてください。

コード:

int main(void)//main関数
{
 struct data p;
 int n;       //nは人数(最大128人)分とする
 char buf[BUFFER_SIZE];  //メモリ領域の用意
 for(n=1; n<=BUFFER_SIZE; n++)        // ○○○○○○○○
 {
  printf("%d人目のデータ", n);        // ○○○○○○○○
  fgets(p.name, BUFFER_SIZE, stdin);        // ○○○○○○○○
  if(p.name == 0 && p.height == 0 && p.bloodType == 0)        // ○○○○○○○○
  {
   break;
  }
 }
 printf("名前 身長 血液型\n");        // ○○○○○○○○
 printf("%s \n", p.name);        // ○○○○○○○○
 printf("%f \n", p.height);        // ○○○○○○○○
 printf("%s \n", p.bloodType);        // ○○○○○○○○
 return 0;
}
> 以下のmain関数の各行には、構造体のデータを入力する装置のような感じです。

これは、半分正解です。入力だけでなく出力もありますね。

---

ステップ実行は知っていますか?
F10キーでプログラムを開始すると、
F10キーを押すごとに1行ずつプログラムを進めることができます。
その時、変数などにマウスを当てると、変数の内容を見たりすることができます。
活用してみてください。

---

【追記】
#Softyaさん
> フォーラルルールの違反となりますので、回答をお待ち頂けると助かります。
→すみません、マルチポストの件ですね。認識しました。
# Mr.Redさん
相互リンクの対応をしてからお返事をお願いします。

M.Red

Re: 初めまして。

#15

投稿記事 by M.Red » 8年前

Mr.Red さんが書きました:
softya(ソフト屋) さんが書きました: 相互リンクは同じ質問を多数に掲示板にしている場合、その掲示板の利用者が他の掲示板でも同じ質問をしていることを分かることが出来るようにするためリンクを貼ることを言います。これで回答者の無駄骨を防ぐって意図になりますね。
補足を使って、次のような感じで行なって下さい。
返事が遅くなって本当にごめんなさい。
相互リンクについてありがとうございました。
では、やってみます。
http://detail.chiebukuro.yahoo.co.jp/qa ... r=pofee_pc
ookamiさん、わかりました。

コード:

int main(void)//main関数
{
 struct data p;
 int n;       //nは人数(最大128人)分とする
 char buf[BUFFER_SIZE];  //メモリ領域の用意
 for(n=1; n<=BUFFER_SIZE; n++)        // ループで各個人のデータを表示
 {
  printf("%d人目のデータ", n);        // 個人のデータ
  fgets(p.name, BUFFER_SIZE, stdin);        // 入力処理
  if(p.name == 0 && p.height == 0 && p.bloodType == 0)        // 0 0 0と入力した場合
  {
   break;
  }
 }
 printf("名前 身長 血液型\n");        // 名前と身長と血液型の表示
 printf("%s \n", p.name);        // 名前
 printf("%f \n", p.height);        // 身長
 printf("%s \n", p.bloodType);        // 血液型
 return 0;
}
一応書きました。

実は今日、この一番上記の問題について自分で考えて解決できました。
涼雅さん、ookamiさん、ソフト屋さん、へにっくすさん、本当にありがとうございます。
うれしいです。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: 初めまして。

#16

投稿記事 by へにっくす » 8年前

http://detail.chiebukuro.yahoo.co.jp/qa ... r=pofee_pc
んー?
補足じゃなくてレスでリンクされてますな。

IDが別ですけど…
Mr.Red さんが書きました:ソフト屋さん>>
今更ですいませんが。知恵袋の回答者については私と同一人物です。
他の人から見たら分かりませんよ。

※書きなおしました。
最後に編集したユーザー へにっくす on 2012年7月12日(木) 21:18 [ 編集 2 回目 ]
written by へにっくす

アバター
asd
記事: 318
登録日時: 9年前

Re: 初めまして。

#17

投稿記事 by asd » 8年前

M.Red さんが書きました: 実は今日、この一番上記の問題について自分で考えて解決できました。
涼雅さん、ookamiさん、ソフト屋さん、へにっくすさん、本当にありがとうございます。
うれしいです。
で、Yahoo!知恵袋はそのまま放置なんですか?
そういうことをやるとマルチポストが嫌われることになります。

きちんと解決方法を知恵袋のほうにも投稿して解決処理を行ってください。
知恵袋の回答者の方をないがしろにするような行為は避けてくださいね。
Advanced Supporting Developer
無理やりこじつけ(ぉ

ISLe
記事: 2648
登録日時: 9年前
連絡を取る:

Re: 初めまして。

#18

投稿記事 by ISLe » 8年前

スレ違いで申し訳ないですが、ちかごろ気になっていたので。
へにっくす さんが書きました:すべて同一人物なんだー
へにっくす さんが書きました:へーへーへーへーへーへーへーへー
こういった言葉遣いはフォーラムルールに違反している気がします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 初めまして。

#19

投稿記事 by softya(ソフト屋) » 8年前

ISLe さんが書きました:スレ違いで申し訳ないですが、ちかごろ気になっていたので。
へにっくす さんが書きました:すべて同一人物なんだー
へにっくす さんが書きました:へーへーへーへーへーへーへーへー
こういった言葉遣いはフォーラムルールに違反している気がします。
一応ご本人にプライベートメッセージしてあるんですが、まだ見てもらっていません。
ご本人に直していただきたいと思っております。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 8年前

Re: 初めまして。

#20

投稿記事 by nil » 8年前

Mr.Redさん、フォーラムルールに
ソースコードや解決した方法を明記して下さい
とある通り、
解決した方法を書きこんでください。

あと今更ですが、
0, '0', "0"の違いですが、
0は数値、というのはあってます。
'0'はchar型の文字としての0であり、ヌル文字は'\0'です。(ちなみに'\0'は数値では0x00つまり0、'0'はASCIIコードでは0x30=48で異なります。)
また、"0"は端末に表示されるだけの文字、では少し説明不足です。
コンピューターの中身はすべて0と1の集合であり、数値も文字も結局は数字として表すことができます。
つまり、"ただの"文字、というのは存在しないわけです。
"0"はchar型配列{ '0', '\0' }です。
(上の話には厳密に言うとぜんぜん間違っていることが含まれているかもしれません)

最後に、マルチポストは相互リンクであるので、他の方のおっしゃっているとおり、yahooにもリンクを張り、更に解決した旨を書きこんでください。
オフトピック
char型配列nameと0って0で比較できましたっけ?
あのままのコードだとエラーが発生する気がするんですが……

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 初めまして。

#21

投稿記事 by Dixq (管理人) » 8年前

> こういった言葉遣いはフォーラムルールに違反している気がします。

そうですね、固いことをルールとして決めたくはないのですが、
すごく仲の良い間柄であるか、一般的に明らかに良い冗談であるような言い回し等を除いて、会話は一般的に丁寧な言葉づかいで行って頂きたいと思っています。

ISLe
記事: 2648
登録日時: 9年前
連絡を取る:

Re: 初めまして。

#22

投稿記事 by ISLe » 8年前

涼雅 さんが書きました:
オフトピック
char型配列nameと0って0で比較できましたっけ?
あのままのコードだとエラーが発生する気がするんですが……
この場合の配列名は配列の先頭要素へのポインタです。
ポインタと比較するとき、0はヌルポインタと解釈されます。
条件式として真になることはありませんが、文法上はエラーではありません。

アバター
asd
記事: 318
登録日時: 9年前

Re: 初めまして。

#23

投稿記事 by asd » 8年前

知恵袋のレスでここへのリンクを提示したのは私です。
結局質問者の方は知恵袋のほうはそのまま放置、どう解決したかわからない状態になっちゃいましたね。
M.Red さんが書きました: 返事が遅くなって本当にごめんなさい。
相互リンクについてありがとうございました。
では、やってみます。
この返事はなんだったんでしょうか。非常に残念です。
オフトピック
過去に解決してもいないのに「解決しました」とだけレスをつけ、解決法がないことを見かねた回答者の方から
回答を引き出すというテクニックを披露した方がいたので、解決例を投稿する気は起きないですね(--;)
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

“C言語何でも質問掲示板” へ戻る