ページ 1 / 1
C言語の考え方がわかりません。
Posted: 2013年1月22日(火) 05:52
by resettt
C言語3級までは持ってますが、それまでで、授業でやっているポインタや構造体の記述が全くわかりません。
プログラムを見ても何をしたいのかがわからないので、ちょっとずつこれは何をしているの?とか、噛み砕く質問をしてくれたらなんとかわかる程度です。
表示したい問題は下記のURLです。
http://gyazo.com/63c316e91268bdf782fb17c4aa5fffe0
ヒントのコードは下記の通りです。
コード:
/*C言語 構造体ポインタ 応用1*/
/*構造体作成 2分木・表示(降順)*/
#include<stdio.h>
#include<stdlib.h>
struct student{
char name[64];
int age;
float height;
float weight;
struct student *lower;
struct student *upper;
};
void displaydata( struct student *root);
main()
{
struct student *top,*ima,*tansaku;
FILE*sintyo;
sintyo=fopnen("身長.dat","r");
/*ファイルを読んでデータ格納 ポインタでつなぐ*/
for(i=0; ;i++){
このあと何をどうすればいいのかわからない状態です。
考え方のヒントをください。
Re: C言語の考え方がわかりません。
Posted: 2013年1月22日(火) 07:10
by beatle
問題は2分木の課題のようですね。
2分木については理解なさっているのでしょうか。
学習の手順は以下が良いと思います。
- まずC言語とは関係なく、2分木自体について学習する
(完全2分木って何?2分木に値を挿入するやり方は?など)
- 2分木をC言語で実装する
プログラムの学習には試行錯誤が大事です。まずはプログラムをコンパイル可能になるまで修正します。
それからだんだんと改造していき、最終的に与えられた課題に合うように仕上げます。
Re: C言語の考え方がわかりません。
Posted: 2013年1月22日(火) 20:18
by resettt
完全二分木は、音から葉の高さがすべて同じか、たかだか1しか違わない2分木というのはわかりますが、2分木に値を挿入するやり方は一日調べてみましたが、わかりませんでした。
コンパイル可能になるまで修正の前に、コードが全然浮かびません。
このプログラムをどう動かしたいのか、イメージが浮かばないです。
ヒントとして
1、malloc()で、メモリに領域確保(適当に確保される)
2、確保した領域にファイルからデータを読み込む
3、2分木をつくる(ポインタでつなぐ)
4、2分木からデータを表示する
と言われましたが、1の時点で領域確保?という状態です。
Re: C言語の考え方がわかりません。
Posted: 2013年1月22日(火) 22:41
by beatle
コンパイル可能にするというのは1以前の問題なのです。
resetttさんが提示したソースコードは、括弧が対応してなかったりして、コンパイルが出来ません。
機能を増やす前に、とにかくコンパイルができるようにしなければお話にならないということです。
resettt さんが書きました:コンパイル可能になるまで修正の前に、コードが全然浮かびません。
さすがにhello, worldプログラムさえ書けない訳ではないですよね?
だとすれば、提示されたソースコードをコンパイルできるように修正するのは出来て欲しいのですが。
resettt さんが書きました:2分木に値を挿入するやり方は一日調べてみましたが、わかりませんでした。
「2分木 挿入」でGoogle検索したら、一番上にWikipediaの説明が出て来ました。
http://ja.wikipedia.org/wiki/2%E5%88%86 ... F.E5.85.A5
Re: C言語の考え方がわかりません。
Posted: 2013年1月23日(水) 06:11
by resettt
さすがにhello worldは書けますが、それまでです。
コード:
#include<stdio.h>
main()
{
printf("hello wold");
}
今の問題をコンパイル可能にするにはどうすればいいのかがわからないです。
23行目のifのあとに来るものがわかりませんし、どう終わったらコンパイル可能になるのかもわかりません。
2分木の挿入
1、ルートから手順を開始する。
2、着目しているノードと目的の値を比較する。「目的の値 < 着目しているノード」なら左の子、「着目しているノード ≤ 目的の値」なら右の子が、次の着目ノードとなる。
3、次の着目ノードが存在しなければ(現在の着目ノードが葉であれば)、次の着目ノードの位置にデータを挿入。存在すれば、次の着目ノードに移って繰り返し。
ということはわかりましたが、それをCに表すってなるとどういうコードを書けばいいのかわかりません。
比較だからifを使い、繰り返すからforかwhileを使うのだろうとは思いますが、中の式は浮かびません。
Re: C言語の考え方がわかりません。
Posted: 2013年1月23日(水) 07:25
by beatle
resettt さんが書きました:さすがにhello worldは書けますが、それまでです。
コード:
#include<stdio.h>
main()
{
printf("hello wold");
}
今の問題をコンパイル可能にするにはどうすればいいのかがわからないです。
23行目のifのあとに来るものがわかりませんし、どう終わったらコンパイル可能になるのかもわかりません。
なるほど。わかりました。
僕からの提案ですが、2分木は一旦忘れて、C言語の基礎から勉強すべきと考えます。
「授業でやっているポインタや構造体の記述」を理解しようとする前に、C言語の文法も含め、最初から復習した方が良いと思います。
そうする時間がresetttさんに有ることを祈ります。
C言語の書籍やWebサイトをまとめていますので、参考にしてください。
http://dixq.net/forum/viewtopic.php?f=3&t=11704#p94463
Re: C言語の考え方がわかりません。
Posted: 2013年1月23日(水) 10:42
by resettt
やっぱり基礎から固めていくしかないですよね・・・。
授業が暇なので投稿してみましたが、基礎からやっていきます。
またわからないことは質問します。
参考URLまでありがとうございます。