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

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

 詳しくはこちら


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

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


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

No.22573

自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---1年7ヶ月(2005/08/11 16:59:46)


初めまして、自分はC言語を独学である程度適当に勉強?して約1年と7ヶ月くらい経ちました。前から辞書順に並びかえるというプログラミングをstrncmpとかは使わずに、先頭が違う文字であれば並び変えて、同じ文字が来たら、違う文字がでるまで配列をインクリメントして、、、というようなプログラムがなかなかできずに3週間もかかってしまいました。
実は自分はインターネットはお金がかかるし、誘惑も多いので、自宅にはつけてないんです、だから、家のパソコンで作ったプログラムをノートに写してきたので、間違っているところがあるかもしれませんが、自分のパソコンでは、警告もなく、普通に動作してくれます。もしかしたら、}の数が違うかもしれませんが、プログラムを見てくれませんでしょうか?
それで、自分はこの自分の書いたプログラムが独学なので、いろいろなホームページで見たときに、10人、プログラマーがいたらできる人は1人で、普通の人が4人で後の5人は足をひっぱる人だと聞いたことがありました。それでどうしても、自分のプログラムが足をひっぱるタイプの人間の書いたプログラムに近いのか、普通の人に近いのか、大体のところを知りたいんです。よろしくお願いします。
以下のプログラムで、自分の希望している働きは

「誰かに入力したい、文字列を何個入力したいのかを入力してもらって、
その数だけいろいろな文字列を入力してもらって、その入力された文字列
配列にどんどん、格納していって、その結果、配列に格納された文字列を表示した時に小さい順に並び変わっていてほしいというものです。もし先頭が同じ文字であったなら、その文字列と、その次の文字列の先頭文字が違う文字が出るまで、インクリメントして、違う文字になったら、同じように、その違う文字同士を比べて、小さい順に並びかえるというものです







#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
void change(char *str1, char *str2, char *now_str){
char swap[30] = "";
strcpy(swap, str1);
strcpy(str1, str2);
strcpy(str2, swap);
strcpy(now_str, str2);
}
main()
{
char str[20][30] = {
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""},
{""}
};
int num = 0;
int i;
int j;
int v;
char now_str[30] = "";
char swap[30] = "";
puts("何個入力する気なのかしら?");
scanf("%d", &num);
for(i = 0; i < num; i++){
scanf("%29s", &str[i]);
}
system("cls");
puts("入力された文字列");
for(i = 0; i < num; i++){
printf("%s\n", str[i]);
}
for(i = 0; i < num; i++){
strcpy(now_str, str[i]);
for(j = 0; j < num; j++){
if(i!= j && (int)(now_str[0]) > (int)(str[j][0])){
change(str[i], str[j], now_str);
}
else if(i!= j && (int)(now_str[0]) == (int)(str[j][0])){
for(v = 0; (int)(now_str[v]) == (int)(str[j][v]); v++){
}
if((int)(now_str[v]) > (int)(str[j][v])){
change(str[i], str[j], now_str);
}
}
puts("修正結果よ");
for(i = num - 1; i >= 0; i--){
printf("%s\n", str[i]);
}
v = 0;
i = num - 1;
printf("上記の並び順で小さい順に並んでいるか、、、");
while(i > 0 && (int)(str[i][v]) < (int)(str[i-1][v]) || (int)(str[i][v]) == (int)(str[i-1][v])){
if((int)(str[i][v]) == (int)(str[i-1][v])){
for(v = 0; (int)(str[i][v]) == (int)(str[i-1][v]); v++){
}
else{
i--;v = 0;
}
if(i == 0){
puts("OK!!");
for(i = num - 1; i >= 0; i--){
if((int)(str[i][0])!= (int)(str[i-1][0])){
printf("%s      %d", str[i], (int)(str[i][0]));
}
else if((int)(str[i][0]) == (int)(str[i-1][0])){
for(v = 0; (int)(str[i][v]) == (int)(str[i-1][v]); v++){
}
printf("%s      %d", str[i], (int)(str[i][v]));
}
else if(i == 0 && (int)(str[i][0]) == (int)(str[i+1][0])){
for(v = 0; (int)(str[i][v]) == (int)(str[i+1][v]); v++){
printf("%s       %d", str[i], (int)(str[i][v]));
}
}
puts("");
}
}
else{
puts("\aFalse\a");
}

}

}


}

}

}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価 22574 まきじ 2005/08/11 17:16:05
<子記事> Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価 22576 朱鷺 2005/08/11 17:42:34
<子記事> Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価 22578 まきじ 2005/08/11 18:03:05
<子記事> Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価 22581 とおり 2005/08/11 18:44:18
<子記事> Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価 22587 επιστημη 2005/08/11 21:38:09
<子記事> Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価 22592 エートリーぶ 2005/08/11 23:52:23
<子記事> Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価 22595 shu 2005/08/12 01:25:56


No.22574

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---まきじ(2005/08/11 17:16:05)


ソースはHTML形式に変換してから投稿してください。

・strcpy() は使うのに、strncmp() だけ使わないのは不思議
・main() が長すぎ。
・main() は int main(void) とすべき
・C でしたら、using namespace std は不要

>自分のプログラムが足をひっぱるタイプの人間の書いたプログラムに近い

私が言える立場でもありませんが、仕事でしたら話にならでしょう(^^;


この投稿にコメントする

削除パスワード

No.22577

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---Blue(2005/08/11 18:02:32)


> ソースはHTML形式に変換してから投稿してください。
ログをみたところ、ちゃんとHTMLに変換したぽいですね。

> もしかしたら、}の数が違うかもしれませんが
という発言があることから、普段からインデントしていないようですね。



この投稿にコメントする

削除パスワード

No.22612

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---一年七ヶ月(2005/08/13 09:41:02)


><pre>> ソースはHTML形式に変換してから投稿してください。
ログをみたところ、ちゃんとHTMLに変換したぽいですね。

> もしかしたら、}の数が違うかもしれませんが
という発言があることから、普段からインデントしていないようですね。</pre>
自分のきたないプログラムをわざわざ見ていただいてどうもありがとうございます。そうですね、一応、HTML昆布という物を使って貼り付けた記憶があるような気がするんですけど。
そうですね、普段からインデントには気をつかうようにします。
ありがとうございました。


この投稿にコメントする

削除パスワード

No.22611

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---一年七ヶ月(2005/08/13 09:37:44)


>ソースはHTML形式に変換してから投稿してください。
>
>・strcpy() は使うのに、strncmp() だけ使わないのは不思議
>・main() が長すぎ。
>・main() は int main(void) とすべき
>・C でしたら、using namespace std は不要
>
>>自分のプログラムが足をひっぱるタイプの人間の書いたプログラムに近い
>
>私が言える立場でもありませんが、仕事でしたら話にならでしょう(^^;
お返事、どうもありがとうございます!こういったプログラミングの所に自分の投稿したのは初めてなので、返事をいただいた事がとても嬉しく感じています。



この投稿にコメントする

削除パスワード

No.22576

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---朱鷺(2005/08/11 17:42:34)


ちゃんと改行していただかないと、非常に見にくいです^^;
ざっと見た感じだと、おそらくメモリ操作等の知識レベルが低いように感じます。ポインタ関係の理解度をもう少し上げたほうがいいです。
仕事での立場が知りたいということですが、このレベルだとバグを生み出して無駄に容量を食うようなプログラミングしかできないので、製品レベルのソフトの製作には加わらないほうがいいでしょう。
バグ自体は、プログラミングをする以上ほぼ防ぎようがないので、バグが出てもデバッグしやすいようにパーツ単位で組む癖を身に付けたほうがいいと思います。


この投稿にコメントする

削除パスワード

No.22613

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---一年七ヶ月(2005/08/13 09:56:47)


>ちゃんと改行していただかないと、非常に見にくいです^^;
>ざっと見た感じだと、おそらくメモリ操作等の知識レベルが低いように感じます。ポインタ関係の理解度をもう少し上げたほうがいいです。
>仕事での立場が知りたいということですが、このレベルだとバグを生み出して無駄に容量を食うようなプログラミングしかできないので、製品レベルのソフトの製作には加わらないほうがいいでしょう。
>バグ自体は、プログラミングをする以上ほぼ防ぎようがないので、バグが出てもデバッグしやすいようにパーツ単位で組む癖を身に付けたほうがい
いと思います。
お返事ありがとうございます、こういったプログラミング専門の掲示板に投稿するのは初めてなので、お返事がとても嬉しいし、自分の弱い所を指摘していただいて、感謝しています。やはり、ほかの人に見てもらうことは自分で、もくもくと作っていく過程ではわからないような事が発見できてとても、大切なことですね。自分はコンピューターの事は全く無知で、
プログラムという物が存在していて、それによって、コンピューターが動いているという事を知ってそれでそれって何か面白そうと思い、独学で勉強?してきた者なので、製品ソフトの製作なんて事は夢にも思っていませんのでご安心ください!ただ自分の力(力なんてレベルじゃありませんね)が知りたかったんです!自分のプログラムは無駄に容量を使ってしまうし、バグを大量生産してしまうプログラムだということがわかっただけでとても感謝しています。ほんとうにありがとうございます


この投稿にコメントする

削除パスワード

No.22578

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---まきじ(2005/08/11 18:03:05)


#include<stdio.h>

int str_cmp(const char* str1, const char* str2){

    while(*str1 == *str2){
        str1++;
        str2++;
    }
    
    return *str1 - *str2;
}

void str_cpy(char *dst, const char* src){

    while((*dst = *src) != '\0'){
        dst++;
        src++;
    }
    
}

int str_len(const char *str){

    int cnt = 0;
    
    while(*str++) cnt++;
    
    return cnt;
}

void insert_str(char (*str)[100],const char* buf,const int tail){

    int j;
    
    for(j = tail - 1; j >= 0 && str_cmp(str[j],buf) > 0; j--){
        str_cpy(str[j + 1],str[j]);
    }
    str_cpy(str[j + 1],buf);
}

void print_str(const char (*str)[100],const int cnt){

    int i;

    for(i = 0; i < cnt; i++) printf("%s\n",str[i]);
    
}

int main(void){

    char str[256][100];
    char buf[256];
    int cnt, i;

    do{
        printf("何個?(1 以上 100 以下)");
        scanf("%d%*c",&cnt);
    }while(cnt < 1 || cnt > 100);
    
    for(i = 0; i < cnt; i++){
    
        printf("%d 個目文字列:",i + 1);
        fgets(buf,255,stdin);
        
        if(buf[str_len(buf) - 1] == '\n') buf[str_len(buf) - 1] = '\0';
        
        insert_str(str,buf,i);
    }
    
    print_str(str,cnt);
}



この投稿にコメントする

削除パスワード

No.22588

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---エートリーぶ(2005/08/11 23:21:56)



せっかくだから、 main のリターン値もあれば
さらに、良いです。
あと、おしゃべり掲示板にも来て下さい。



この投稿にコメントする

削除パスワード

No.22590

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---まきじ(2005/08/11 23:29:02)


>せっかくだから、 main のリターン値もあれば

あらら、忘れてますね、、、


この投稿にコメントする

削除パスワード

No.22591

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---RiSK(2005/08/11 23:37:14)


>せっかくだから、 main のリターン値もあれば
>さらに、良いです。

標準C(現行のC99)ではmainの最後の}に来た場合,
return 0; したのと同じになります。

書いていて悪いことはありませんが,
(過去の互換性を考えなければ,)書く必要はありません。



>あと、おしゃべり掲示板にも来て下さい。

余計です。



この投稿にコメントする

削除パスワード

No.22593

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---エートリーぶ(2005/08/12 00:02:25)



>余計です。
そうですか? まあ、皆さんの判断にまかせますが・・・



この投稿にコメントする

削除パスワード

No.22589

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---まきじ(2005/08/11 23:28:14)


str_cmp() 修正。

int str_cmp(const char* str1, const char* str2){

    while(*str1 == *str2 && *str1 != '\0' && *str2 != '\0')
        str1++;
        str2++;
    }
    
    return *str1 - *str2;
}



この投稿にコメントする

削除パスワード

No.22618

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---1年と七ヶ月(2005/08/13 19:18:25)


><pre>#include<stdio.h>

int str_cmp(const char* str1, const char* str2){

while(*str1 == *str2){
str1++;
str2++;
}

return *str1 - *str2;
}

void str_cpy(char *dst, const char* src){

while((*dst = *src) != '\0'){
dst++;
src++;
}

}

int str_len(const char *str){

int cnt = 0;

while(*str++) cnt++;

return cnt;
}

void insert_str(char (*str)[100],const char* buf,const int tail){

int j;

for(j = tail - 1; j >= 0 && str_cmp(str[j],buf) > 0; j--){
str_cpy(str[j + 1],str[j]);
}
str_cpy(str[j + 1],buf);
}

void print_str(const char (*str)[100],const int cnt){

int i;

for(i = 0; i < cnt; i++) printf("%s\n",str[i]);

}

int main(void){

char str[256][100];
char buf[256];
int cnt, i;

do{
printf("何個?(1 以上 100 以下)");
scanf("%d%*c",&cnt);
}while(cnt < 1 || cnt > 100);

for(i = 0; i < cnt; i++){

printf("%d 個目文字列:",i + 1);
fgets(buf,255,stdin);

if(buf[str_len(buf) - 1] == '\n') buf[str_len(buf) - 1] = '\0';

insert_str(str,buf,i);
}

print_str(str,cnt);
}</pre>


わざわざお返事だけでなく、自分のプログラムに何が足りないのか?どういった部分を変えれば、より、バグが少なく、処理が短くて済み、自分が一段上がれるように、プログラムを組んでいただいてありがとうございます。
とにかく第一に感じる事は、とても見やすい(第三者に見せた時に)と感じました。行数も極端に少なくなり、バグが発見された時に、ひとつひとつの関数をチェックして、バグが見つかりやすいプログラムなのではないかと感じました。自分はいちいち、関数化しないで、箇条書きのように書いていましたが、まきじ様の関数は関数名も、わかりやすく、自分も、「文字列の先頭が同じなら違う文字がでるまでインクリメントする関数や、文字列を入れ替える関数も」、あ!これならわかりやすいよね!と妙に納得させられました。文字列の長さを計る関数の判定方法も、あ!そうだよねと納得しました。とにもかくにも、バグがでてきたら、プログラムを見て、「早い時間で直せそうだ」とまきじさまのプログラムは感じさせるのに対し、自分は「えー、何か見たくもない!」と第三者に感じさせるプログラムですね。
本当にありがとうございます


この投稿にコメントする

削除パスワード

No.22581

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---とおり(2005/08/11 18:44:18)


>初めまして、自分はC言語を独学である程度適当に勉強?して約1年と7ヶ月くらい経ちました。

独学で頑張るのは大変結構だと思いますが、問題なのはその内容です。
それなりの本を読み、まともなプログラムを見て、それに近づこうとすることが重要かと
個人的には思います。
とりあえず、この掲示板内でも、ネット上の他の題材でもいいので、スキルのある人が
書いたプログラムを読むことをお勧めします。


この投稿にコメントする

削除パスワード

No.22619

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---1年と七ヶ月(2005/08/13 19:26:50)


>>初めまして、自分はC言語を独学である程度適当に勉強?して約1年と7ヶ月くらい経ちました。
>
>独学で頑張るのは大変結構だと思いますが、問題なのはその内容です。
>それなりの本を読み、まともなプログラムを見て、それに近づこうとすることが重要かと
>個人的には思います。
>とりあえず、この掲示板内でも、ネット上の他の題材でもいいので、スキルのある人が
>書いたプログラムを読むことをお勧めします。

自分の大変きたないプログラムを見ていただいてありがとうございました。
そうですね。少し前にまきじ様が返却してくれた、プログラムを見て、うん、まともなプログラムはこういう物なんだなと少々感づきはじめたところです。すぐにはまともにはならないけれど、何かプログラミング上手な人の
書いたプログラムを見て、何かまともなプログラムを書いてみたいな、と思えたので、がんばってみます。とおりさんはとても親身になってくれている方だなと感じました。
ありがとうございます




この投稿にコメントする

削除パスワード

No.22587

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---επιστημη(2005/08/11 21:38:09)


>初めまして、自分はC言語を独学である程度適当に勉強?して約1年と7ヶ月くらい経ちました。

この世界でメシを食ってる立場から、キツいこと言わせてもらいます。

「これが一週間学習した成果なら、高く評価する」



この投稿にコメントする

削除パスワード

No.22592

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---エートリーぶ(2005/08/11 23:52:23)



1年7ヶ月さんへ

ここで、あなたのプログラムを評価してくれた方々は
皆さん、読みやすいコードを書く人ばかりです。
だから、評価も厳しい傾向で出てきています。
私も、もちろん、ほめるつもりはありません。

今でもプログラマをやっているかどうか分かりませんが
現在のあなたのようなプログラムを書くプログラマは
いました。そのコードを読むことは大変でした。
バージョンアップやバグがなければ、それでも
良いのでしょうが、そのようなことは普通は無いので。

現在の実力であれば、足をひっぱる人に、残念ながら
入ると思います。

せっかく、まきじさんが見やすいコードをを公開
してくれたのだから、良く見比べて下さい。
あなたとどこが違うのか?
その違いが分かれば、脈はあると思います。
#ただし、完璧なコードとはかぎりません。
#私も5行書けば、必ず一箇所以上のエラーが出ます(^^

良い書物や良いサイトに出会えればと思います。




この投稿にコメントする

削除パスワード

No.22595

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---shu(2005/08/12 01:25:56)


>初めまして、自分はC言語を独学である程度適当に勉強?して約1年と7ヶ月くらい経ちました。前から辞書順に並びかえるというプログラミングをstrncmpとかは使わずに、先頭が違う文字であれば並び変えて、同じ文字が来たら、違う文字がでるまで配列をインクリメントして、、、というようなプログラムがなかなかできずに3週間もかかってしまいました。
>実は自分はインターネットはお金がかかるし、誘惑も多いので、自宅にはつけてないんです、だから、家のパソコンで作ったプログラムをノートに写してきたので、間違っているところがあるかもしれませんが、自分のパソコンでは、警告もなく、普通に動作してくれます。もしかしたら、}の数が違うかもしれませんが、プログラムを見てくれませんでしょうか?
>それで、自分はこの自分の書いたプログラムが独学なので、いろいろなホームページで見たときに、10人、プログラマーがいたらできる人は1人で、普通の人が4人で後の5人は足をひっぱる人だと聞いたことがありました。それでどうしても、自分のプログラムが足をひっぱるタイプの人間の書いたプログラムに近いのか、普通の人に近いのか、大体のところを知りたいんです。よろしくお願いします。
>以下のプログラムで、自分の希望している働きは
>
>「誰かに入力したい、文字列を何個入力したいのかを入力してもらって、
>その数だけいろいろな文字列を入力してもらって、その入力された文字列
>配列にどんどん、格納していって、その結果、配列に格納された文字列を表示した時に小さい順に並び変わっていてほしいというものです。もし先頭が同じ文字であったなら、その文字列と、その次の文字列の先頭文字が違う文字が出るまで、インクリメントして、違う文字になったら、同じように、その違う文字同士を比べて、小さい順に並びかえるというものです
>」

プログラム言語の前に日本語。
プログラムとは直接関係の無いことが多い。

コメントが無い。
インデントされていない。
(大ざっぱな処理ごとに)適度に空行。
これだけでも、プログラムが随分と解かりやすくなると思います。

strncmp()を使わずにということですが、
strncmp()を使った場合のプログラムは組めるでしょうか?
strncmp()を使ってもプログラムがうまく組めない場合、
strncmp()を使わずプログラムを組むことは難しいと思います。
strncmp()を使って、strncmp()を調べて、strncmp()を知って、
strncmp()を解かって、strncmp()を自作してみるとか。


この投稿にコメントする

削除パスワード

No.22614

Re:自分の書いたプログラム(辞書順に並び替える)に対しての評価
投稿者---RAPT(2005/08/13 10:46:42)


全体的な方向性については既に皆さんが述べられているので、私はソースの部分的な点について。

char str[20][30] = { {""}, (snip) {""}, {""} };
私なら、こう書きます。(初期化は見やすく) char str[20][30] = {0}; ※これですべての要素を0で初期化できます。 # 以前、とある会社にいる友人にこれを教えたら「知らなかった」と。 # その友人の先輩社員たちも「これって、ちゃんと動くの?」と。 ## 標準Cに準拠しないコンパイラでも使っていたのだろうか。。
(int)(now_str[0]) > (int)(str[j][0])
私なら、こう書きます。(無用なキャストはしない) now_str[0] > str[j][0] ※キャストは不要な場所では書くべきではないと思います。 バグの温床にもなりますし、ソースも見難く(醜く)なります。



この投稿にコメントする

削除パスワード

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