見取算

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

見取算

#1

投稿記事 by tirimu » 17年前

少し前に学校でC言語を習い始めました。そして本日学校で見取算(フラッシュ暗算)の課題が出ました。

内容はどんな方法を使ってもいいので作成しなさいとの事です。

一応「TmEditCR」を使い挑戦してみました。

乱数で文字を表示、その後出た数字を足してその答えを当てるのようなものです。

しかし\rを使って前に出た数字を上書き上書きで進みたいのですが普通に作ると処理が速いので画面を出した瞬間に答えを求められてしまいます。

出来れば上書きスピードを決めれて目視できるようにしたいのですが良い方法はありますでしょうか?

もしこれならいいのが出来るというのがありましたらそれをご伝授ください。

よろしくお願いします。

管理人

Re:見取算

#2

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

windows.h
がインクルードできる環境ならばsleep関数で時間を止められます。
sleep(1000);
を書けば1000ミリ秒、つまり1秒待つ事になります。
1.2秒待たせたければ
sleep(1200);
とかけばよいでしょう。

管理人

Re:見取算

#3

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

作ってみたので、実行して望んだものであるか確認してみてもらえますか?

要は
printf("%d\r",rand()%1000);
Sleep(1000);

を繰り返せばいいわけです。
ただ、連続して表示すると、2回連続で表示するとわかりにくいので、
以下のように何もないものを上書きして一回消した方がいいです。




#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

int main(){
	int n,sum=0,r;
	srand((unsigned)time(NULL));
	
	for(int i=0;i<3;i++){
		printf("%d秒前\r",3-i);
		Sleep(1000);
	}
	
	for(int i=0;i<5;i++){
		r=rand()%10;
		printf("%d      \r",r);
		sum+=r;
		Sleep(900);
		printf("        \r");
		Sleep(100);
	}
	
	printf("答えを入力してください。\n");
	scanf("%d",&n);
	
	if(sum==n)
		printf("正解!!\n\n");
	else
		printf("不正解。答えは%dです。\n\n",sum);
}
 

tirimu

Re:見取算

#4

投稿記事 by tirimu » 17年前

少し構文エラーが出ましたが何とかなりました。

とても勉強になりました。

本当にありがとうございます。

管理人

Re:見取算

#5

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

エラーが出ました?
scanfは使わないほうがいいよという警告ではなく、どこかおかしかったでしょうか?

box

Re:見取算

#6

投稿記事 by box » 17年前

>	for(int i=0;i<3;i++){

C++ではコンパイルできますが、Cではコンパイルできない、
ということではないでしょうか。

管理人

Re:見取算

#7

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

なるほど、そうでしたね。
Cのコンパイラだとエラーになってしまいますね。

parapara

Re:見取算

#8

投稿記事 by parapara » 17年前

for(1;2;3)文の1の文って、確か変数宣言出来ないはずですよね?
C++だと宣言できるんでしょうか?
前にそこの所でつまづいたもので、教えていただければ幸いです。<!--2

ヒカル

宿題なんです

#9

投稿記事 by ヒカル » 17年前

以下の宿題を出されたんですが、答えの自信がないので教えてください。

Q1.次の変数pのバイト数を答えなさい。
 int ***************p;

Q2.次のプログラムを実行した場合、出力結果を答えなさい。
 int main()
 {
  int a[2];
  int *p;
  int **pp;
 
  a[0] = 10;
  a[1] = 20;
  p = &a[0];
  pp = &p;
  p++;
  printf("%d\n", **pp);
 }

Q3.次の変数stSample のデータサイズを答えなさい。
 struct sample {
  int a;
  char b;
  int c;
 }stSample;

Q4.次の2つのプログラムを実行した結果は同じになりますか?異なりますか?
結果が異なる場合は、なぜ結果が異なるのかを説明してください。

 プログラムA
  void func(int *b)
  {
   *b = 20;
  }
  
  int main(void)
  {
   int a = 10;
  
   func(&a);
   printf("%d\n", a);
  }

 プログラムB
  void func(int b)
  {
   b = 20;
  }
  
  int main(void)
  {
   int a = 10;
  
   func(a);
   printf("%d\n", a);
  }

というのが出されました、よろしくお願いします。

tk-xleader

Re:宿題なんです

#10

投稿記事 by tk-xleader » 17年前

Q1
環境依存(ポインタが4バイトの環境であれば4バイト)
Q2
20
Q3
これも環境依存(パディングなしなら5バイト)
Q4
違う。プログラムAではbが引数のポインタをさすのでそこを書き換えられるが、
Bでは値渡しのため書き換えても意味がない。

となります。

Hermit

Re:宿題なんです

#11

投稿記事 by Hermit » 17年前

>Q3
>これも環境依存(パディングなしなら5バイト)
int サイズが 2byte ならね。

管理人

Re:宿題なんです

#12

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

環境がわからないので何とも言えないですが、わざわざQ3のような問題が出るってことは、パティングを考慮して12バイトだと答えてほしいからじゃないでしょうか?
単純に足して答えになるなら問題にしないのではないかと思います。
コンパイラがVC++だと言うことを前提に話をしますと、

int型は4バイト
char型は1バイトですよね。
単純に今回は4+1+4で9バイトになりそうですが、データをメモリに用意するからにはそのメモリの区分に従って用意しなければならないのですが、
メモリの場所によってアクセスの速さは一定ではないのです。
今回、int型は6バイト目に用意するより、8バイト目に用意したほうが高速にアクセスできるため、
パティングといってコンパイラが空白の領域を作ることがあります。
つまり、埋められた領域を*であらわし、空白の領域を-であらわすとすると、
struct ___{ 
  int __;
  char __; 
  int __; 
}___;

で用意されたひとつの要素は

4
1
4

の容量を必要とするわけですが

****
*---
****
このように確保されるものと思います。

管理人

Re:宿題なんです

#13

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

でもQ3のような問題の場合
「いくらになるか」というだけであって、なぜ12バイトになるのか、答えないといけないわけじゃないので、単に実行した結果を書けばいいんじゃないでしょうか。
実行して解決につながる問題はドンドンプログラムを書いて実行したほうがいいですよ。
#include <stdio.h>

struct sample { 
    int a; 
    char b; 
    int c; 
}stSample; 

int main(){
	printf("%u",sizeof(stSample));
	return 0;
}

実行結果
12
 

tk-xleader

Re:宿題なんです

#14

投稿記事 by tk-xleader » 17年前

>int サイズが 2byte ならね。

そうですね。(と言う自分も実はsizeof(int)==4の環境使っているのですが…)
構造体の正確な大きさはコンパイラによって違いますから、管理人さんのプログラムのようなものを組んで実際に確かめるのがいいと思います。
後、Q1も、正確に知ろうと思うと、
printf("%u",sizeof(p));
とでもして確かめるのが一番早いかもしれません。もともと、環境依存の問題ってどんな解答を求めているのでしょうか?(出題者が)

ヒカル

Re:宿題なんです

#15

投稿記事 by ヒカル » 17年前

みなさん、回答ありがとうございました。
おかげで問題が解決しました。
本当にありがとうございます。

たかぎ

Re:宿題なんです

#16

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

それにしても、これほど環境に依存して結果が異なる課題を出してもよいのでしょうかね。
しかも、環境を指定せずに。
もしかすると、Q1やQ3は、sizeof p とか sizeof(stSample) という解答を期待しているのかもしれません。

ところでQ4ですが、すでに回答が出ている内容のほかに、結果が異なる要因があります。というのは、main 関数に return 文がないため、終了コードが不定になるからです。規格上保証されるわけではありませんが、通常、不定とはいいつつも、同じプログラムを実行し、同じ実行パスを通った場合には、同じ終了コードになる傾向にあります。
なお、C99の場合は return 0; が補われたはずですので不定にはなりません。

閉鎖

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