質問なんですが

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

質問なんですが

#1

投稿記事 by リラン » 17年前

時間(秒)を画面に表示したいのですがやり方が分かりません。
たぶんGetNowCount()を使うのだと思うのですが・・・

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

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

管理人

Re:質問なんですが

#2

投稿記事 by 管理人 » 17年前

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

バグ

Re:質問なんですが

#3

投稿記事 by バグ » 17年前

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

リラン

Re:質問なんですが

#4

投稿記事 by リラン » 17年前

回答ありがとうございます。

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

なな

制御文 ループ

#5

投稿記事 by なな » 17年前

お疲れ様です!!昨日はアドバイスありがとうございました!!本日も悩んでいます・・・・
/*
読み込んだ整数を逆から表示するプログラムですが、うまく動作しません。
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:制御文 ループ

#6

投稿記事 by フリオ » 17年前

 
 "num"の値がどう変化しているか確認しましょう。
 

なな

Re:制御文 ループ

#7

投稿記事 by なな » 17年前

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

Hermit

Re:制御文 ループ

#8

投稿記事 by Hermit » 17年前

だめですか・・・そんなにあっさり答えるのね・・・

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

と動作します。

box

Re:制御文 ループ

#9

投稿記事 by box » 17年前

> "num"の値がどう変化しているか確認しましょう。 

という回答に対して

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

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

> 	num=num/10;

の後に

	printf("%d",num);

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

Lbfuvab

Re:制御文 ループ

#10

投稿記事 by Lbfuvab » 17年前

%演算子の意味はあくまで「剰余」つまり割った余りですよ。

なな

Re:制御文 ループ

#11

投稿記事 by なな » 17年前

みなさんアドバイスありがとうございます。
do{
    printf("%d",num%10);

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

Hermit

Re:制御文 ループ

#12

投稿記事 by Hermit » 17年前

>でもなんとなく処理がりかいできていないです。

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

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

なな

Re:制御文 ループ

#13

投稿記事 by なな » 17年前

> >でもなんとなく処理がりかいできていないです。

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


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

なな

Re:制御文 ループ

#14

投稿記事 by なな » 17年前

おはようございます!!

/*
読み込まれた整数値以下である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:制御文 ループ

#15

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

確かに2のべき乗のところが問題ですね。

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

やそ

Re:制御文 ループ

#16

投稿記事 by やそ » 17年前

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

chip

Re:制御文 ループ

#17

投稿記事 by chip » 17年前

どうしてうまくいかないかというと、

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を要所要所に入れて、変数がどう変わっているかを表示させると
バグが見つかりやすいです。

Hermit

Re:制御文 ループ

#18

投稿記事 by Hermit » 17年前

やそさんへ
num=2;
	while(num<=i){
		printf("%d ",num);
		num=2*num;
	}
でしょう。

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

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


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

Lbfuvab

Re:制御文 ループ

#19

投稿記事 by Lbfuvab » 17年前

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:制御文 ループ

#20

投稿記事 by やそ » 17年前

Lbfuvabさん、お疲れ様です。

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

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

やそ

Re:制御文 ループ

#21

投稿記事 by やそ » 17年前

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と出てしまう。
と有りますのでね。

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

GPGA

Re:制御文 ループ

#22

投稿記事 by GPGA » 17年前

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

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

Hermit

Re:制御文 ループ

#23

投稿記事 by Hermit » 17年前

やそさんへ

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

なな

Re:制御文 ループ

#24

投稿記事 by なな » 17年前

皆さんアドバイス&解説ありがとうございます。
無事正常に動作しました。本当にありがとうございます!

GPGA

Re:制御文 ループ

#25

投稿記事 by GPGA » 17年前

>int mypow(int num)
>{
>    return num == 0 ? 1 : 2 << (num - 1);
>}
すごくへんな書き方をしてしまいました。

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

なな

Re:制御文 ループ

#26

投稿記事 by なな » 17年前

新規書き込みを行おうと思いましたが、短いプログラムなので同じところに投稿(質問)させて頂きます。
ご了承下さい。
/*
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;
}

Hermit

Re:制御文 ループ

#27

投稿記事 by Hermit » 17年前

短くても、新規にしてもらえませんか?

chip

Re:制御文 ループ

#28

投稿記事 by chip » 17年前

printfで表示してるのは変数iの値でしょ?
たぶんこれだと0から9を表示しますね。
iはnum(25)を超えることは永遠にありません。

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

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

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

なな

Re:制御文 ループ

#29

投稿記事 by なな » 17年前

できました!ありがとうございます!

閉鎖

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