【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18688

各コードの説明
投稿者---zuting(2004/12/13 20:00:36)


・include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define kBufferSize (32768)

typedef struct _NODE NODE, *NODEPtr;
struct _NODE {
char *line;
NODEPtr next;
};

int RemoveReturnCode( char *str );
NODEPtr MakeNode( char *str );
int FreeNodeList( NODEPtr node );
void FreeNode( NODEPtr node );
int PrintNodeList( NODEPtr node );
NODEPtr ReverseNodeList( NODEPtr node );

int main( void ){
char buffer[ kBufferSize ];
NODEPtr head;

head = NULL;

while ( NULL != fgets( buffer, kBufferSize, stdin ) ) {
NODEPtr pivot;

RemoveReturnCode( buffer );
pivot = MakeNode( buffer );
if ( pivot = = NULL ) {
FreeNodeList( head );
return 1;
}

pivot->next = head;
head = pivot;
}
PrintNodeList( head );
head = ReverseNodeList( head );
PrintNodeList( head );
FreeNodeList( head );
return 0;
}

int RemoveReturnCode( char *str ) {
char *p;

if ( str == NULL ) return -1;

for ( p = str; *p != `\n¨ && *p != `\r¨ && *p != `\0¨; p++ )
;
*p = `\0¨;
return p Б str;
}

NODEPtr MakeNode( char *str ) {
NODEPtr node;

if ( str == NULL ) return NULL;

node = ( NODEPtr ) calloc( 1, sizeof( NODE ) );
if ( node != NULL ) {
node->line = ( char * ) calloc( strlen( str ) + 1,sizeof( char ) );
if ( node->line != NULL) {
strcpy( node->line, str );
node->next = NULL;
}
else {
free( node );
node = NULL ;
}
}
return node;
}

int FreeNodeList( NODEPtr node ) {
int ct;

ct = 0;
while ( node != NULL ) {
NODEPtr next;

next = node->next;
FreeNode( node );
ct++;
node = next;

return ct;
}

void FreeNode ( NODEPtr node ) {
free( node->line );
free( node );
}

int PrintNodeList( NODEPtr node ){
int ct;
for ( ct = 0; node != NULL; ct++, node = node->next )
printf( ^%d: %s\n ̄, ct+1, node->line );
return ct;
}

NODEPtr ReverseNodeList( NODEPtr node ) {
NODEPtr reverse;
reverse = NULL;
while ( node != NULL ) {
NODEPtr next;
next = node->next;
node->next = reverse;
reverse = node;
node = next;
}
return reverse;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:各コードの説明 18692 もぐりん 2004/12/13 21:55:02


No.18692

Re:各コードの説明
投稿者---もぐりん(2004/12/13 21:55:02)


ソースだけ提示して、どうしてほしいのでしょうか?
何か説明や質問は無いのでしょうか?
あまりにも失礼では?

それと【掲示板ご利用上の注意】を読んでから投稿してください。
ソースを提示するのなら、HTML変換ツールを使ってください。
マルチスレッドはNGです。
間違いなら、どちらかを閉じてください。



この投稿にコメントする

削除パスワード

No.18697

Re:各コードの説明
投稿者---zuting(2004/12/13 23:59:09)


失礼しました。私は外国人なんです。c言語について、まったくの初心者ですが、それには{ソースの添付は「HTML変換ツール」で字下げ!}について、意味よく分からないですよ。だから、ソースがそのままで出しました。すみませんでした。
以上のプログラムの中で、各関数について
概要:  入力
 機能
 出力
それに、各コードの説明、仕組み、具体例。
私は母語でちょっと説明できるんですが、日本語で全然無理ですよ。誰が日本語で詳しくて、説明してくださいますか?お願いします。




この投稿にコメントする

削除パスワード

No.18699

Re:各コードの説明
投稿者---RAPT(2004/12/14 01:06:10)


>{ソースの添付は「HTML変換ツール」で字下げ!}について、
> 意味よく分からないですよ。
リンクをクリックしてみれば分かると思います。
※きちんと、「詳しくはこちら」とリンクが張ってあります。
 分からなければ調べる方法は提供されています。

分かる部分があるのなら、それを書けば良いでしょう。
日本語が分からなければ辞書を使って調べればいいだけでしょう。

その上で、何がわからないのかを明確にしてください。


この投稿にコメントする

削除パスワード

No.18702

Re:各コードの説明
投稿者---REE(2004/12/14 09:36:10)


>私は母語でちょっと説明できるんですが、日本語で全然無理ですよ。誰が日本語で詳しくて、説明してくださいますか?お願いします。

そうであれば、あなたの母国語で説明を作って、それを日本語に翻訳すればいいのではないですか?



この投稿にコメントする

削除パスワード

No.18703

Re:各コードの説明
投稿者---たいちう(2004/12/14 09:40:06)


> それに、各コードの説明、仕組み、具体例。
> 私は母語でちょっと説明できるんですが、日本語で全然無理ですよ。
> 誰が日本語で詳しくて、説明してくださいますか?お願いします。

まず、プログラムがコンパイルできない。
何故かロシア語のアルファベットなんかも書かれてるし。
あなたの書いた動かないプログラムを見て、誰が何を説明できるのですか?

関数名などから動作を推測して、プログラムがそのように正しく動くように直し、
それぞれのコードの詳しい説明をしてほしい、というお願いなのですか?
外国での苦労も理解できないこともないけど、甘えすぎだと思います。

部分的にでも良いので、説明を試みてください。

# C言語は世界中で広く使われています。
# あなたの母国にもC言語について質問できる掲示板があると思います。
# そちらを使った方が近道かもしれません。


この投稿にコメントする

削除パスワード

No.18704

Re:各コードの説明
投稿者---通りすがり(2004/12/14 09:40:16)


>失礼しました。私は外国人なんです。
だったら自分の母国語が通用する掲示板に投稿すれば良いでしょう。
あなたの環境は日本国内のサーバにしかつながらないんですか?

>c言語について、まったくの初心者ですが、それには{ソースの添付は「HTML変換ツール」で字下げ!}について、意味よく分からないですよ。だから、ソースがそのままで出しました。すみませんでした。
普通に考えてルールくらいどこでもあるでしょう。

>以上のプログラムの中で、各関数について
>概要:  入力
>  機能
>  出力
>それに、各コードの説明、仕組み、具体例。
>私は母語でちょっと説明できるんですが、日本語で全然無理ですよ。誰が日本語で詳しくて、説明してくださいますか?お願いします。
>

日本語での説明が無理ならあなたの「母語」で書いてみてください。それも無理なら丸投げする位だからあきらめなさい。


この投稿にコメントする

削除パスワード

No.18707

Re:各コードの説明
投稿者---RiSK(2004/12/14 17:10:50)


> {ソースの添付は「HTML変換ツール」で字下げ!}について、意味よく分からないですよ。

とりあえず推測で,コンパイルが通るように直してみました。
これなら読める?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define kBufferSize (32768)

typedef struct _NODE NODE, *NODEPtr;
struct _NODE {
    char *line;
    NODEPtr next;
};

int RemoveReturnCode( char *str );
NODEPtr MakeNode( char *str );
int FreeNodeList( NODEPtr node );
void FreeNode( NODEPtr node ); 
int PrintNodeList( NODEPtr node );
NODEPtr ReverseNodeList( NODEPtr node );

int main( void ){
    char buffer[ kBufferSize ];
    NODEPtr head;
    
    head = NULL;
    
    while ( NULL != fgets( buffer, kBufferSize, stdin ) ) {
        NODEPtr pivot;
        
        RemoveReturnCode( buffer );
        pivot = MakeNode( buffer );
        if ( pivot == NULL ) {
            FreeNodeList( head );
            return 1;
        }
        
        pivot->next = head;
        head = pivot;
    }
    PrintNodeList( head );
    head = ReverseNodeList( head );
    PrintNodeList( head );
    FreeNodeList( head );
    return 0;
}

int RemoveReturnCode( char *str ) {
    char *p;
    
    if ( str == NULL ) return -1;
    
    for ( p = str; *p != '\n' && *p != '\r' && *p != '\0'; p++ )
        ;
    *p = '\0';
    //  return p Б str;
    return p - str;
}

NODEPtr MakeNode( char *str ) {
    NODEPtr node;
    
    if ( str == NULL ) return NULL;
    
    node = ( NODEPtr ) calloc( 1, sizeof( NODE ) );
    if ( node != NULL ) {
        node->line = ( char * ) calloc( strlen( str ) + 1,sizeof( char ) );
        if ( node->line != NULL) {
            strcpy( node->line, str );
            node->next = NULL;
        }
        else {
            free( node );
            node = NULL ;
        }
    }
    return node;
}

int FreeNodeList( NODEPtr node ) {
    int ct;
    
    ct = 0;
    while ( node != NULL ) {
        NODEPtr next;
        
        next = node->next;
        FreeNode( node );
        ct++;
        node = next;
    }
    return ct;
}

void FreeNode ( NODEPtr node ) {
    free( node->line );
    free( node );
}

int PrintNodeList( NODEPtr node ){
    int ct;
    for ( ct = 0; node != NULL; ct++, node = node->next )
        printf("%d: %s\n", ct+1, node->line );
    return ct;
}

NODEPtr ReverseNodeList( NODEPtr node ) {
    NODEPtr reverse;
    reverse = NULL;
    while ( node != NULL ) {
        NODEPtr next;
        next = node->next;
        node->next = reverse;
        reverse = node;
        node = next;
    }
    return reverse; 
} 



この投稿にコメントする

削除パスワード

No.18709

Re:各コードの説明
投稿者---zuting(2004/12/14 18:05:44)


直してくれて、ありがとうございます。実は、このソースはWordで作ったから、添付すると、正しくない符号がでました。みんなにご迷惑をかけて、すみませんでした。



この投稿にコメントする

削除パスワード

No.18810

Re:各コードの説明
投稿者---zuting(2004/12/19 22:10:42)


>お待たせいたしました。何日も経て、私はいよいよ日本語で説明しましたが、間違ってるところが異常に多いと思いますので、間違ってるところがあったら、ぜひ直してください。よろしく、お願いします。
><pre>#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define kBufferSize (32768) //グループの大きさを数える

typedef struct _NODE NODE, *NODEPtr;
struct _NODE {
char *line;
NODEPtr next;
};
//鎖の時計の構造の定義.すべてのノードは2部分から構成して、第1部分は1つのバイトで、後1つの部分は1つのポインターで、次のノードを指す

int RemoveReturnCode( char *str ); //各関数の定義
NODEPtr MakeNode( char *str );
int FreeNodeList( NODEPtr node );
void FreeNode( NODEPtr node );
int PrintNodeList( NODEPtr node );
NODEPtr ReverseNodeList( NODEPtr node );

int main( void ){
char buffer[ kBufferSize ]; //定義はグループbufferを数える
NODEPtr head;        //第1のノード
   
head = NULL;         //第1のノードはただ1つのポインターけをくわえて、キャラクターの部分がない
while ( NULL != fgets( buffer, kBufferSize, stdin ) ) { //グループbufferを数えるのが空ではない時
NODEPtr pivot;  //ポインターpivot

RemoveReturnCode( buffer ); //関数を調達し使用する 
pivot = MakeNode( buffer );
if ( pivot == NULL ) {    //もしポインターは空になるならば、 ノードの空間を釈放する
FreeNodeList( head );
return 1;
}

pivot->next = head;  //ポインターを移動して次のノードに着いて、次のノードは鎖になって表す
head = pivot;
}
PrintNodeList( head ); //関数を調達し使用する
head = ReverseNodeList( head );
PrintNodeList( head );
FreeNodeList( head );
return 0;
}

int RemoveReturnCode( char *str ) { //関数INPUTその数グループ
char *p;

if ( str == NULL ) return -1; //数組は空っぽな時で、OUTPUTは-1だ

for ( p = str; *p != '\n' && *p != '\r' && *p != '\0'; p++ ) // Pの開始str(ような値を作る)のため値して、Pは空っぽな時ではなくて、P++
;
*p = '\0';
<font color="#009900">// return p Б str;</font>
return p - str; //戻ってSTRのと違いグループPを数える
}

}
////たとえば、 STR = A B C D E, P=A B C D, E.に戻る

NODEPtr MakeNode( char *str ) { //関数INPUTは1個数グループだ

NODEPtr node;

if ( str == NULL ) return NULL; //数組が空の時、空っぽな鎖に戻って表す

node = ( NODEPtr ) calloc( 1, sizeof( NODE ) );
if ( node != NULL ) {
node->line = ( char * ) calloc( strlen( str ) + 1,sizeof( char ) );
if ( node->line != NULL) {
strcpy( node->line, str );
node->next = NULL;
}
else {
free( node );
node = NULL ;
}
}
return node; //グループを数えるのは空っぽな時ではなくて、 鎖に戻って表す

//たとえばINPUTはA B C Dがグループを数えるので、1つの同じ値に戻る鎖は表す
int FreeNodeList( NODEPtr node ) {  //関数INPUT鎖はノードのポインターを表す
int ct;

ct = 0;
while ( node != NULL ) { //空ではない時、ポインターを次までノードに移動して、FreeNode関数を使って当面のノードを釈放する
NODEPtr next;

next = node->next;
FreeNode( node );
ct++;  //counterの値を増加して、counter記録は釈放されるいくつ(か)のノードがある
node = next;
}
return ct;
}

//たとえば1つの大きさは10のノードの鎖が入力を表すので、 出力して10になる

void FreeNode ( NODEPtr node ) {  //入力して鎖になってノードのポインターを表して、当面のノードの空間を釈放して、出力がない.
free( node->line );
free( node );
}

int PrintNodeList( NODEPtr node ){ //この鎖をタイプ印刷して表して、鎖が表すのが空ではない時.入力して鎖になってノードのポインターを表す.
int ct;
for ( ct = 0; node != NULL; ct++, node = node->next )
printf(<font color="#0000ff">"%d: %s\n"</font>, ct+1, node->line );
return ct; //大きさを表してこの鎖をタイプ印刷することと表すことを出力して鎖になる
}
//たとえば入力はA B C D のため出力して4になって、そしてA B C D をタイプ印刷する
NODEPtr ReverseNodeList( NODEPtr node ) { //入力して鎖になってノードのポインターを表して、この関数は1本の鎖を表して逆さまにする.
NODEPtr reverse;
reverse = NULL;
while ( node != NULL ) {
NODEPtr next;
next = node->next;
node->next = reverse;
reverse = node;
node = next;
}
return reverse;  //出力して逆さまにする鎖になって表す

} </pre>

//たとえば入力はA B C Dのため出力して次のようになる D C B A




この投稿にコメントする

削除パスワード

No.18830

Re:各コードの説明
投稿者---zuting(2004/12/20 17:55:25)


>>間違えがあったら、誰が直してください。お願いします。
>><pre>#include <stdio.h>
>#include <stdlib.h>
>#include <string.h>
>
>#define kBufferSize (32768) //グループの大きさを数える
>
>typedef struct _NODE NODE, *NODEPtr;
>struct _NODE {
> char *line;
> NODEPtr next;
>};
>//鎖の時計の構造の定義.すべてのノードは2部分から構成して、第1部分は1つのバイトで、後1つの部分は1つのポインターで、次のノードを指す
>
>int RemoveReturnCode( char *str ); //各関数の定義
>NODEPtr MakeNode( char *str );
>int FreeNodeList( NODEPtr node );
>void FreeNode( NODEPtr node );
>int PrintNodeList( NODEPtr node );
>NODEPtr ReverseNodeList( NODEPtr node );
>
>int main( void ){
> char buffer[ kBufferSize ]; //定義はグループbufferを数える
> NODEPtr head;        //第1のノード
>    
> head = NULL;         //第1のノードはただ1つのポインターけをくわえて、キャラクターの部分がない
> while ( NULL != fgets( buffer, kBufferSize, stdin ) ) { //グループbufferを数えるのが空ではない時
> NODEPtr pivot;  //ポインターpivot
>
> RemoveReturnCode( buffer ); //関数を調達し使用する 
> pivot = MakeNode( buffer );
> if ( pivot == NULL ) {    //もしポインターは空になるならば、 ノードの空間を釈放する
> FreeNodeList( head );
> return 1;
> }
>
> pivot->next = head;  //ポインターを移動して次のノードに着いて、次のノードは鎖になって表す
> head = pivot;
> }
> PrintNodeList( head ); //関数を調達し使用する
> head = ReverseNodeList( head );
> PrintNodeList( head );
> FreeNodeList( head );
> return 0;
>}
>
>int RemoveReturnCode( char *str ) { //関数INPUTその数グループ
> char *p;
>
> if ( str == NULL ) return -1; //数組は空っぽな時で、OUTPUTは-1だ
>
> for ( p = str; *p != '\n' && *p != '\r' && *p != '\0'; p++ ) // Pの開始str(ような値を作る)のため値して、Pは空っぽな時ではなくて、P++
> ;
> *p = '\0';
> <font color="#009900">// return p Б str;</font>
> return p - str; //戻ってSTRのと違いグループPを数える
>}
>
>}
>////たとえば、 STR = A B C D E, P=A B C D, E.に戻る
>
>NODEPtr MakeNode( char *str ) { //関数INPUTは1個数グループだ
>
> NODEPtr node;
>
> if ( str == NULL ) return NULL; //数組が空の時、空っぽな鎖に戻って表す
>
> node = ( NODEPtr ) calloc( 1, sizeof( NODE ) );
> if ( node != NULL ) {
> node->line = ( char * ) calloc( strlen( str ) + 1,sizeof( char ) );
> if ( node->line != NULL) {
> strcpy( node->line, str );
> node->next = NULL;
> }
> else {
> free( node );
> node = NULL ;
> }
> }
> return node; //グループを数えるのは空っぽな時ではなくて、 鎖に戻って表す
>}
>//たとえばINPUTはA B C Dがグループを数えるので、1つの同じ値に戻る鎖は表す
>int FreeNodeList( NODEPtr node ) {  //関数INPUT鎖はノードのポインターを表す
> int ct;
>
> ct = 0;
> while ( node != NULL ) { //空ではない時、ポインターを次までノードに移動して、FreeNode関数を使って当面のノードを釈放する
> NODEPtr next;
>
> next = node->next;
> FreeNode( node );
> ct++;  //counterの値を増加して、counter記録は釈放されるいくつ(か)のノードがある
> node = next;
> }
> return ct;
>}
>
>//たとえば1つの大きさは10のノードの鎖が入力を表すので、 出力して10になる
>
>void FreeNode ( NODEPtr node ) {  //入力して鎖になってノードのポインターを表して、当面のノードの空間を釈放して、出力がない.
> free( node->line );
> free( node );
>}
>
>int PrintNodeList( NODEPtr node ){ //この鎖をタイプ印刷して表して、鎖が表すのが空ではない時.入力して鎖になってノードのポインターを表す.
> int ct;
> for ( ct = 0; node != NULL; ct++, node = node->next )
> printf(<font color="#0000ff">"%d: %s\n"</font>, ct+1, node->line );
> return ct; //大きさを表してこの鎖をタイプ印刷することと表すことを出力して鎖になる
>}
>//たとえば入力はA B C D のため出力して4になって、そしてA B C D をタイプ印刷する
>NODEPtr ReverseNodeList( NODEPtr node ) { //入力して鎖になってノードのポインターを表して、この関数は1本の鎖を表して逆さまにする.
> NODEPtr reverse;
> reverse = NULL;
> while ( node != NULL ) {
> NODEPtr next;
> next = node->next;
> node->next = reverse;
> reverse = node;
> node = next;
> }
> return reverse;  //出力して逆さまにする鎖になって表す
>
>} </pre>
>
>//たとえば入力はA B C Dのため出力して次のようになる D C B A
>




この投稿にコメントする

削除パスワード

No.18838

Re:各コードの説明
投稿者---たいちう(2004/12/21 10:38:42)


質問の意図は「コメントを添削してほしい」という事だと理解しました。
全部直すのは大変なので、日本語が下手な部分は目をつぶり、
プログラムの理解が不十分と感じた点について少し書きます。

> 鎖の時計の構造の定義.すべてのノードは2部分から構成して、
> 第1部分は1つのバイトで、後1つの部分は1つのポインターで、次のノードを指す

なぜ時計?「鎖の構造の定義」の方が良いかと。
後半の、next がポインタで次のノードを指す、というのは正しいですが、
前半は誤解してませんか?
line もポインタで、文字列を指しています。

> NODEPtr head; //第1のノード
> head = NULL; //第1のノードはただ1つのポインターけをくわえて、キャラクターの部分がない

head は第1のノードではなく、第1のノードを指すポインタです。
プログラムの開始直後は、文字列の入力前なので、1つもノードがなく、
head はどこも指してはいません。どこも指していないことを
確実にするために head = NULL とします。
説明は割愛しますが、とても大切なことなのでちゃんと理解してください。


この投稿にコメントする

削除パスワード

No.18839

Re:各コードの説明
投稿者---zuting(2004/12/21 11:34:04)


分かりました。ありがとうございます。


この投稿にコメントする

削除パスワード

No.18837

Re:各コードの説明
投稿者---もぐりん(2004/12/20 21:58:30)


結局、質問したいことは?
ソースは入力した文字列を逆順に出力するプログラムなんですよね?
開発環境は?
何がわからないのか書かないと答えられません。
無理して日本語で答えようとせず、母国語(Englishなど)で説明してください。
コンパイルしていますか?
Visual C++(SP6)でコンパイルしたら、エラーが100個以上見つかったって
言われましたよ。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧