学校の課題で全くわからなくて…

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

学校の課題で全くわからなくて…

#1

投稿記事 by asbel » 9年前

ヌメロンの
相手のカード3枚はランダムに決定(乱数)
high and low, slash, targetのカードを使用すること(関数の使用)
何ターンで正解したか表示させること
というルールでC言語でプログラムを打つ場合どう書けばいいのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 学校の課題で全くわからなくて…

#2

投稿記事 by h2so5 » 9年前

課題の丸投げは禁止です。

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#3

投稿記事 by asd » 9年前

相互リンクをしないマルチポストも禁止です。
http://detail.chiebukuro.yahoo.co.jp/qa ... 1132043706
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#4

投稿記事 by asbel » 9年前

ルールを知らず適当な質問申し訳ないです。
提出期限が明日なので適当な感じになってしまったのですが実は授業で使ってたファイルを消してしまい参考にしながらも出来ない状況になっていまして
自分で頑張ってみるも乱数のプログラムがギリギリといったところです関数の部分が全くわからないのですがどうすればいいのかと思い質問しました

asbel

Re: 学校の課題で全くわからなくて…

#5

投稿記事 by asbel » 9年前

asbel さんが書きました:ルールを知らず適当な質問申し訳ないです。
提出期限が明日なので適当な感じになってしまったのですが実は授業で使ってたファイルを消してしまい参考にしながらも出来ない状況になっていまして
自分で頑張ってみるも乱数のプログラムがギリギリといったところです関数の部分が全くわからないのですがどうすればいいのかと思い質問しました

コード:

 
#include <stdio.h>
#include <stdlib.h>
int main(void){

	int x, y, z;

	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10; 
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}

	printf("相手カード\n");
	printf("%d%d%d\n\n", x, y, z); 



	return 0;
}
 
このような感じにしました

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#6

投稿記事 by asd » 9年前

asbel さんが書きました:
asbel さんが書きました:ルールを知らず適当な質問申し訳ないです。
提出期限が明日なので適当な感じになってしまったのですが実は授業で使ってたファイルを消してしまい参考にしながらも出来ない状況になっていまして
自分で頑張ってみるも乱数のプログラムがギリギリといったところです関数の部分が全くわからないのですがどうすればいいのかと思い質問しました
いろいろと確認することがありますが、
・本来はお互いが3桁数字を用意していて、交互に攻撃と防御(相手の数字を予想するフェーズと相手の提示した数字と自分の数字からEAT、BITEを返す)を行うが、
 今回は相手の数字を一方的に当てる(CPU側は攻撃してこない)のみでOKですか?
・提示されているプログラムではCPU側の3桁数字を選定するところまで記載されていますが、その先の数字入力と判定(入力された数字とCPUの数字からEATとBITEを返す)部分は自力で書けますか?

期限が明日の何時かによっては結構ギリギリな気がします。
アイテム利用以外の基本処理(数値入力と判定、ターン数カウント)が出来上がっていれば、アイテム関数を実装するだけで済むのですが。

基本処理が自力で書けない場合には、
1.ユーザーに数値を入力してもらう
2.入力してもらった数値とCPU側正解数値との比較
3.2の比較結果からEATとBITEを返す、正解ならターン数を表示して終了
の流れで基本処理を書くことになりますので、あらかじめ不明な部分を調べておくといいかと思います。

基本処理が自力でかける場合にはまずそれを書いたプログラムを提示していただいて、
アイテム処理の追加で何がわからないかを具体的に質問してもらえればと思います。
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#7

投稿記事 by asbel » 9年前

いろいろと確認することがありますが、
・本来はお互いが3桁数字を用意していて、交互に攻撃と防御(相手の数字を予想するフェーズと相手の提示した数字と自分の数字からEAT、BITEを返す)を行うが、
 今回は相手の数字を一方的に当てる(CPU側は攻撃してこない)のみでOKですか?

A.はい、一方的に当てるということで間違いないです。

・提示されているプログラムではCPU側の3桁数字を選定するところまで記載されていますが、その先の数字入力と判定(入力された数字とCPUの数字からEATとBITEを返す)部分は自力で書けますか?

A.申し訳ないです・・・授業ではgetsやputsを使うのか?ということはわかるのですが何時間かやってみても恥ずかしながら出来なかったです

期限が明日の何時かによっては結構ギリギリな気がします。
アイテム利用以外の基本処理(数値入力と判定、ターン数カウント)が出来上がっていれば、アイテム関数を実装するだけで済むのですが。

A,明日の1限なのでなかなかぎりぎりです・・・

基本処理が自力で書けない場合には、
1.ユーザーに数値を入力してもらう
2.入力してもらった数値とCPU側正解数値との比較
3.2の比較結果からEATとBITEを返す、正解ならターン数を表示して終了
の流れで基本処理を書くことになりますので、あらかじめ不明な部分を調べておくといいかと思います。

頑張って調べながら自分でもやってみようと思います

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#8

投稿記事 by asd » 9年前

asbel さんが書きました:いろいろと確認することがありますが、
asd さんが書きました: ・提示されているプログラムではCPU側の3桁数字を選定するところまで記載されていますが、その先の数字入力と判定(入力された数字とCPUの数字からEATとBITEを返す)部分は自力で書けますか?
A.申し訳ないです・・・授業ではgetsやputsを使うのか?ということはわかるのですが何時間かやってみても恥ずかしながら出来なかったです
とりあえず、getsを使って「ユーザーに3桁の数値を入力してもらい、受け取った数値を桁ごとに分離する」処理は書けますか?
授業でgets関数の使い方は習っているかと思いますので。
asbel さんが書きました:
asd さんが書きました: 期限が明日の何時かによっては結構ギリギリな気がします。
アイテム利用以外の基本処理(数値入力と判定、ターン数カウント)が出来上がっていれば、アイテム関数を実装するだけで済むのですが。
A,明日の1限なのでなかなかぎりぎりです・・・
少なくとも基本処理は早い段階で作り上げないと厳しくなりそうです。
私もここにずっと張り付くわけにもいきませんし、授業である程度やっていて一部不明なだけならまだしも、
一切何も書けないとなると1から全部教えないといけないわけで…。

とりあえず基本処理のうち、上記の「入力受付と桁分離」をやってもらい、それができたら「相手の数字との比較、判定処理」を
実装してみてください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#9

投稿記事 by asbel » 9年前

asd さんが書きました:
asbel さんが書きました:いろいろと確認することがありますが、
少なくとも基本処理は早い段階で作り上げないと厳しくなりそうです。
私もここにずっと張り付くわけにもいきませんし、授業である程度やっていて一部不明なだけならまだしも、
一切何も書けないとなると1から全部教えないといけないわけで…。

とりあえず基本処理のうち、上記の「入力受付と桁分離」をやってもらい、それができたら「相手の数字との比較、判定処理」を
実装してみてください。
本当に申し訳ないんですがgets関数に関して知識がほとんど無く友達に聞いても友達もgetsはやってなかった気がすると言われまったくわからない状況になっています。
一応調べてgets関数ではないですがこの形にしたのですがこれではどこがダメなのか指摘いただけると嬉しいです

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void){

	int x, y, z;
	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);

}

int yoso(void){
	int x, y, z;
	int yosou, yosoux, yosouy, yosouz;
	printf("自分の予想3桁目:");
	scanf_s("%d", &yosouz);
	printf("自分の予想2桁目:");
	scanf_s("%d", &yosouy);
	printf("自分の予想1桁目:");
	scanf_s("%d", &yosoux);
	yosou = yosoux + yosouy * 10 + yosouz * 100;
	printf("自分の予想:%d\n", yosou);
	return 0;
}

	

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#10

投稿記事 by asd » 9年前

asbel さんが書きました: 本当に申し訳ないんですがgets関数に関して知識がほとんど無く友達に聞いても友達もgetsはやってなかった気がすると言われまったくわからない状況になっています。
一応調べてgets関数ではないですがこの形にしたのですがこれではどこがダメなのか指摘いただけると嬉しいです
別にgetsに限定するつもりはないので、授業で扱ったユーザー入力関数を使ってもらえればOKですよ。
(質問者さんがgets関数を提示していたのでそれを使ってくださいと書いただけですので^^;)
授業でscanf_s関数を使ったのですか?

また確認ですが、作成したプログラムをコンパイルして実行してみましたか?
実際に動かしてみて、自分の思うとおりに動かないのであれば、
・自分が想定していた動作
・実際の動作
を提示してもらえればと思います。

上記を試してもらえると、自分の予想入力ができないことがわかるかと思います。
#場合によってはコンパイルさえ通らないかも。

あと気になった点として、
・yoso関数内にてx,y,zを宣言してますが特に使っていないようです
・同じくyoso関数内にて桁ごとに入力をさせたのであれば、わざわざ一つの数値にしなくてもいいような気がします
 →表示するだけなら相手の数字を表示しているのと同じ方法が使えるかと
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#11

投稿記事 by asbel » 9年前

asd さんが書きました: 別にgetsに限定するつもりはないので、授業で扱ったユーザー入力関数を使ってもらえればOKですよ。
(質問者さんがgets関数を提示していたのでそれを使ってくださいと書いただけですので^^;)
授業でscanf_s関数を使ったのですか?

授業では普通にscanfをつかったのですが授業ではVS2008で自宅ではVS2013を使っててなにかが違うのかエラーがでるので調べたところ_sを付ければ消えると書いてあったのでそうしています

また確認ですが、作成したプログラムをコンパイルして実行してみましたか?
実際に動かしてみて、自分の思うとおりに動かないのであれば、
・自分が想定していた動作
・実際の動作
を提示してもらえればと思います。

上記を試してもらえると、自分の予想入力ができないことがわかるかと思います。
#場合によってはコンパイルさえ通らないかも。

はい、ご指摘の通り自分の予想と違った結果となりました。自分の予想では
相手カード
○○○

自分の入れた数字
○○○

となる予想だったのですがなぜか自分の数字を入れることができませんでした。
正直言って自分では何がいけないのかよくわかりません。。。
良かったら何かアドバイスをくださるとうれしいです

あと気になった点として、
・yoso関数内にてx,y,zを宣言してますが特に使っていないようです
・同じくyoso関数内にて桁ごとに入力をさせたのであれば、わざわざ一つの数値にしなくてもいいような気がします
 →表示するだけなら相手の数字を表示しているのと同じ方法が使えるかと
このようにしてみたのですが気になった点はこういうことでしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void){

	int x, y, z;
	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);
	return 0;
}

int yoso(void){
	int yosou, yosoux, yosouy, yosouz;
	printf("自分の予想3桁目:");
	scanf_s("%d", &yosouz);
	printf("自分の予想2桁目:");
	scanf_s("%d", &yosouy);
	printf("自分の予想1桁目:");
	scanf_s("%d", &yosoux);
	printf("自分の予想\n");
	printf("%d%d%d\n\n", yosoux, yosouy, yosouz);
	return 0;
}

asbel

Re: 学校の課題で全くわからなくて…

#12

投稿記事 by asbel » 9年前

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void){

	int x, y, z;
	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);


	int  yosoux, yosouy, yosouz;
	printf("自分の予想3桁目:");
	scanf_s("%d", &yosouz);
	printf("自分の予想2桁目:");
	scanf_s("%d", &yosouy);
	printf("自分の予想1桁目:");
	scanf_s("%d", &yosoux);
	printf("自分の予想\n");
	printf("%d%d%d\n\n", yosoux, yosouy, yosouz);
	return 0;
}
こういうことでしょうか?

asbel

Re: 学校の課題で全くわからなくて…

#13

投稿記事 by asbel » 9年前

一応少しずつやってみてはいますがこれはこれで大丈夫でしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void){

	int x, y, z;
	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);

	
	int  yosoux, yosouy, yosouz;
	do{
	printf("自分の予想3桁目:");
	scanf_s("%d", &yosouz);
	printf("自分の予想2桁目:");
	scanf_s("%d", &yosouy);
	printf("自分の予想1桁目:");
	scanf_s("%d", &yosoux);
	printf("自分の予想\n");
	printf("%d%d%d\n\n", yosoux, yosouy, yosouz);

} while (yosoux != x, yosouy != y, yosouz != z);

			printf("正解\n");
}
		

asbel

Re: 学校の課題で全くわからなくて…

#14

投稿記事 by asbel » 9年前

このようにしてみたんですがなぜか正解の数字があってれば順番はなんでもいい的な結果になってしまいます。何故そうなるのかご指摘いただけたら嬉しいです

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void){

	int x, y, z, a;
	a = 0;
	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);

	
	int  yosoux, yosouy, yosouz;
	do{
	printf("自分の予想1桁目:");
	scanf_s("%d", &yosoux);
	printf("自分の予想2桁目:");
	scanf_s("%d", &yosouy);
	printf("自分の予想3桁目:");
	scanf_s("%d", &yosouz);
	printf("自分の予想\n");
	printf("%d%d%d\n\n", yosoux, yosouy, yosouz);
	a = a + 1;
	} while ((yosoux != x) && (yosouy != y) && (yosouz != z));
	

			printf("正解\n");
			printf("%d←正解までにかかった回数\n",a);
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 学校の課題で全くわからなくて…

#15

投稿記事 by みけCAT » 9年前

asbel さんが書きました:このようにしてみたんですがなぜか正解の数字があってれば順番はなんでもいい的な結果になってしまいます。何故そうなるのかご指摘いただけたら嬉しいです
asbel さんが書きました:

コード:

} while ((yosoux != x) && (yosouy != y) && (yosouz != z));
&&ではなく、||の方がいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#16

投稿記事 by asd » 9年前

環境はVS2008(VS2013)だったのですね。
私はgcc環境で検証してました。質問者さんの環境で動作しているのであればそれでOKです。

逐一私に確認しながらだと時間がかかりますので、実際に動かしてみた結果、自分の思い通りに動いてかつ、
本来の課題に沿った動きであれば一旦OKとして進めていきましょう。

あと最初の段階ではyoso関数を使っており、その関数を呼び出していなかったため自分の入力処理が行われなかった形になります。
アイテム3種は関数で定義するという条件があるので、基本処理を進めながら、関数の定義と呼び出し方についても合わせて調べておくとよいと思います。

ちなみに、yoso関数のままmain関数から呼び出してあげれば関数を分けた状態でも期待した動作をしたと思いますよ。
オフトピック
BBcodeの使い方がちょっと間違っているのか、私の引用部分に質問者さんのコメントが入り込んでしまっています。
可能なら投稿前にプレビューを確認していただき、ほかの回答者さんの引用部分に自分のコメントが入り込んでしまっていないかを確認するとよいと思います。
書き込みしている間に更新があったので追記です。
すべての数字が正しいわけではないのに終わってしまうのはdo-whileループの継続条件がおかしいからです。

コード:

    } while ((yosoux != x) && (yosouy != y) && (yosouz != z));
この部分ですが、
yosouxとxが異なっている
かつ(&&)
yosouyとyが異なっている
かつ(&&)
yosouzとzが異なっている
場合にループを繰り返します。

裏を返すと1つでも数字と位置があっていればループの継続条件を満たしません。
1つでも数字と位置が間違っている場合にループを継続したいので正しい継続条件は以下になるはずです。

yosouxとxが異なっている
または
yosouyとyが異なっている
または
yosouzとzが異なっている
またはに該当する演算子を入れてみましょう。

追記:
みけCATさんとかぶってしまった(汗)
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#17

投稿記事 by asd » 9年前

継続条件が正しく直せたら次はEATとBITEの数を数える処理が必要ですね。
変数を別に用意して位置も数字もあっている場合はEATをカウントアップ、位置は違うけど数字があっている場合はBITEをカウントアップするようにしてみましょう。
EATとBITEはユーザーの入力ごとに初期化するのをお忘れなく。
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#18

投稿記事 by asbel » 9年前

EATとBITEの設定について正直条件が複雑でなにがどうすればいいのかさっぱり・・・よければなにかアドバイスをもらえませんか?

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#19

投稿記事 by asd » 9年前

まず継続条件の修正はできたのですか?
回答をもらったからにはきちんと答えるようにしないと回答がつかなくなってしまいますよ。
#多少の行き違いは仕方ないですが。
asbel さんが書きました:EATとBITEの設定について正直条件が複雑でなにがどうすればいいのかさっぱり・・・よければなにかアドバイスをもらえませんか?
ループの継続条件のところでEATの判定に使えそうな条件式は使ってるじゃないですか。

正解が123で入力が130だった場合にEATはいくつでBITEはいくつでしょうか?
それを計算するときにどうやって自分で判定しましたか?
そのやり方をプログラム上で再現するだけですよ。

一応伏せておきますので、なるべく見ずにやってもらいたいところです。
► スポイラーを表示
この投稿後しばらく離席するのですぐの反応は難しいです。
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#20

投稿記事 by asbel » 9年前

このようにしてみたのですがうまくいきませんここからどう変えていけばよいか指摘お願いしたいです

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void){

	int x, y, z, a, b, e;
	a = 0;
	b = 0;
	e = 0;

	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf_s("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);


	int  yosoux, yosouy, yosouz;
	do{
		printf_s("自分の予想1桁目:");
		scanf_s("%d", &yosoux);
		printf_s("自分の予想2桁目:");
		scanf_s("%d", &yosouy);
		printf_s("自分の予想3桁目:");
		scanf_s("%d", &yosouz);
		printf_s("自分の予想\n");
		printf_s("%d%d%d\n\n", yosoux, yosouy, yosouz);
		a = a + 1;
	} while
	(yosoux != x) || (yosouy != y) || (yosouz != z);
	(yosoux == x); e = e + 1;
	(yosouy == y); e = e + 1;
	(yosouz == z); e = e + 1;



	(yosoux == y); b = b + 1;
	(yosoux == z); b = b + 1;
	(yosouy == x); b = b + 1;
	(yosouy == z); b = b + 1;
	(yosouz == x); b = b + 1;
	(yosouz == y); b = b + 1;



			printf("正解\n");
			printf("%d←正解までにかかった回数\n",a);
}

asbel

Re: 学校の課題で全くわからなくて…

#21

投稿記事 by asbel » 9年前

申し訳ないです教えてもらってる側なのに配慮が足りてませんでした。
継続条件のほうは指摘通り変更させてもらい出来るようになりました

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 学校の課題で全くわからなくて…

#22

投稿記事 by みけCAT » 9年前

asbel さんが書きました:このようにしてみたのですがうまくいきませんここからどう変えていけばよいか指摘お願いしたいです

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void){

	int x, y, z, a, b, e;
	a = 0;
	b = 0;
	e = 0;

	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf_s("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);


	int  yosoux, yosouy, yosouz;
	do{
		printf_s("自分の予想1桁目:");
		scanf_s("%d", &yosoux);
		printf_s("自分の予想2桁目:");
		scanf_s("%d", &yosouy);
		printf_s("自分の予想3桁目:");
		scanf_s("%d", &yosouz);
		printf_s("自分の予想\n");
		printf_s("%d%d%d\n\n", yosoux, yosouy, yosouz);
		a = a + 1;
	} while
	(yosoux != x) || (yosouy != y) || (yosouz != z);
	(yosoux == x); e = e + 1;
	(yosouy == y); e = e + 1;
	(yosouz == z); e = e + 1;



	(yosoux == y); b = b + 1;
	(yosoux == z); b = b + 1;
	(yosouy == x); b = b + 1;
	(yosouy == z); b = b + 1;
	(yosouz == x); b = b + 1;
	(yosouz == y); b = b + 1;



			printf("正解\n");
			printf("%d←正解までにかかった回数\n",a);
}
こういうことでしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define scanf_s scanf
#define printf_s printf
int main(void){

	int x, y, z, a, b, e;
	a = 0;
	b = 0;
	e = 0;

	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf_s("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);


	int  yosoux, yosouy, yosouz;
	do{
		e = b = 0;
		printf_s("自分の予想1桁目:");
		scanf_s("%d", &yosoux);
		printf_s("自分の予想2桁目:");
		scanf_s("%d", &yosouy);
		printf_s("自分の予想3桁目:");
		scanf_s("%d", &yosouz);
		printf_s("自分の予想\n");
		printf_s("%d%d%d\n\n", yosoux, yosouy, yosouz);
		a = a + 1;
		if(yosoux == x) e = e + 1;
		if(yosouy == y) e = e + 1;
		if(yosouz == z) e = e + 1;



		if(yosoux == y) b = b + 1;
		if(yosoux == z) b = b + 1;
		if(yosouy == x) b = b + 1;
		if(yosouy == z) b = b + 1;
		if(yosouz == x) b = b + 1;
		if(yosouz == y) b = b + 1;
		printf_s("EAT = %d, BYTE = %d\n",e,b);
	} while
	((yosoux != x) || (yosouy != y) || (yosouz != z));



			printf("正解\n");
			printf("%d←正解までにかかった回数\n",a);
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

asbel

Re: 学校の課題で全くわからなくて…

#23

投稿記事 by asbel » 9年前

なるほどwhileの前にいれればよかったんですね。そこまでのプログラムの起動は確認しました
あとHIGH&LOW、TARGET、SLASHの入れ方がまったく予想もつかないのですがどうすればいいのでしょうか?

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#24

投稿記事 by asd » 9年前

asbel さんが書きました:申し訳ないです教えてもらってる側なのに配慮が足りてませんでした。
継続条件のほうは指摘通り変更させてもらい出来るようになりました
いえいえ、わかっていただければOKですよ。
リミットまで時間がなくて焦っているのはわかりますので^^;

ちなみにすでにみけCATさんから投稿がありますが、
最初の判定追加プログラムで正しく動かないのはその場所に秘密があります。

質問者さんの最初のプログラムではwhileループの外に判定処理がありました。
が、ループを抜けるのは3EATになってからなので、正解しないと判定処理が実行されない状態にありました。
なので入力を受け付けた後、ループ中に判定処理を行う必要あります。

ちなみに判定処理ができたら、次はhigh&low、slash、targetの各アイテム関数の実装に移るかと思いますが、
以下のような仕様で作るとよいと思います。
(あくまで一例ですので以下は参考までに)

最初の方で投稿した関数の定義と呼び出し方は分かりますか?
► スポイラーを表示
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#25

投稿記事 by asbel » 9年前

すいません正直関数の定義と呼び出しについてちゃんと理解している自身がありません。
よろしければどのようにやるのか教えてもらってもいいでしょうか。

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#26

投稿記事 by asd » 9年前

asbel さんが書きました:すいません正直関数の定義と呼び出しについてちゃんと理解している自身がありません。
よろしければどのようにやるのか教えてもらってもいいでしょうか。
えっと、授業で使っている教材や資料にそのあたりの説明はないでしょうか?
(どこまで習っているのかわからないので、引数を使ってよいのかちょっと不安だったりしてます)

一番最初にyoso関数を定義していたかと思いますので、定義の方法は分かっているのではないかと思ってます。
#プロトタイプ宣言はなかったですが
► スポイラーを表示
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#27

投稿記事 by asbel » 9年前

本当に情けない話ですがいまいちよくわからないです・・・
こういうことでしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int high_low(int x, int y, int z);
int main(void){

	high_low(1, 2, 3);
	int x, y, z, a, b, e;
	a = 0;
	b = 0;
	e = 0;
	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	printf("相手カード\n");
	printf("%d%d%d\n\n", x, y, z);


	int  yosoux, yosouy, yosouz;
	do{
		e = b = 0;
		printf("自分の予想1桁目:");
		scanf_s("%d", &yosoux);
		printf("自分の予想2桁目:");
		scanf_s("%d", &yosouy);
		printf("自分の予想3桁目:");
		scanf_s("%d", &yosouz);
		printf("自分の予想\n");
		printf("%d%d%d\n\n", yosoux, yosouy, yosouz);
		a = a + 1;
		if (yosoux == x) e = e + 1;
		if (yosouy == y) e = e + 1;
		if (yosouz == z) e = e + 1;



		if (yosoux == y) b = b + 1;
		if (yosoux == z) b = b + 1;
		if (yosouy == x) b = b + 1;
		if (yosouy == z) b = b + 1;
		if (yosouz == x) b = b + 1;
		if (yosouz == y) b = b + 1;
		printf_s("EAT = %d, BYTE = %d\n", e, b);
	} while ((yosoux != x) || (yosouy != y) || (yosouz != z));



			printf("正解\n");
			printf("%d←正解までにかかった回数\n",a);
}

int high_low(int x, int y, int z){
	
	return 0;
}
もしこういうことなら正直な話この関数の中身がどうなるのか教えてもらえると嬉しいです

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#28

投稿記事 by asd » 9年前

asbel さんが書きました:本当に情けない話ですがいまいちよくわからないです・・・
こういうことでしょうか?
授業での教材、資料ではどうなっているのかについて回答はいただけないのですか・・・。

実際にhigh_low関数を呼び出している場所はいったんおいておいて、
関数の実体を以下のようにして実行するとどんな動きをするのかわかるのではないかと思います。

コード:

int high_low(int x, int y, int z){
	printf("xは%d、yは%d、zは%dです\n", x, y, z);
    return 0;
}
asbel さんが書きました: もしこういうことなら正直な話この関数の中身がどうなるのか教えてもらえると嬉しいです
それをやってしまうと丸投げ質問を認めることになってしまいます。
high_low関数については以下の処理を入れればOKです
1.xが5以上ならHIGH、4以下ならLOWと表示
2.yが5以上ならHIGH、4以下ならLOWと表示
3.zが5以上ならHIGH、4以下ならLOWと表示
4.最後に改行を出力

slash関数については以下の処理になります
1.x、y、zの中でそれぞれ最大数と最小数を調べる(関数内で変数maxとmixを定義しそこへ代入)
2.max-mixの結果を出力

target関数については以下の処理になります
1.関数内でユーザーの入力を行う(0-9)のいずれかの数値
2.入力された数字がxと同じなら1桁目、そうではなくてyと同じなら2桁目、さらにそうでもなくてzと同じなら3桁目と同じ旨を出力、いずれとも一致しなければありませんと出力
オフトピック
んー、ここまでお付き合いしてきましたが、なんだか課題も代理回答を求められている気がしてきました…。
ある程度アドバイスは出していますが、最終的に自分で理解してもらわないと意味がありません。
なので答えだけ提示しろとおっしゃるのであれば私は退散します。
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#29

投稿記事 by asbel » 9年前

授業には教科書が無く、またレジュメも紛失しているのでインターネットで調べてやっているところなのです・・・
ほんと失礼な態度ばかりで申し訳ないです。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int high_low(int x, int y, int z);
int main(void){

	high_low(1, 2, 3);
	int x, y, z, a, b, e;
	a = 0;
	b = 0;
	e = 0;
	srand((unsigned int)time(NULL));

	while (1){
		x = rand() % 10;
		y = rand() % 10;
		z = rand() % 10;
		if (x != y && y != z && x != z)
			break;
	}
	int high_low(int x, int y, int z);
	if (x >= 5)	printf("HIGH\n");
	if (y >= 5)	printf("HIGH\n");
	if (z >= 5)	printf("HIGH\n");
	if (x <= 4)	printf("LOW\n");
	if (y <= 4)	printf("LOW\n");
	if (z <= 4)	printf("LOW\n");


	int  yosoux, yosouy, yosouz;
	do{
		e = b = 0;
		printf("自分の予想1桁目:");
		scanf_s("%d", &yosoux);
		printf("自分の予想2桁目:");
		scanf_s("%d", &yosouy);
		printf("自分の予想3桁目:");
		scanf_s("%d", &yosouz);
		printf("自分の予想\n");
		printf("%d%d%d\n\n", yosoux, yosouy, yosouz);
		a = a + 1;
		if (yosoux == x) e = e + 1;
		if (yosouy == y) e = e + 1;
		if (yosouz == z) e = e + 1;



		if (yosoux == y) b = b + 1;
		if (yosoux == z) b = b + 1;
		if (yosouy == x) b = b + 1;
		if (yosouy == z) b = b + 1;
		if (yosouz == x) b = b + 1;
		if (yosouz == y) b = b + 1;
		printf_s("EAT = %d, BYTE = %d\n", e, b);
		
	} while ((yosoux != x) || (yosouy != y) || (yosouz != z));



			printf("正解\n");
			printf("相手カード\n");
			printf("%d%d%d\n\n", x, y, z);
			printf("%d←正解までにかかった回数\n",a);

}
としてみました。
またコンパイルすら出来ない形ですが一応考えてみたところこういう事なのかな?というところまでは頑張ってみました。
答えを求めているような言い方になってしまっている事は正直焦りから否定することはできません。
十分なヒントはもらいました。もう夜も遅いので無理に付き合わせるのもあれなので自分で後は出来るところまで頑張ってみたいと思います

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#30

投稿記事 by asd » 9年前

asbel さんが書きました:授業には教科書が無く、またレジュメも紛失しているのでインターネットで調べてやっているところなのです・・・
ほんと失礼な態度ばかりで申し訳ないです。
なぜレジュメの紛失に気が付いた時点で再度もらいにいかなかったのかが気になりますが・・・。
とりあえず1桁目の入力時に10と入れるとhigh&lowが使えるようにしてみました。
11と12を入力した際の処理分けも書いていますので、関数の中身さえかければ動くと思います。

slashとtargetについてはコメントで行うべき処理を書いていますので参考にどうぞ。
またDEBUGビルドをした際には相手の数字が表示されるよう#ifdefもしてみました。
RELEASEビルドにすると表示されなくなります。
デバッグ中は相手の答えが見えたほうが効率がいいので。

あまりお力になれなくて申し訳ありませんが、もうちょっとのところだと思いますのでがんばってみてください。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int high_low(int x, int y, int z);
int slash(int x, int y, int z);
int target(int x, int y, int z);
int main(void){
    int x, y, z, a, b, e;
    int yosoux, yosouy, yosouz;
    a = 0;
    b = 0;
    e = 0;
    srand((unsigned int)time(NULL));
 
    while (1){
        x = rand() % 10;
        y = rand() % 10;
        z = rand() % 10;
        if (x != y && y != z && x != z)
            break;
    }
#ifdef _DEBUG
	printf("相手の数字:%d%d%d\n", x, y, z);
#endif
    do{
        e = b = 0;
		printf("自分の予想1桁目(10:high&low 11:slash 12:target):");
        scanf_s("%d", &yosoux);
		if(yosoux>=10){
			switch(yosoux){
				case 10:
					high_low(x, y, z);
					break;
				case 11:
					slash(x, y, z);
					break;
				case 12:
					target(x, y, z);
					break;
			}
		}else{
			printf("自分の予想2桁目:");
			scanf_s("%d", &yosouy);
			printf("自分の予想3桁目:");
			scanf_s("%d", &yosouz);
			printf("自分の予想\n");
			printf("%d%d%d\n\n", yosoux, yosouy, yosouz);
			a = a + 1;
			if (yosoux == x) e = e + 1;
			if (yosouy == y) e = e + 1;
			if (yosouz == z) e = e + 1;
	 
	 
	 
			if (yosoux == y) b = b + 1;
			if (yosoux == z) b = b + 1;
			if (yosouy == x) b = b + 1;
			if (yosouy == z) b = b + 1;
			if (yosouz == x) b = b + 1;
			if (yosouz == y) b = b + 1;
			printf_s("EAT = %d, BYTE = %d\n", e, b);
		}
    } while ((yosoux != x) || (yosouy != y) || (yosouz != z));
 
 
 
            printf("正解\n");
            printf("相手カード\n");
            printf("%d%d%d\n\n", x, y, z);
            printf("%d←正解までにかかった回数\n",a);
 
}

//関数定義
int high_low(int x, int y, int z){
	if (x >= 5){ printf("HIGH,"); }
	else if(x <= 4){ printf("LOW,"); }
	if (y >= 5){ printf("HIGH,"); }
	else if (y <= 4){ printf("LOW,"); }
	if (z >= 5){ printf("HIGH\n"); }
	else if (z <= 4){ printf("LOW\n"); }
	return 0;
}
int slash(int x, int y, int z){
	//TODO:書くべき処理
	//1.x、y、zの中でそれぞれ最大数と最小数を調べる(関数内で変数maxとminを定義しそこへ代入)
	//2.max-minの結果を出力
	return 0;
}
int target(int x, int y, int z){
	//書くべき処理
	//1.関数内でユーザーの入力を行う(0-9)のいずれかの数値
	//2.入力された数字がxと同じなら1桁目、そうではなくてyと同じなら2桁目、さらにそうでもなくてzと同じなら3桁目と同じ旨を出力、いずれとも一致しなければありませんと出力
	return 0;
}
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#31

投稿記事 by asd » 9年前

とりあえずせっかくなので作ったものをコンパイルしたものを添付しておきます。
各アイテムは1回しか使えず、正解するまで相手の数字は表示されないようになっています。
各アイテムの使用制限以外は先ほど載せたソースの関数内部を完成させれば動くはずです。

頑張ってください。
添付ファイル
numeron.zip
(4.2 KiB) ダウンロード数: 110 回
Advanced Supporting Developer
無理やりこじつけ(ぉ

asbel

Re: 学校の課題で全くわからなくて…

#32

投稿記事 by asbel » 9年前

SLASHに関しての関数をこうしたのですが

コード:

int slash(int x, int y, int z){
	int MAX, MIN;
	int a[3] = { x, y, z};
	MAX = 0;
	MIN = 0;
	int MAX(int data[]){
		int MAX = data[0];
		int i;
		for (i = 1; i<3; i++){
			if (MAX < data[i]){
				MAX = data[i];
			}
		}
		return MAX;
	}
	int MIN(int data[]){
		int MIN = data[0];
		int i;
		for (i = 1; i<3; i++){
			if (MIN > data[i]){
				MIN = data[i];
			}
		}
		return MIN;
	}
	printf("SLASH= %d\n", MAX - MIN);
}
どうもうまくいきませんこれは最大値の呼び出しを間違えているのでしょうか?それとも全てがちがうのでしょうか

asbel

Re: 学校の課題で全くわからなくて…

#33

投稿記事 by asbel » 9年前

こうすることで解決しました

コード:

int slash(int x, int y, int z){
	int max, min;
	if (x > y) {
		max = x;
	}
	else {
		max = y;
	}
	if (z > max) {
		max = z;
	}

	if (x < y) {
		min = x;
	}
	else {
		min = y;
	}
	if (z < min) {
		min = z;
	}

    printf("SLASH= %d\n", max - min);
}

asbel

Re: 学校の課題で全くわからなくて…

#34

投稿記事 by asbel » 9年前

TARGETの関数がわからないです・・・

コード:

int target(int x, int y, int z){
	char buff[1];

	printf("0~9の数字をいれてください : ");
	gets(buff);

	if (!strcmp(buff, x));
	printf("%dは一桁目です\n", buff);
	if (!strcmp(buff, y));
	printf("%dは二桁目です\n", buff);
	else if (!strcmp(buff, z));
	printf("%dは三桁目です\n", buff);
	else
	printf("数値は一致しませんでした\n");
	
}
としてみたのですがまたコンパイルできず・・・
どうにか完成させたいです、アドバイスもらえませんか?

asbel

Re: 学校の課題で全くわからなくて…

#35

投稿記事 by asbel » 9年前

なんとか完成しました!
回数制限はないですが一応形にはなりました。
asdさんにはすごく感謝しています。
なんだかこの製作で少し楽しさが分かってきたので今後もなにか作ってみたいと思います。
ありがとうございました!

アバター
asd
記事: 319
登録日時: 13年前

Re: 学校の課題で全くわからなくて…

#36

投稿記事 by asd » 9年前

asbel さんが書きました:なんとか完成しました!
回数制限はないですが一応形にはなりました。
asdさんにはすごく感謝しています。
なんだかこの製作で少し楽しさが分かってきたので今後もなにか作ってみたいと思います。
ありがとうございました!
途中の質問に反応できなくてすみませんでした。

おぉ!無事に動作するとこまで完成したようでよかったです。
楽しさが少しでもわかっていただけたのなら回答者冥利に尽きます(*´ヮ`)

一旦解決にいたった最終的なソースを提示いただいた上で解決としていただければと思います。

最終的なソースを提示していただけると、今後に向けて注意、修正すべき点や
機能追加などなどアドバイスができるかと思います。
(出来上がったものをブラッシュアップしたり機能追加するのもいい勉強になりますよ^^)
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

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