見取算
見取算
少し前に学校でC言語を習い始めました。そして本日学校で見取算(フラッシュ暗算)の課題が出ました。
内容はどんな方法を使ってもいいので作成しなさいとの事です。
一応「TmEditCR」を使い挑戦してみました。
乱数で文字を表示、その後出た数字を足してその答えを当てるのようなものです。
しかし\rを使って前に出た数字を上書き上書きで進みたいのですが普通に作ると処理が速いので画面を出した瞬間に答えを求められてしまいます。
出来れば上書きスピードを決めれて目視できるようにしたいのですが良い方法はありますでしょうか?
もしこれならいいのが出来るというのがありましたらそれをご伝授ください。
よろしくお願いします。
内容はどんな方法を使ってもいいので作成しなさいとの事です。
一応「TmEditCR」を使い挑戦してみました。
乱数で文字を表示、その後出た数字を足してその答えを当てるのようなものです。
しかし\rを使って前に出た数字を上書き上書きで進みたいのですが普通に作ると処理が速いので画面を出した瞬間に答えを求められてしまいます。
出来れば上書きスピードを決めれて目視できるようにしたいのですが良い方法はありますでしょうか?
もしこれならいいのが出来るというのがありましたらそれをご伝授ください。
よろしくお願いします。
Re:見取算
作ってみたので、実行して望んだものであるか確認してみてもらえますか?
要は
要は
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); }
宿題なんです
以下の宿題を出されたんですが、答えの自信がないので教えてください。
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);
}
というのが出されました、よろしくお願いします。
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);
}
というのが出されました、よろしくお願いします。
Re:宿題なんです
環境がわからないので何とも言えないですが、わざわざQ3のような問題が出るってことは、パティングを考慮して12バイトだと答えてほしいからじゃないでしょうか?
単純に足して答えになるなら問題にしないのではないかと思います。
コンパイラがVC++だと言うことを前提に話をしますと、
int型は4バイト
char型は1バイトですよね。
単純に今回は4+1+4で9バイトになりそうですが、データをメモリに用意するからにはそのメモリの区分に従って用意しなければならないのですが、
メモリの場所によってアクセスの速さは一定ではないのです。
今回、int型は6バイト目に用意するより、8バイト目に用意したほうが高速にアクセスできるため、
パティングといってコンパイラが空白の領域を作ることがあります。
つまり、埋められた領域を*であらわし、空白の領域を-であらわすとすると、
単純に足して答えになるなら問題にしないのではないかと思います。
コンパイラがVC++だと言うことを前提に話をしますと、
int型は4バイト
char型は1バイトですよね。
単純に今回は4+1+4で9バイトになりそうですが、データをメモリに用意するからにはそのメモリの区分に従って用意しなければならないのですが、
メモリの場所によってアクセスの速さは一定ではないのです。
今回、int型は6バイト目に用意するより、8バイト目に用意したほうが高速にアクセスできるため、
パティングといってコンパイラが空白の領域を作ることがあります。
つまり、埋められた領域を*であらわし、空白の領域を-であらわすとすると、
struct ___{ int __; char __; int __; }___; で用意されたひとつの要素は 4 1 4 の容量を必要とするわけですが **** *--- ****このように確保されるものと思います。
Re:宿題なんです
それにしても、これほど環境に依存して結果が異なる課題を出してもよいのでしょうかね。
しかも、環境を指定せずに。
もしかすると、Q1やQ3は、sizeof p とか sizeof(stSample) という解答を期待しているのかもしれません。
ところでQ4ですが、すでに回答が出ている内容のほかに、結果が異なる要因があります。というのは、main 関数に return 文がないため、終了コードが不定になるからです。規格上保証されるわけではありませんが、通常、不定とはいいつつも、同じプログラムを実行し、同じ実行パスを通った場合には、同じ終了コードになる傾向にあります。
なお、C99の場合は return 0; が補われたはずですので不定にはなりません。
しかも、環境を指定せずに。
もしかすると、Q1やQ3は、sizeof p とか sizeof(stSample) という解答を期待しているのかもしれません。
ところでQ4ですが、すでに回答が出ている内容のほかに、結果が異なる要因があります。というのは、main 関数に return 文がないため、終了コードが不定になるからです。規格上保証されるわけではありませんが、通常、不定とはいいつつも、同じプログラムを実行し、同じ実行パスを通った場合には、同じ終了コードになる傾向にあります。
なお、C99の場合は return 0; が補われたはずですので不定にはなりません。