C言語の問題がわかりません

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

C言語の問題がわかりません

#1

投稿記事 by ムウ » 15年前

親の血液型と子の血液型の関係を扱うプログラムを考えます。血液型にはAA、AB、AO、BB、BO、OOの 6通りがあるとします。x, y, z, wのそれぞれが、A,B,Oのいずれかであるときに、xy型の父親とzw型の母親からは、 xz型、xw型、yz型、yw型のどれかの型の子供が生まれるものとします。ただし、BA,OA,OB型はそれぞれ AB、AO,BO型と同一であると考えることにし、AB、AO、BOを正式の呼び名とします。例えば、AO型の父親とBB型の母親からは、ABまたはBO型の子供が生まれます。

血液型AA、AB、AO、BB、BO、OOのそれぞれを順に番号0、1、2、3、4、5 で表すことにします。 3つの番号 n1、n2、n3 を入力し、番号n1の血液型の父親と番号n2の血液型の母親から、番号n3の血液型の子供が生まれる可能性があるかどうかを判定するプログラムを書いてください。出力の形式は、可能性のあるとき
Possible: father %1, mother %2, child %3
可能性のないとき
Impossible: father %1, mother %2, child %3
としてください。ここで、%1、%2、%3のところには、順に父親、母親、子の血液型がはいります。血液型は、出力においては番号で示すのではなく、AA、ABなど半角の 2文字で表現してください。

この問題で# 父親の型と母親の型の組み合わせ 6*6=36 通りのそれぞれを別個に処理するのは大変です。
血液型をふたつの要素に分解してから判定をすると楽だと思い、父親の血液型を変数 f1 と f2 を使って表すことにし、A、B、O をそれぞれ 0、 1、 2 で表すとすれば、血液型が AO のときは、f1 = 0, f2 = 2、 BB のときは f1 = 1, f2 = 1 としました。
途中まではプログラムを書いてみたのですが、よくわからなくなってしまったのでどなたかご教授お願いします

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

int n1, n2, n3;
int x, y, z;
int f1, f2;
int m1, m2;
int c1, c2;
scanf("%d", &x);
scanf("%d", &y);
scanf("%d", &z);

if(x == 0)
f1 = 0;
f2 = 0;
if(x == 1)
f1 = 0;
f2 = 1;
if(x == 2)
f1 = 0;
f2 = 2;
if(x == 3)
f1 = 1;
f2 = 1;
if(x == 4)
f1 = 1;
f2 = 2;
if(x == 5)
f1 = 2;
f2 = 2;

if(y == 0)
m1 = 0;
m2 = 0;
if(y == 1)
m1 = 0;
m2 = 1;
if(y == 2)
m1 = 0;
m2 = 2;
if(y == 3)
m1 = 1;
m2 = 1;
if(y == 4)
m1 = 1;
m2 = 2;
if(y == 5)
m1 = 2;
m2 = 2;

if(z == 0)
c1 = 0;
c2 = 0;
if(z == 1)
c1 = 0;
c2 = 1;
if(z == 2)
c1 = 0;
c2 = 2;
if(z == 3)
c1 = 1;
c2 = 1;
if(z == 4)
c1 = 1;
c2 = 2;
if(z == 5)
c1 = 2;
c2 = 2;

if(f1 == c1 || m1 == c1){
if(f2 == c2 || m2 == c2)
printf("Possible: father %d, mother %d, child %d")
}
printf("Impossible: father %d, mother %d, child %d", x, y, z)
return(0);
}

lbfuvab

Re:C言語の問題がわかりません

#2

投稿記事 by lbfuvab » 15年前

まず、
if(z == 0)
c1 = 0;
c2 = 0;


などの記述がありますが、
これでは"c2 = 0"は無条件に実行されますが、それでよいのでしょうか?

後、見づらいのでpreタグでインデントをつけてください。

ムウ

Re:C言語の問題がわかりません

#3

投稿記事 by ムウ » 15年前

すいません;;

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

int n1, n2, n3;
int x, y, z;
int f1, f2;
int m1, m2;
int c1, c2;
scanf("%d", &x);
scanf("%d", &y);
scanf("%d", &z);

if(x == 0){
f1 = 0;
f2 = 0;
}
if(x == 1){
f1 = 0;
f2 = 1;
}
if(x == 2){
f1 = 0;
f2 = 2;
}
if(x == 3){
f1 = 1;
f2 = 1;
}
if(x == 4){
f1 = 1;
f2 = 2;
}
if(x == 5){
f1 = 2;
f2 = 2;
}

if(y == 0){
m1 = 0;
m2 = 0;
}
if(y == 1){
m1 = 0;
m2 = 1;
}
if(y == 2){
m1 = 0;
m2 = 2;
}
if(y == 3){
m1 = 1;
m2 = 1;
}
if(y == 4){
m1 = 1;
m2 = 2;
}
if(y == 5){
m1 = 2;
m2 = 2;
}

if(z == 0){
c1 = 0;
c2 = 0;
}
if(z == 1){
c1 = 0;
c2 = 1;
}
if(z == 2){
c1 = 0;
c2 = 2;
}
if(z == 3){
c1 = 1;
c2 = 1;
}
if(z == 4){
c1 = 1;
c2 = 2;
}
if(z == 5){
c1 = 2;
c2 = 2;
}
if(f1 == c1 || m1 == c1){
if(f2 == c2 || m2 == c2)
printf("Possible: father %d, mother %d, child %d")
}
printf("Impossible: father %d, mother %d, child %d", x, y, z)
return(0);
}

たいちう

Re:C言語の問題がわかりません

#4

投稿記事 by たいちう » 15年前

人に見てもらうプログラムは、原則としてコメントを付けましょう。
よくわからなくなってしまった、とありますが、
判りやすいコメントがあれば、自分でももう少し先に進めるのでは?


# 面白そうな題材なので、そのうち私もプログラムを書いてみますが、
# 他の人のプログラムも読んでみたいです。
# でも質問者が解決する前に模範解答やマニアックな解答を載せるのには抵抗があります。
#
# で、(どちらかというと自分勝手な)提案ですが、
#
# > 父親の型と母親の型の組み合わせ 6*6=36 通りのそれぞれを別個に処理するのは大変です。
#
# それぞれ別個に処理するプログラムを完成させてはいかがですか?
# 例えベストではなくても、仕様を満たすプログラムを自力で完成させることは大切です。
# 曲がりなりにも自分で解答を得た後ならば、私としては喜んで別解を提示できますが。
# (それまでは基本的にはアドバイスのみです)

Poco

Re:C言語の問題がわかりません

#5

投稿記事 by Poco » 15年前

> この問題で# 父親の型と母親の型の組み合わせ 6*6=36 通りのそれぞれを別個に処理するのは大変です。
組み合わせは多くても4パターンでそれぞれが第3引数とマッチするか見た方が良くないですか?

たいちう

Re:C言語の問題がわかりません

#6

投稿記事 by たいちう » 15年前

昨夜色々書いたけど、時間ができたので気が変わって作成。
元の問題の解答ではないですが、参考にはなるかと。
昨夜書いた色々よりもコードの方が短いという罠。
時間もかからんかったし。
#include <iostream>
#include <string>

using namespace std;

bool check(const string &bt1, const string &bt2, const string &bt3) {
    string u = bt3.substr(0, 1);
    string v = bt3.substr(1, 1);
    return (bt1.find(u) != string::npos && bt2.find(v) != string::npos) ||
           (bt1.find(v) != string::npos && bt2.find(u) != string::npos);
}

int main() {
    const string bt[/url] = { "AA", "AB", "AO", "BB", "BO", "OO" };
    for (int i = 0; i < 6; i++)
        for (int j = i; j < 6; j++) {
            cout << bt << ", " << bt[j] << " -> ";
            for (int k = 0; k < 6; k++)
                if (check(bt, bt[j], bt[k]))
                    cout << bt[k] << " ";
            cout << endl;
        }
    return 0;
}

閉鎖

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