出産前後の痔にはご注意!

C言語の質問です!
ランダムに九九の計算を出題して、キーボードから答えを入力し、正解かどうかを判定するプログラムをつくりたいです。出題の部分をサブ関数、判定の部分をメイン関数として作成する場合、どのようなプログラムの書き方になるのか、教えてください!
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
void kakezan(void);
void answer(void);
void hanrei(void);
int a,b,c;
int main()
{
printf("やめるときは、100と入力してください。\n");
  while(1){
kakezan();
answer();
hantei();
}
return 0;
}
void kakezan(void)
{
a=rand() %10;
b=rand() %10;
printf("%d×%d=",a,b);
}
void answer(void)
{
scanf("%d",&c);
if(c==100)
exit(0);
}
void hantei(void)
{
if(c==a*b)
printf(">>正解\n");
else
printf(">>不正解\n");
printf("\n");
return;
}
一応考えてみたのですが、
ちゃんと、判定→メイン  出題→サブ関数になっているのかなとおもって・・・  
このプログラムであっているのでしょうか??

このQ&Aに関連する最新のQ&A

A 回答 (3件)

int 出題()


{
    printf(問題の出題);
    return 答え;
}

int main()
{
    int 解;
    int 入力;
    
    loop:
        解 = 出題();
        入力 = キーボードからの入力;
        if (入力==100) break;
        else if (入力==解) printf("正解\n");
        else printf("不正解\n");
    end loop:
    return 0;
}

判定をメイン関数でする。というのはmain()でループやIFによって判定するのではないですか?
あなたのコードですと、サブ関数内で判定処理を行っています。
また、終了をサブ関数内で行うのはあまり丁寧ではないですね。

上記では出題()というサブ関数を用意して、出題を出力し正答を返します。
メイン関数に戻ってきたらキー入力を求めて出題()から得た回答と比較してそれぞれ処理します。
それぞれの処理を全部関数化する必要も無いと思うのですがいかがでしょう。
    • good
    • 0

判定をメイン(main)関数の中で行っていませんよ 題意どおりではないと思いますが


# メイン/サブの定義を履き違えているならスルーしてください

%演算子で算出されるデータが意図した物にっているのでしょうか
n % 3 とした式の結果は 0, 1, 2 と成ります
    • good
    • 0

>このプログラムであっているのでしょうか??


あってません。実際にコンパイルしてみましょう。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語のポインタに直接アドレスを割り振りしたい

C言語のポインタに直接アドレスを割り振りしたいのですが、どうしたら良いのでしょうか?

Aベストアンサー

直接アドレスを割り振りたい、というのは
int* pnValue;
pnValue = (int*)0x12345678
ということでしょうか?このようにすればポインタにアドレスを代入することはできるかと思います。

Q関数とメソッドの違い

初歩的な質問なのですが、
関数とメソッドの違いが分からず悩んでいます。
書籍や人によって、
関数とメソッドは同じ物として書いている物もあれば、
メソッドはクラスに関連付いた関数としていたり、
クラスでもpublic関数だけとか、
引数のある物がメソッド、
逆に無い物がメソッド等々…で、
どれが正しいのか良く分からないのです。

関数とメソッドの違いを教えていただけますよう、
お願いいたします。

Aベストアンサー

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。
文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、

>1. 関数とメソッドは同じ物として書いている物もあれば、
バツ。意味的に全く異なります。
'\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p)

> 2.メソッドはクラスに関連付いた関数としていたり、
サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。

> 3.クラスでもpublic関数だけとか、
> 引数のある物がメソッド、
> 逆に無い物がメソッド等々…で、
バツ。引数の数でメソッドで無くなる?そんなバカな!
例えprivateでもメソッドですよ。


オブジェクト指向言語C++のことを考えよう!という文脈ならば、
1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。
2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。
3.そんなわけないでしょう。

オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、
1.○。当然!
2.なにいってるの?
3.サブルーチンとファンクションの違いだ!


と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。
是非とも多数の本を読み比べることをお勧めします。

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です...続きを読む

Q「外部シンボルが未解決」について教えてください

BCCを使ってます。windowsのプログラムで、『外部シンボル 'MyCreateFontが未解決』と言うメッセージが出たのですが、リンクエラーなのでしょうか?
また、『外部シンボル○○が未解決』と表示された場合、どのような処置をすればいいですか。アドバイスをお願いします。
D:\borland\bcc55\lesson>bcc32 -W -w-8057 timer.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
timer.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'MyCreateFont(int, unsigned long, const char *)' が未解決(D:\BORLAND\BCC55\LESSON\TIMER.OBJ が参照

こちらが、宣言の部分です。
#include <windows.h>
#define ID_MYTIMER 100
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
HFONT MyCreateFont(int, DWORD, LPCTSTR);
char szClassName[] = "clock"; //ウィンドウクラス

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)

BCCを使ってます。windowsのプログラムで、『外部シンボル 'MyCreateFontが未解決』と言うメッセージが出たのですが、リンクエラーなのでしょうか?
また、『外部シンボル○○が未解決』と表示された場合、どのような処置をすればいいですか。アドバイスをお願いします。
D:\borland\bcc55\lesson>bcc32 -W -w-8057 timer.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
timer.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'MyCreateFont(int...続きを読む

Aベストアンサー

★アドバイス
・MyCreateFont() 関数の実体のソースはどこにありますか?確認を。
 ちなみに『外部シンボルが未解決』というのはリンクエラーですね。
 エラーメッセージから TIMER.OBJ 内で MyCreateFont() 関数を呼び出しているようです。
 よって、MyCreateFont() 関数の実体をどこにあるのか確認して下さい。
 別のソースに記述されている場合は、そのソースファイルもコンパイルしてリンクさせます。
>HFONT MyCreateFont(int, DWORD, LPCTSTR);
 ↑この関数をコンパイルするソースに記述するなどすれば良いと思います。
・以上。いろいろと確認をして下さい。→できたら全ソースを貼り付けてみて下さい。

Q関数におけるif文とreturn文について

◎1--------------------------------------------
#include<stdio.h>
#include<math.h>

double maxdt(double a,double b);
void disp_sqrt(double n);

int main(void)
{
double mx;

mx=maxdt(22.33,44.55);
printf("mx=%f\n",mx);

disp_sqrt(3.0);
disp_sqrt(-6.0);

return 0;
}

double maxdt(double a,double b)
{
if(a>b)
return a;
else
return b;
}

void disp_sqrt(double n)
{
if(n<=0.0) return;
printf("%f の平方根=%f\n",n,sqrt(n));
}
-----------------------------------------------
◎2-------------------------------------------
#include<stdio.h>
#include<math.h>

double maxdt(double a,double b);
void disp_sqrt(double n);

int main(void)
{
double mx;

mx=maxdt(22.33,44.55);
printf("mx=%f\n",mx);

disp_sqrt(3.0);
disp_sqrt(-6.0);

return 0;
}

double maxdt(double a,double b)
{
if(a>b)
return a;
else
return b;
}

void disp_sqrt(double n)
{
if(n<=0.0){
return;
printf("%f の平方根=%f\n",n,sqrt(n));
}
}
-----------------------------------------------
◎3--------------------------------------------
#include<stdio.h>
#include<math.h>

double maxdt(double a,double b);
void disp_sqrt(double n);

int main(void)
{
double mx;

mx=maxdt(22.33,44.55);
printf("mx=%f\n",mx);

disp_sqrt(3.0);
disp_sqrt(-6.0);

return 0;
}

double maxdt(double a,double b)
{
if(a>b)
return a;
else
return b;
}

void disp_sqrt(double n)
{
if(n<=0.0){
return;
}
else{
printf("%f の平方根=%f\n",n,sqrt(n));
}
}
--------------------------------------------------

◎1は参考書を参考に作ったものです。
◎1は正常に動きます。
以上3つのプログラムで、疑問に思ったのは、関数「void disp_sqrt(double n);」についてなのですが、自分はif文が文が1つでもカッコ{ }を付けたい考えなので、◎1の「void disp_sqrt(double n)」の関数のif文に{}を付けようと思い、まず◎2のように変えたところ、平方根の表示が何も出ませんでした。

return文も文の1つだと考え、◎3のような形は正常に動きました。
return文とprintf文の2つの文があるという考えは間違っているのでしょうか?
後、◎1は何故{ }が無くてもよく、◎2は何も表示されないのでしょうか?
教えていただけると嬉しいです。

◎1--------------------------------------------
#include<stdio.h>
#include<math.h>

double maxdt(double a,double b);
void disp_sqrt(double n);

int main(void)
{
double mx;

mx=maxdt(22.33,44.55);
printf("mx=%f\n",mx);

disp_sqrt(3.0);
disp_sqrt(-6.0);

return 0;
}

double maxdt(double a,double b)
{
if(a>b)
return a;
else
return b;
}

void disp_sqrt(double n)
{
if(n<=0.0) return;
printf("%f の平方根=%f\n",n,sqrt(n));
}
----------------------...続きを読む

Aベストアンサー

「if文」の構文(書き方)は、以下の通りです。

if (評価式) 真の時に実行する文 [else 偽の時に実行する文]

「[」と「]」で括られた「else 偽の時に実行する文」は省略可能です。

上記の「真の時に実行する文」や「偽の時に実行する文」は、以下の2通りあります。

・パターンA
命令文;

・パターンB
{ 1つまたは2つ以上の命令文; }

従って、以下のようになります。

・パターン1
if (評価式) 命令文;

・パターン2
if (評価式) { 1つまたは2つ以上の命令文; }

・パターン3
if (評価式) 命令文; else 命令文;

・パターン4
if (評価式) 命令文; else { 1つまたは2つ以上の命令文; }

・パターン5
if (評価式) { 1つまたは2つ以上の命令文; } else 命令文;

・パターン6
if (評価式) { 1つまたは2つ以上の命令文; } else { 1つまたは2つ以上の命令文; }

まず、上記の6パターンを覚えて下さい。

>◎1
>if(n<=0.0) return;
>printf("%f の平方根=%f\n",n,sqrt(n));

この場合のif文はパターン1です。

「if(n<=0.0) return;」だけがif文です。printf関数の部分は、if文とは無関係です。

もし{}を付けるなら
if(n<=0.0) { return; }
printf("%f の平方根=%f\n",n,sqrt(n));
となります。

if文の条件が真でも偽でも、どっちの場合もprintf関数を通る筈です。

しかし「return文」は「それ以下はすべて無視して、呼び出し元に帰る文」ですから、return文を実行した時はprintf関数以降は実行しません。

逆に言うと「return文を実行しなかった時はprintf関数以降を実行する」と言う事です。

printf関数が呼ばれる条件は「return文を実行しない時」です。

「return文を実行しなかった時はprintf関数以降を実行する」のですから◎3の
>if(n<=0.0){
>return;
>}
>else{
>printf("%f の平方根=%f\n",n,sqrt(n));
>}
と同じ動作をします。

>◎2
>if(n<=0.0){
>return;
>printf("%f の平方根=%f\n",n,sqrt(n));
>}

この場合のif文はパターン2です。

printf関数を呼ぼうとしている所までがif文です。

printf関数が呼ばれる条件は「return文を実行する時」です。

しかし「return文」は「それ以下はすべて無視して、呼び出し元に帰る文」ですから、return文を実行した時はprintf関数以降は実行しません。

return文を実行した時はprintf関数は呼ばれません。呼び出し元に帰ってしまいますから。

return文を実行しない時もprintf関数は呼ばれません。条件が偽の時に実行する文がありませんからね。

つまり、どっちの条件でも、printf関数は呼ばれません。

賢いコンパイラであれば「どこからも実行されない文があるけど、大丈夫か?」と言う警告を出す筈です。

>◎3
>if(n<=0.0){
>return;
>}
>else{
>printf("%f の平方根=%f\n",n,sqrt(n));
>}

説明不要ですね。

以下、プログラムの流れを掴む為の、長~い説明。無視しても可。

elseが無いif文は「else {;}」が省略されていると考えられるので、◎1、◎2に省略された「else {;}」を補ってみます。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) return; else {;}
printf("%f の平方根=%f\n",n,sqrt(n));
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0){
return;
printf("%f の平方根=%f\n",n,sqrt(n));
} else {;}
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0){
return;
}
else{
printf("%f の平方根=%f\n",n,sqrt(n));
}
}

次に「条件が真の時はelse文以降は無視し、条件が偽の時はelse文より前を無視する」のですから、if文のelse文をgoto文に置き換えしてみます。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) { return; goto end_if; }
{;}
end_if:
printf("%f の平方根=%f\n",n,sqrt(n));
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0){
return;
printf("%f の平方根=%f\n",n,sqrt(n));
goto end_if;
}
{;}
end_if:
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0){
return;
goto end_if;
}
printf("%f の平方根=%f\n",n,sqrt(n));
end_if:
}

◎1、◎2、◎3のreturn文は「それ以下はすべて無視して、呼び出し元に帰る文」ですから、goto文に置き換えしてみます。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) { goto end_func; goto end_if; }
{;}
end_if:
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
goto end_if;
}
{;}
end_if:
end_func:
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
goto end_if;
}
printf("%f の平方根=%f\n",n,sqrt(n));
end_if:
end_func:
}

何もしない文の「{;}」を削り、行を整理してみます。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) {
goto end_func;
goto end_if;
}
end_if:
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
goto end_if;
}
end_if:
end_func:
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
goto end_if;
}
printf("%f の平方根=%f\n",n,sqrt(n));
end_if:
end_func:
}

goto文で飛んでしまった行の次の行は、無視されますから、削ります。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) {
goto end_func;
}
end_if:
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
}
end_if:
end_func:
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
}
printf("%f の平方根=%f\n",n,sqrt(n));
end_if:
end_func:
}

goto文が削られラベルだけ残ってしまったラベル文を削ります。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) {
goto end_func;
}
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
}
end_func:
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0){
goto end_func;
}
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

{}の中に文が1つしかない所は、{}を削って、if文を1行にしてみます。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
end_func:
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

「すぐ真下にgotoする」のは「何もしない」と同じなので「{;}」に置き換えます。ついでにラベル文も削ります。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
if(n<=0.0) {;}
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

「else文が無く、真の時に何もしないif文」は「if文が無いのと同じ」ですから削ります。但し「評価式」は消しません。評価式も「何かを実行する」からです。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
n<=0.0;
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

代入もしない、i++などのインクリメントもしない式は、副作用が無いので、削っても構いません。削ります。

◎1
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

◎2
void disp_sqrt(double n)
{
}

◎3
void disp_sqrt(double n)
{
if(n<=0.0) goto end_func;
printf("%f の平方根=%f\n",n,sqrt(n));
end_func:
}

結果、◎1と◎3は、同じプログラムになりました。当然、同じ動作をします。◎2は、関数の中身が何も無くなりました。

これで、◎1と◎3が同じ動きをして、◎2が何も表示しないのが、良く判ると思います。

以下、蛇足。

goto文は「上記のような、プログラムの流れを説明する時だけ」にしか使いません。

C言語では、構造化プログラムのルールを覆すことになるので、goto文を使用してはいけません。

「if文」の構文(書き方)は、以下の通りです。

if (評価式) 真の時に実行する文 [else 偽の時に実行する文]

「[」と「]」で括られた「else 偽の時に実行する文」は省略可能です。

上記の「真の時に実行する文」や「偽の時に実行する文」は、以下の2通りあります。

・パターンA
命令文;

・パターンB
{ 1つまたは2つ以上の命令文; }

従って、以下のようになります。

・パターン1
if (評価式) 命令文;

・パターン2
if (評価式) { 1つまたは2つ以上の命令文; }

・パターン3...続きを読む

Q「#undef」と「#define」の使い方について

代記のとおりですが、

#undef HENSU
#define HENSU 16MAX

という定義をした場合は、#undefで一旦定義を無効にして、
#defineで再定義されるという認識でよろしいでしょうか?

ご存知の方教えてくださいお願いします。

Aベストアンサー

よろしいです。

#ifdef HENSU
#undef HENSU
#endif
#define HENSU ...

の方がより安全かも。

Qじゃんけんゲームをつくったのですが・・・。

自分でじゃんけんゲームを作ってみたのですが、他の人のソースで
どういう風に組んでいるのか研究したいのでソースお願いします。
後、もっとこういう風にした方がいいとおもう所があればおねがいします。
<ソース>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

int main()
{
int i;
int n;

srand(time(NULL));
n=rand()%3;
printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n");
printf("じゃんけんぽい!");
scanf("%d",&i);

if(i==0&&n==0){
printf("あいこです\n");
}
else if(i==0&&n==1){
printf("勝ちました\n");
}
else if(i==0&&n==2)
{
printf("負けました\n");
}

if(i==1&&n==0){
printf("負けました\n");
}
else if(i==1&&n==1){
printf("あいこです\n");
}
else if(i==1&&n==2)
{
printf("勝ちました\n");

}
if(i==2&&n==0){
printf("勝ちました\n");
}
else if(i==2&&n==1){
printf("負けました\n");
}

else if(i==2&&n==2){
printf("あいこです\n");
}
if(i>2)
{
printf("やりなおしてください\n");
}


return 0;
}

自分でじゃんけんゲームを作ってみたのですが、他の人のソースで
どういう風に組んでいるのか研究したいのでソースお願いします。
後、もっとこういう風にした方がいいとおもう所があればおねがいします。
<ソース>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

int main()
{
int i;
int n;

srand(time(NULL));
n=rand()%3;
printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n");
printf("じゃんけんぽい!");
scanf("%d",&i);

if(i==0&&n==0){
printf("...続きを読む

Aベストアンサー

インデントに全角スペースを使ってます。実際にコピーペーストする際には気をつけてください。
勝敗判定のコードをまとめて簡略化していますが、入力エラーチェックを強化したのでコード量は大して変わってません。

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

#define GU 0
#define CHOKI 1
#define PA 2

#define MAX_STRLEN 256
int main()
{
 int i;
 int n;
 char input[MAX_STRLEN];
 char hand[][MAX_STRLEN] = {"グー", "チョキ", "パー"};

 srand(time(NULL));
 n=rand()%3;
 printf("じゃんけんぽい!\n");
 // 手を入力 -- 有効な数値が入るまで繰り返す
 while(1)
 {
  printf("あなたの手(グー:0 チョキ:1 パー:2):");
  fgets(input, MAX_STRLEN, stdin);
  if(sscanf(input, "%d", &i) < 1)
  {
   printf("数値を入力してください。\n");
  }else{
   if(i < GU || i > PA)
   {
    printf("0から2の範囲で入力してください。\n");
   }else{
    break;
   }
  }
 }
 // 自分の手と相手の手を表示
 printf("あなたの手:%s わたしの手:%s\n", hand[i], hand[n]);
 // 勝敗判定
 if(i == n)
 {
  printf("あいこです\n");
 }else{
  if((i + 1) % 3 == n)
  {
   printf("あなたの勝ちです\n");
  }else{
   printf("あなたの負けです\n");
  }
 }

 return 0;
}

インデントに全角スペースを使ってます。実際にコピーペーストする際には気をつけてください。
勝敗判定のコードをまとめて簡略化していますが、入力エラーチェックを強化したのでコード量は大して変わってません。

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

#define GU 0
#define CHOKI 1
#define PA 2

#define MAX_STRLEN 256
int main()
{
 int i;
 int n;
 char input[MAX_STRLEN];
 char hand[][MAX_STRLEN] = {"グー", "チョキ", "パー"};

 srand(time(...続きを読む

QC言語 ポインタと配列の違いが理解できません。

ポインタと配列の違いとは何でしょうか?
自分は学校で習ったのですがあまり深くはやってくれず良く理解していないままです。

・ポインタと配列はしまう場所は同じなのでしょうか?

・単にしまい方、呼び出し方が違うだけなのでしょうか?

・ポインタと使えるところでは配列も使えるのでしょうか?

・そもそもしまわれる場所って何処なのでしょうか?

基礎中の基礎のことなので申し訳ないですが教えてください。
後、「」←このサイト見ろ だけのような解答は無しでお願いします。

Aベストアンサー

基本的な説明は、ポインタとは、アドレスのことで、配列は、ある変数の要素のあつまりを意味します。
  Ex) 文字列100バイトの変数(str)があります。
● 配列  char str[100];
charの要素のデータが100個連続して領域を確保した。

       実際は、100バイトの領域が確保されている。                 100バイトの領域

● ポインタ char *str;
charの要素で扱う領域の先頭ポインタの変数をstrとして定義した。

       実際は、文字列の先頭アドレスを格納さる領域が確保されている。     32bitマシンでは4バイトの領域


ポインタと配列はしまう場所は同じなのでしょうか?
A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。

  Ex) 文字列100バイトの変数(str)があります。
    このstrに文字をセットする場合は、下記の方法があります。

    char str[100]; 配列

char *strp;    ポインタ

    ●配列の場合
      str[0] = 'A';          配列strの0番目に'A'をセット
      str[1] = 'B';
      str[2] = 'C';

    ●ポインタの場合
     memcpy(str, "ABC", 3);
☆ memcpyの引数1の属性はポインタです。
        配列の名称を引数に指定した場合は、自動的にポインタ扱いです。

       又は

      *strp = (char *)str;
       strp = 'A'           strpが指すポインタに'A'をセット
(strp+1)= 'B'         strpが指すポインタ+1に'A'をセット
(strp+2) = 'C'


上記のプログミングで、最終結果は同じとなります。

   
単にしまい方、呼び出し方が違うだけなのでしょうか?
A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。


ポインタと使えるところでは配列も使えるのでしょうか?
A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。

そもそもしまわれる場所って何処なのでしょうか?
A.『その領域にセットされる値』と考えて大丈夫です。

基本的な説明は、ポインタとは、アドレスのことで、配列は、ある変数の要素のあつまりを意味します。
  Ex) 文字列100バイトの変数(str)があります。
● 配列  char str[100];
charの要素のデータが100個連続して領域を確保した。

       実際は、100バイトの領域が確保されている。                 100バイトの領域

● ポインタ char *str;
charの要素で扱う領域の先頭ポインタの変数をstrとして定義した。

   ...続きを読む


人気Q&Aランキング