ページ 11

質問なんですが

Posted: 2007年12月06日(木) 21:08
by リラン
時間(秒)を画面に表示したいのですがやり方が分かりません。
たぶんGetNowCount()を使うのだと思うのですが・・・

回答よろしくお願いします。

それと処理速度を一定にした方がいいのでしょうか?

Re:質問なんですが

Posted: 2007年12月07日(金) 00:55
by 管理人
以前GetNowCountを呼んだ時の値と、今の瞬間GetNowCountを呼んだ時の値をひくと、その間のミリ秒が得られる事を利用します。
ミリ秒とは1/1000秒のことです。
http://dixq.net/g/#s5
こちらで処理速度を一定にする方法を書いていますのでよければご覧下さい。

Re:質問なんですが

Posted: 2007年12月07日(金) 09:10
by バグ
私が作ったクラスです。
Main.cppがサンプルプログラムで、Timer.cppとTimer.hがクラスのソースです。
DxLibは使用していませんが、当然、DxLibとの併用も可能です。
まぁ、こんなのもあります…という感じで…(^_^;)
Windows.hを使用しない、標準関数のみのバージョンもありますので、もし希望があれば公開しますね。

Re:質問なんですが

Posted: 2007年12月07日(金) 18:02
by リラン
回答ありがとうございます。

管理人さんがおっしゃったミリ秒が1/1000秒ってことは
ミリ秒が1000で割れたときにcounter++して
そのcounterを画面に表示すれば時間(秒)を表示することが
できるということですか?<!--1

制御文 ループ

Posted: 2007年12月17日(月) 21:13
by なな
お疲れ様です!!昨日はアドバイスありがとうございました!!本日も悩んでいます・・・・
/*
読み込んだ整数を逆から表示するプログラムですが、うまく動作しません。
1234と入力すると、4321と出力させたいのですが、4endと出てしまいます。
num=num%10;当たりが間違っているのでしょうか?
*/

#include <stdio.h>

int main(void) {
	int num;
	
	do{
		puts("整数入力");
		scanf("%d",&num);
	}while(num<0);

	do{
		num=num%10;
		printf("%d",num);
		num=num/10;
	}while(num>0);

	puts("end");
	return 0;
}

Re:制御文 ループ

Posted: 2007年12月17日(月) 21:17
by フリオ
 
 "num"の値がどう変化しているか確認しましょう。
 

Re:制御文 ループ

Posted: 2007年12月17日(月) 22:04
by なな
まったくだめです・・・・・・

Re:制御文 ループ

Posted: 2007年12月17日(月) 22:15
by Hermit
だめですか・・・そんなにあっさり答えるのね・・・

num = 1234 % 10 -----> num は、4
num = 4 / 10 --------> num は、0

と動作します。

Re:制御文 ループ

Posted: 2007年12月17日(月) 22:17
by box
> "num"の値がどう変化しているか確認しましょう。 

という回答に対して

> まったくだめです・・・・・・

と返すのではなく、例えば、

> 	num=num/10;

の後に

	printf("%d",num);

を追加するだけでも、解決へ近づくはずです。

Re:制御文 ループ

Posted: 2007年12月17日(月) 22:46
by Lbfuvab
%演算子の意味はあくまで「剰余」つまり割った余りですよ。

Re:制御文 ループ

Posted: 2007年12月17日(月) 22:55
by なな
みなさんアドバイスありがとうございます。
do{
    printf("%d",num%10);

    num=num/10;
}while(num>0);
としたらできました!でもなんとなく処理がりかいできていないです。

Re:制御文 ループ

Posted: 2007年12月17日(月) 23:11
by Hermit
>でもなんとなく処理がりかいできていないです。

何となく理解できていないところは、どこの部分ですか?
どういう動作をさせたくて、その部分を書いていますか?
その部分で、どういう動作をすると思いますか?

それくらいの情報が書けるようになりましょう。

Re:制御文 ループ

Posted: 2007年12月18日(火) 06:30
by なな
> >でもなんとなく処理がりかいできていないです。

紙と鉛筆で書き出して行ったら処理内容がようやく理解できました。


>
> 何となく理解できていないところは、どこの部分ですか?
> どういう動作をさせたくて、その部分を書いていますか?
> その部分で、どういう動作をすると思いますか?
>
> それくらいの情報が書けるようになりましょう。
>

Re:制御文 ループ

Posted: 2007年12月18日(火) 06:54
by なな
おはようございます!!

/*
読み込まれた整数値以下である2のベキ乗の数を昇順に出力するというプログラム
ですが、なにか微妙に動きが違います・・・。
19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。
2のベキ乗がミソかな~??
*/

#include <stdio.h>

int main(void) {
	int i,j,num;

	do{
		puts("数値入力");
		scanf("%d",&i);
			if(i<=0){
				puts("負の数は入力不可");
			}
	}while(i<=0);
	
	j=1;
	while(j<=i){
		num=j*j;
		if(num<=i){
			printf("%d ",num);
		}
		j++;
	}

	return 0;
}

Re:制御文 ループ

Posted: 2007年12月18日(火) 07:58
by 組木紙織
確かに2のべき乗のところが問題ですね。

pow()という関数があるので、それを使いましょう。
但しそのままでは使えません。使い方は自分で調べてください。

Re:制御文 ループ

Posted: 2007年12月18日(火) 16:41
by やそ
 ・
 ・
 ・
 ・
iを入力後のロジック
num=1;
	while(num<=i){ //iは2以上の数で入力されて欲しいな。
                  num=2*num; //2のべき乗
		printf("%d ",num);
	}
	return 0;
}
pow関数もイイっすけど、iが2以上を前提と出来るならコレで十分な気がします。

Re:制御文 ループ

Posted: 2007年12月18日(火) 19:23
by chip
どうしてうまくいかないかというと、

j=1;
while(j<=i){
num=j*j;
if(num<=i){
printf("%d ",num);
}
j++;
}

jには初め1が入ってます。それをj*jで二乗するのだから出力は1です。
その後、jに1追加して、2にしています。なので2が二乗されて出力は4。
同様にして 9, 16, 25, ... となって出力されてしまうのです。


他の方が回答されてるように、

num = j*j; が諸悪の根源であり、2の累乗なのだから、
2を重ねてかける必要があるので、
j = j*2; が正しい。 j++ は必要ありません。


思い通りに動かないときは、プログラムがどう動いているか一つずつ追って行くと
いいと思います。
あと、初めのうちはprintfを要所要所に入れて、変数がどう変わっているかを表示させると
バグが見つかりやすいです。

Re:制御文 ループ

Posted: 2007年12月18日(火) 19:31
by Hermit
やそさんへ
num=2;
	while(num<=i){
		printf("%d ",num);
		num=2*num;
	}
でしょう。

ななさんへ
if(i<=0){
		puts("負の数は入力不可");
	}
0 は、負の数ではないのですが・・・言葉がちょっと変ですね。

あと、2 の 0 乗は 1 なので、それを含めるなら、 num=2; のところを、num=1; にしてもいい。


もうひとつ・・・違うプログラムでの質問なのだから、新規書き込みの方がいい気がします。

Re:制御文 ループ

Posted: 2007年12月18日(火) 19:48
by Lbfuvab
int mypow(int num){   //2のべき乗を返す
    int ret=1;
    while(num--)
        ret*=2;
    return ret;
}
で
int main(){
    int i=0,num;
    
    while(1){
        printf("正の数を入力せよ\n");
        scanf("%d",num);
        if(num>0)
            break;
    }
    while(mypow(i)<=num)
        printf("2の%d乗は%d\n",i,mypow(i++);
    return 0;
でいいかと

Re:制御文 ループ

Posted: 2007年12月18日(火) 20:42
by やそ
Lbfuvabさん、お疲れ様です。

>19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。

と言う要件定義がありますので、Lbfuvabさんのロジックでは最初に呼ばれるmypow(i)ではi=0なので
結果が違ってしまいませんか?
出力結果は2^1(2の1乗)から始まるようです。

Re:制御文 ループ

Posted: 2007年12月18日(火) 20:56
by やそ
Hermitさん お疲れ様です。
num=2;
	while(num<=i){
		printf("%d ",num);
		num=2*num;
	}
ですが、i=1だった場合どうでしょう?
1も立派な正の数です。
while判定でいきなりはじかれて、1回もprintf("%d ",num);
を実行しないで終わります。
それはちょっとさびしい感じです。
私の提示したロジックのコメントでは
//iは2以上の数で入力されて欲しいな。
と書いていますが、実際には1の時も考慮しています。
(1じゃ余りに味気ないからコメントしただけですばい)
で、0は入力段階で弾かれますから考慮外。
まあ、確かに文言は違和感を感じますが^^;
要件定義にも
>19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。
と有りますのでね。

>もうひとつ・・・違うプログラムでの質問なのだから、新規書き込みの方がいい気がします。
わたしも同感です。途中から「あれ?」って思いましたから。

Re:制御文 ループ

Posted: 2007年12月18日(火) 20:59
by GPGA
>printf("2の%d乗は%d\n",i,mypow(i++);
関数内の引数の評価の順番は不定だったと思うので、この一行でiが++されるタイミングは環境依存に
なるのではないでしょうか。

後、2のべき乗計算ならループを使わず、シフト演算子を使用したほうが高速です。
int mypow(int num)
{
    return num == 0 ? 1 : 2 << (num - 1);
}
 

Re:制御文 ループ

Posted: 2007年12月18日(火) 21:01
by Hermit
やそさんへ

>19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。
とあるのに、32 まで出てくるのはいいのでしょうか?

Re:制御文 ループ

Posted: 2007年12月18日(火) 21:08
by なな
皆さんアドバイス&解説ありがとうございます。
無事正常に動作しました。本当にありがとうございます!

Re:制御文 ループ

Posted: 2007年12月18日(火) 21:53
by GPGA
>int mypow(int num)
>{
>    return num == 0 ? 1 : 2 << (num - 1);
>}
すごくへんな書き方をしてしまいました。

int mypow(int num)
{
    return 1 << num;
}
 

Re:制御文 ループ

Posted: 2007年12月18日(火) 22:02
by なな
新規書き込みを行おうと思いましたが、短いプログラムなので同じところに投稿(質問)させて頂きます。
ご了承下さい。
/*
1234567890を繰り返し表示するプログラムを作成。なお、表示
する数字は読み込まれた数値の個数とする。
例)整数を入力して下さい:25
    1234567890123456789012345
  と実行結果になるそうです。

私のプログラムを実行すると
整数を入力して下さい:25
→無限ループ状態・・・・になってしまいます。。

if文のところがおかしいとは分かっています。アドバイス
よろしくお願いします。

*/
#include <stdio.h>

int main(void) {
	int i,num;

	scanf("%d",&num);
	i=0;
	while(i<num){
		printf("%d",i);
			if(!(i%10)){
				i=0;
			}
		i++;
	}
	return 0;
}

Re:制御文 ループ

Posted: 2007年12月18日(火) 22:15
by Hermit
短くても、新規にしてもらえませんか?

Re:制御文 ループ

Posted: 2007年12月18日(火) 22:22
by chip
printfで表示してるのは変数iの値でしょ?
たぶんこれだと0から9を表示しますね。
iはnum(25)を超えることは永遠にありません。

if文のところでiが10になるたびに0を代入しているからいつまでたっても終わらない。

表示するのはiではなく、iを10で割った余りです。

ほとんどできてるんだから、ここで質問するのはもったいないです。

Re:制御文 ループ

Posted: 2007年12月19日(水) 20:38
by なな
できました!ありがとうございます!