whileループでノ問題

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

whileループでノ問題

#1

投稿記事 by lotus » 15年前

[1.1]教授のコメントのいみを理解し直したい。
[1.2]大学のプログラムの授業で、整数を素因数分解するプログラムを作った。
[1.3]whileループで,iが代入されないまま参照されるのを直す。
[1.4]コンパイルすると正しく起動するが 、教授のコメントがわからなくて困っている。
[2] 環境  
[2.1] OS : Windows vista
[2.2] コンパイラ名 :gcc
[3] その他
 ・授業で習った程度で、ほとんどわからない状態です

よろしくお願いしますm(__)m

プログラム本体
#include<stdio.h>


int prime(int x);
int getprime(int x);
void printfact(int x);


int main(){
int input;
printf("正数を入力: ");
scanf("%d",&input);
if(input < 1){
printf("BAD \n");
return 0;
}
printfact(input);
return 0;
}

int prime(int x){
int k,i;

if(x<2) return 0;

for(k=x-1;k>1;k--){
if(x%i == 0){
return 0;
}
}

return 1;
}


int getprime(int x){
int i,k;
if(x<2) return 0;


for(k=1;x>=k;k++){
if(x%k == 0){
if(prime(k)) return k;
}
}
return 0; //0を返す
}


void printfact(int x){
int i;
char c='=';

printf("%d",x);

if(x==1) printf("=1");
else if(x!=0){
while(i!=0){
i=getprime(x);
if(i!=0){
printf("%c%d",c,i);
c = '*';
x = x/i;
}
}
}
printf("\n");
return;
}

たかぎ

Re:whileループでノ問題

#2

投稿記事 by たかぎ » 15年前

> 教授のコメントのいみを理解し直したい。

とのことですが、教授のコメントがわからないと、どうすることもできません。

たいちう

Re:whileループでノ問題

#3

投稿記事 by たいちう » 15年前

> [1.1]教授のコメントのいみを理解し直したい。

> return 0; //0を返す

コメントって、↑これしかないじゃん。
最悪のコメントに近いです。
(1を返す、などと書いてあったら本当に最悪)
教授の真意は量り知れませんが、
直すとしたら、コメントを削除かな。


> [3] その他
>  ・授業で習った程度で、ほとんどわからない状態です

何が判らないのですか?
あるいは、どこまでなら判るのですか?

たかぎ

Re:whileループでノ問題

#4

投稿記事 by たかぎ » 15年前

> > return 0; //0を返す
> コメントって、↑これしかないじゃん。

まさかとは思いましたが、本当にそうなのかもしれませんね。
ここから読み取れるのは、このソースが純粋なC90のものではなく、C99か、GCC拡張を用いているか、そのどちらかだということですね。

lotus

Re:whileループでノ問題

#5

投稿記事 by lotus » 15年前

コメントは「whileループで,iが代入されないまま参照されています。」
です。

教科書を見てもこのプログラム作るのにかなりかかりました。

return 0;
をどうしたらいいんですか?

無知ですみません。

組木紙織

Re:whileループでノ問題

#6

投稿記事 by 組木紙織 » 15年前

もしかして、
コメントって、ソースコード中のコメントではなくて、提出したソースコードに対する
先生のコメントという意味ですか?

それで
>コメントは「whileループで,iが代入されないまま参照されています。」
このいみは、

void printfact(int x){
int i;
から
while(i!=0){
のまでの間にiに値を入れてないので、プログラムが正しく動かないかもしれませんよという意味です。

たかぎ

Re:whileループでノ問題

#7

投稿記事 by たかぎ » 15年前

> コメントって、ソースコード中のコメントではなくて、提出したソースコードに対する
> 先生のコメントという意味ですか?

普通はそうでしょう。

lotus

Re:whileループでノ問題

#8

投稿記事 by lotus » 15年前

説明不足ですみません。

なるほど、そういうことなんですか。
ずっとwhile文のなかを見ていました。

意味はわかったのですが、それを解決するためには、
どのようにしたらよいのですか?

i=getprime(x);
これを加えたらよいのでしょうか?

たかぎ

Re:whileループでノ問題

#9

投稿記事 by たかぎ » 15年前

というか、心を持たないコンパイラの警告メッセージじゃあるまいし、先生のコメントも的を射てませんね。
iが初期化されていないのは、printfactだけでなく、primeもそうです。
何か初期値を与えればよいというものではなく、もっと根本的な問題があります。

まずはアルゴリズムを確認し直してください。
Cがそれほど得意ではないのであれば、計算の手順を日本語で正確に記述してから、Cに翻訳することをお勧めします。

lotus

Re:whileループでノ問題

#10

投稿記事 by lotus » 15年前

たかぎさん
早いコメントありがとうございます。

>iが初期化されていないのは、printfactだけでなく、primeもそうです。
ということですが、
初期化しないとしたらどのようにしてやればいいのですか?

また、
日本語からCに翻訳とのことですが、そういうことはまったく習っていないです。

ムンバ

Re:whileループでノ問題

#11

投稿記事 by ムンバ » 15年前

こんばんは。

以前から気になっていた事があるので
lotusさんの、このご質問に便乗させて頂きます事、ご勘弁下さい。
なお、新しいスレをたてた方が良い様でしたら、ご指導の程、宜しくお願い致します。(_ _)

OS:Windows NT 環境:VC++2008(SP1)

lotusさんの提示されたソースを自分なりに、編集させて頂きました。
編集させて頂いたソースを

try.c
try.cpp

それぞれ、試してみました。
私の環境で、それぞれのファイルで試した結果のエラーや警告を報告させて頂きます。

私の以下のソース内での質問:(↓以前から、これが疑問に思ってた事なのですが^^;)
「IMEの設定で、半角文字設定で押した時のTabキーと
 全角文字設定で押した時のTabキー」の違いはありますか?
 (↑便乗させて頂いた上での質問です。ごめんなさい。)
すみません。試させて下さい。
Tabやタグが、意図通りに表示できなければ、必要であれば編集させて頂きます。(謝

//try.c

#include<stdio.h>                        // 1行目
                                        // 2行目(空行)
int prime(int x);                        // 3行目
int getprime(int x);                    // 4行目
void printfact(int x);                    // 5行目
                                        // 6行目(空行)
int main(){                                // 7行目
                                        // 8行目(空行)
    int input;                            // 9行目
                                        //10行目(空行)
    printf("正数を入力: ");                //11行目
    scanf("%d",&input);                    //12行目
                                        //13行目(空行)
    if(input < 1){                        //14行目
                                        //15行目(空行)
        printf("BAD \n");                //16行目
                                        //17行目(空行)
        return 0;                        //18行目
    }                                    //19行目
                                        //20行目(空行)
    printfact(input);                    //21行目
                                        //22行目(空行)
    return 0;                            //23行目
}                                        //24行目
                                        //25行目(空行)
int prime(int x){                        //26行目
                                        //27行目(空行)
    int k,i;                            //28行目
                                        //29行目(空行)
    if(x<2) return 0;                    //30行目
                                        //31行目(空行)
    for(k=x-1;k>1;k--){                    //32行目
                                        //33行目(空行)
        if(x%i == 0){                    //34行目
                                        //35行目(空行)
            return 0;                    //36行目
        }                                //37行目
    }                                    //38行目
                                        //39行目(空行)
    return 1;                            //40行目
}                                        //41行目
                                        //42行目(空行)
int getprime(int x){                    //43行目
                                        //44行目(空行)
    int i,k;                            //45行目
                                        //46行目(空行)
    if(x<2) return 0;                    //47行目
                                        //48行目(空行)
    for(k=1;x>=k;k++){                    //49行目
                                        //50行目(空行)
        if(x%k == 0){                    //51行目
                                        //52行目(空行)
            if(prime(k)) return k;        //53行目
        }                                //54行目
    }                                    //55行目
                                        //56行目(空行)
    return 0; //0を返す                //57行目
}                                        //58行目
                                        //59行目(空行)
void printfact(int x){                    //60行目
                                        //61行目(空行)
    int i;                                //62行目
    char c='=';                            //63行目
                                        //64行目(空行)
    printf("%d",x);                        //65行目
                                        //66行目(空行)
    if(x==1) printf("=1");                //67行目
    else if(x!=0){                        //68行目
                                        //69行目(空行)
        while(i!=0){                    //70行目
                                        //71行目(空行)
            i=getprime(x);                //72行目
                                        //73行目(空行)
            if(i!=0){                    //74行目
                                        //75行目(空行)
                printf("%c%d",c,i);        //76行目
                                        //77行目(空行)
                c = '*';                //78行目
                x = x/i;                //79行目
            }                            //80行目
        }                                //81行目
    }                                    //82行目
                                        //83行目(空行)
    printf("\n");                        //84行目
                                        //85行目(空行)
    return;                                //86行目
}
------------------------------------------------------------------------------------------------

1>------ ビルド開始: プロジェクト: try, 構成: Debug Win32 ------
1>コンパイルしています...
1>try.c (←誤字編集)
warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
 To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf' の宣言を確認してください。
1>(略)(45) : warning C4101: 'i' : ローカル変数は 1 度も使われていません。
1>(略)(34) : warning C4700: 初期化されていないローカル変数 'i' が使用されます
1>(略)(70) : warning C4700: 初期化されていないローカル変数 'i' が使用されます
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>ビルドログは(略)" に保存されました。
1>try - エラー 0、警告 4
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
画像

組木紙織

Re:whileループでノ問題

#12

投稿記事 by 組木紙織 » 15年前

>> コメントって、ソースコード中のコメントではなくて、提出したソースコードに対する
>> 先生のコメントという意味ですか?

>普通はそうでしょう。
私はそのような経験がなかったから思いつかなかったのです。
大学時代にコードの添削を受けたことなんてないです。

lotusさんへ
>日本語からCに翻訳とのことですが、そういうことはまったく習っていないです。
C言語を習うことが日常の言語からC言語への翻訳方法を習うことではないですか?


素因数分解を通常どのようにやりますか?
まずはを日本語(+数式)で表現します。
それをC言語に直してあげればプログラムが出来ます。

たかぎ

Re:whileループでノ問題

#13

投稿記事 by たかぎ » 15年前

> 私はそのような経験がなかったから思いつかなかったのです。
> 大学時代にコードの添削を受けたことなんてないです。

ソースコードレビューやら静的検証やらで、いうなれば所見が出てくることがあるわけですが、ここでいうコメントはそっちの意味ですね。

> >日本語からCに翻訳とのことですが、そういうことはまったく習っていないです。
> C言語を習うことが日常の言語からC言語への翻訳方法を習うことではないですか?

慣れてくれば最初からCで考えますが、不慣れなうちはそれしかありませんね。
英語なんかでもそうですよね。

ムンバ

Re:whileループでノ問題

#14

投稿記事 by ムンバ » 15年前

<<No:52469
醜すぎるソースで申し訳御座いません。

//try.cpp の報告

1>------ ビルド開始: プロジェクト: training, 構成: Debug Win32 ------
1>コンパイルしています...
1>try.cpp
1>(略)visual studio 2008\projects\training\p46\osarai4.cpp(12) : warning C4996: 'scanf':
This function or variable may be unsafe. Consider using scanf_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf'
の宣言を確認してください。
1>(略)(45) : warning C4101: 'i' : ローカル変数は 1 度も使われていません。
1>(略)(34) : warning C4700: 初期化されていないローカル変数 'i' が使用されます
1>(略)(70) : warning C4700: 初期化されていないローカル変数 'i' が使用されます
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>(略)Visual Studio 2008\Projects\training\Debug\BuildLog.htm" に保存されました。
1>try - エラー 0、警告 4
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

こんな感じでした。
お騒がせしました。おやすみなさい。

ムンバ

Re:whileループでノ問題

#15

投稿記事 by ムンバ » 15年前

もしかして・・・?(激汗

もしかして、このスレのQ∩Aって
お身内の方々の受け答えだったのですか?(汗
そうでしたら、余計な口出しをして申し訳御座いませんでした。
もし、そうでしたら私のレス、お手数ですが早急に全て削除お願い致します。
失礼します。(_ _)

sizuma

Re:whileループでノ問題

#16

投稿記事 by sizuma » 15年前

>>iが初期化されていないのは、printfactだけでなく、primeもそうです。
>ということですが、
>初期化しないとしたらどのようにしてやればいいのですか?

もしかして、各関数で使ってるiとかkが共通だと思ってませんか?
ぱっと見た感想です。


>ムンバさん
ここで質問する意味は分かりませんが、使ってる文字コード表を見ればタブが一つしかないのが分かると思いますけど・・・
もしかしたらいろんなタブがある文字コードがあるのかも知れないのです。
ないとは思いますが。
僕のブラウザの文字エンコーディングを見ると、見慣れぬ文字コードも多々あるので。

#include<stdio.h>
int main(){
printf("%x\n",' ');
printf("%x\n",' ');
return 0;
}

こんなんでも結果は分かりますね。
もしかして質問の意図と違うかもしれません。

たかぎ

Re:whileループでノ問題

#17

投稿記事 by たかぎ » 15年前

> お身内の方々の受け答えだったのですか?(汗

そんなことはありませんので、ご心配なく。

ムンバさんが確認してくださった警告メッセージが、私がいうところの「心を持たないコンパイラの警告メッセージ」に相当します。

たかぎ

Re:whileループでノ問題

#18

投稿記事 by たかぎ » 15年前

うっかりしていました。

> ムンバさん

Cということなので、C++でコンパイルしてはいけません。

sizuma

Re:whileループでノ問題

#19

投稿記事 by sizuma » 15年前

あぁ、たかぎさんのレスで理解しました。
コンパイラの吐き出すメッセージを載せるついでにってことですね。

ムンバ

Re:whileループでノ問題

#20

投稿記事 by ムンバ » 15年前

おはようございます!

たかぎさん、sizumaさん、了解しました。
ご解説ありがとうございます。

---追加---
sizumaさん、例文ありがとうございます。
先ほどは、急いでいたもので
編集・追加になってしまいました。
失礼しました。


---脱字編集--- 画像

lotus

Re:whileループでノ問題

#21

投稿記事 by lotus » 15年前

コメントが遅くなりました。

sizumaさん
>もしかして、各関数で使ってるiとかkが共通だと思ってませんか?
>ぱっと見た感想です。

そうは思っていません。

どのようにしたらいいのか見当がつきません。
どのようにしたら、
教授の「whileループで,iが代入されないまま参照されています。」
を直すことができるのでしょうか?

よければ教えていただけないでしょうか?

たかぎ

Re:whileループでノ問題

#22

投稿記事 by たかぎ » 15年前

> どのようにしたら、
> 教授の「whileループで,iが代入されないまま参照されています。」
> を直すことができるのでしょうか?

それを直すだけなら、変数の定義時に初期化子を指定するか、定義直後に何らかの値を代入すれば済みます。
ただし、ここで考えないといけないのは、教授のコメントに対応することが目的なのか、まともに動かすことが目的なのかということです。

lotus

Re:whileループでノ問題

#23

投稿記事 by lotus » 15年前

たかぎさんありがとうございます。
>それを直すだけなら、変数の定義時に初期化子を指定するか、定義直後に何らかの値を代入すれば済みます。
ということは、

int i = 0;
int k = 0;

としたらいいのですよね?

>ここで考えないといけないのは、教授のコメントに対応することが目的なのか、まともに動かすことが目的なのかということです。

ということですが、
初めのソースをコンパイルして実行すると、正しく動きます。
上の方でたかぎさんは、根本的な問題があるとおっしゃいましたが、
それはどういう意味なのですか?

ムンバ

Re:whileループでノ問題

#24

投稿記事 by ムンバ » 15年前

おはようございます~?!

>どのようにしたら、
>教授の「whileループで,iが代入されないまま参照されています。」
>を直すことができるのでしょうか?

教授のコメント:「whileループで,iが代入されないまま参照されています。」

 ,i だと参照されないのでは無いのでしょうか?

>Title: whileループでノ問題

 の ノ に、何か意味が、あるいは訴えたい事があるのかもしれません。

,i は、代入されてません。

,i を i に変えて、教授に「whileループで、iが代入されないまま参照されています。」
の間違えなのではないでしょうか?
と、質問されては如何でしょうか。
今日は、日曜日なので無理かもしれませんが、次回の通学時に
その教授が見つかれば、お聞きしては如何ですか?

lotus

Re:whileループでノ問題

#25

投稿記事 by lotus » 15年前

ムンバさん
おはようございますw

>Title: whileループでノ問題
の ノ は変換ミスです。 
すみません。

教授のコメントは正しくは
「whileループの最初で,iが代入されないまま参照されています.」
こうでした。
間違っていてすみません。

ムンバ

Re:whileループでノ問題

#26

投稿記事 by ムンバ » 15年前

おはようございます~!
カラス鳴いてますしね。^^

教授のコメントの違いが知りたいので、お時間ある時にでも
ご解説お願い致します。

>教授の「whileループで,iが代入されないまま参照されています。」
が、↓
>教授の「whileループの最初で,iが代入されないまま参照されています.」

に変更されてます。

---編集部位・突っ込むつもりは無いんです。---
半角/全角の記号に変換(変更)されてる事が気になっただけです。
おやすみなさい。
画像

lotus

Re:whileループでノ問題

#27

投稿記事 by lotus » 15年前

ムンバさん

コメントの違いは、教授のコメントを正しく書き直しただけなので
僕にもよくわかりません。

教科書を読んでも描いてなかったので質問なのですが、
初期化子とは、何のことなのですか?
int i = 0;
のようにするのとは違うのですか?

たかぎ

Re:whileループでノ問題

#28

投稿記事 by たかぎ » 15年前

> 初めのソースをコンパイルして実行すると、正しく動きます。

たまたま動くことがあるのかもしれませんが、私の手元ではまともに動きません。

lotus

Re:whileループでノ問題

#29

投稿記事 by lotus » 15年前

>教科書を読んでも描いてなかったので質問なのですが、
>初期化子とは、何のことなのですか?
i>nt i = 0;
>のようにするのとは違うのですか?

たかぎさん

>たまたま動くことがあるのかもしれませんが、私の手元ではまともに動きません

そうなんですか!?

>変数の定義時に初期化子を指定するか、定義直後に何らかの値を代入すれば済みます。

とのことですが、ネットでも初期化子について調べていたのですが、
初期化子のことがよくわかりません。
教えていただけないでしょうか?

ムンバ

Re:whileループでノ問題

#30

投稿記事 by ムンバ » 15年前

その教授のコメントは見るたびに

. が 。

,; が , ;
に、変わってしまう
lotusさんにも解らない、教授のコメントなんですね。
理解できました。再度ありがとうございました。
おやすみなさい。

===================================================

以降、lotusさんの、再度ご質問

>教科書を読んでも描いてなかったので質問なのですが、
>初期化子とは、何のことなのですか?
>int i = 0;
>のようにするのとは違うのですか?

たかぎ

Re:whileループでノ問題

#31

投稿記事 by たかぎ » 15年前

> ネットでも初期化子について調べていたのですが、 初期化子のことがよくわかりません。

ネットもよいですが、体系立った学習にはまともな書籍を使うことをお勧めします。

lotus

Re:whileループでノ問題

#32

投稿記事 by lotus » 15年前

もしよろしければ、
初めに書いたソースを
正しく書き直してくれないでしょうか?

初期化子についても教えてもらえるとうれしいのですが・・・・・

たかぎ

Re:whileループでノ問題

#33

投稿記事 by たかぎ » 15年前

> 初めに書いたソースを
> 正しく書き直してくれないでしょうか?

それはあなたの仕事です。

lotus

Re:whileループでノ問題

#34

投稿記事 by lotus » 15年前

昨年度の後期に買ったC言語入門という教科書を読んでみたのですが、初期化については書いてあったのですが、初期化子についてはかいてなかったためネットでも調べてみたのですが、初期化子がどのようなものかわからなかった次第です><

lotus

Re:whileループでノ問題

#35

投稿記事 by lotus » 15年前

たかぎさん
その通りです
甘えてしまい申し訳ないです。

たかぎ

Re:whileループでノ問題

#36

投稿記事 by たかぎ » 15年前

> 初期化子についても教えてもらえるとうれしいのですが・・・・・

一応これだけ...

初期化子というのは、オブジェクトを定義する際に、オブジェクトの初期値を指定するためのものです。

int a = 123;
char b[/url] = "abc";
double c[/url] = { 1.0, 2.3, 4.5 };

上記のようなオブジェクトの定義があれば、123、"abc"、{ 1.0, 2.3, 4.5 }がそれぞれ初期化子になります。

lotus

Re:whileループでノ問題

#37

投稿記事 by lotus » 15年前

たかぎさん
ありがとうございます
初期化したその値のことを初期化子というんですね。

とりあえず、ここで初期化子を与えたプログラムソースを提出してやりたいと思います。

ながながと超初心はに付き合っていただきありがとうございますm(__)m

lotus

Re:whileループでノ問題

#38

投稿記事 by lotus » 15年前

みなさんありがとうございましたm(__)m

いったん提出してみて教授の採点を待ってみます。

組木紙織

Re:whileループでノ問題

#39

投稿記事 by 組木紙織 » 15年前

どんな値で初期化しても、正しい結果が出るとは思えないのですが。。。

参考までに、サンプルプログラムを書いてみました。
これを解析すれば正しく動くプログラムが作れるはずです。

入力値が2以上のときした正しくうごかない(エラー処理はしてない)のと、
一部実装依存かなと思うところがありますが(確認はしてない)、それは取り合えず無視ということで。

#include <stdio.h>
#define PRINT(x,y)(printf("%d : %d\n",x,y))
void f(int in,int num,int count)
{
if(in<=1?PRINT(num,count),1:0
+in%num==0?f(in/num,num,count+1),1:0)return;
(count!=0)?PRINT(num,count),count=0:1;
f(in,num+1,count);
}
int main()
{
f(1008,2,0);
return 0;
}

/*********************/
追記
一つ言い忘れてましたが、これをそのまま提出しない方がいいと思います。 画像

閉鎖

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