わからないのでどうかお得意な方、教えてください。

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

わからないのでどうかお得意な方、教えてください。

#1

投稿記事 by absolute » 14年前

C言語の初心者です。このプログラムの作り方がいまいちわからないので、
参考までに、見本を作っていただけますか?

プログラムの仕様

次のようにキーボードから4桁の10進数の入力を2回受付ける.
Input the 1st value > 6479
Input the 2nd value > 1497

但し,4桁の各位の数は必ず互いに異なるものが入力されるとする.
入力された数値に対して,以下に定義する「ヒット数」と「ホームラン数」を求める.
ホームラン数: 二つの数字を同じ位ごとに比較した時,何ヶ所の位について一致しているかを表す.
ヒット数: 二つの数字を異なる位同士で比較した時,一致している組み合わせの数を表す.


1234と1234の場合,0ヒット4ホームラン
1234と4321の場合,4ヒット0ホームラン
6479と1497の場合,2ヒット1ホームラン

ヒット数とホームラン数を次のように表示する.
2 hit(s) 1 home run(s)

どうかよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: わからないのでどうかお得意な方、教えてください。

#2

投稿記事 by softya(ソフト屋) » 14年前

フォーラムルールを読んでいただくと分かるのですが、宿題・課題の丸投げとなりますのでご自身である程度やっていただきたいと思います。
http://dixq.net/board/board.html
こちらとしてはお手伝いをするというスタンスになります。
まず、ご自分の出来る範囲で作ったソースコードをcodeタグを使って貼り付けてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: わからないのでどうかお得意な方、教えてください。

#3

投稿記事 by Tatu » 14年前

自分で書いてみたところ、40行くらいになりました。
/ % printf scanf for文 if文 がわかればできるのではないでしょうか。

プログラムが全くできていないのなら
hit数とhomerun数を入力させ、表示するプログラムを書いてください。

hidden

Re: わからないのでどうかお得意な方、教えてください。

#4

投稿記事 by hidden » 14年前

作り方がわからないから見本をくださいってなんかおかしいように思います。

作り方がわからないのであれば
どう作っていけばいいのかを教えてもらった方が良いのではないでしょうか。
完成品を見て読めても自分で書けなかったらあまり意味がありませんし。

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

Re: わからないのでどうかお得意な方、教えてください。

#5

投稿記事 by asd » 14年前

プログラムの作り方がわからないからといって他人に作ってもらっていてはいつまで経っても作り方はわかりませんよ?
まずは必要な処理を考えてみましょう。

1.2回数字を入力してもらう
2.それぞれの数値を一桁ずつ取りだす
3.ホームランかヒットか判定する
4.結果を表示する

上記のような処理になると思います。
さて、上記に関連して質問者さんはどこまでできますか?

・数値を入力し、入力された数値を表示することはできますか?
・入力された4桁数値の特定の桁だけを取り出すことはできますか?

・hello,worldと出力することはできますか?(ぉ
Advanced Supporting Developer
無理やりこじつけ(ぉ


かずま

Re: わからないのでどうかお得意な方、教えてください。

#7

投稿記事 by かずま » 14年前

absolute さんが書きました: 参考までに、見本を作っていただけますか?
参考にならない見本なら作ってさしあげられます。

コード:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char _[13] = "\4\4";
    printf("Input the 1st value> "), scanf("%4s", _+3);
    printf("Input the 2nd value> "), scanf("%4s", _+8);
    while ((*_)--) _[1] -= !strchr(_+3, _[*_+8]), _[2] += _[*_+3]==_[*_+8];
    printf("%d hit(s) %d home run(s)\n", _[1]-_[2], _[2]);
    return 0;
}

たいちう
記事: 418
登録日時: 14年前

Re: わからないのでどうかお得意な方、教えてください。

#8

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

さすがかずまさん。参考にならなさ過ぎに笑ってしまった。
明日シラフで勉強させてもらいます。

アバター
さかまき
記事: 92
登録日時: 14年前

Re: わからないのでどうかお得意な方、教えてください。

#9

投稿記事 by さかまき » 14年前

h2so5 さんが書きました:4年前に全く同じ問題の質問が...
http://dixq.net/forum/viewtopic.php?f=3&t=607
2年前の今頃にも知恵袋に同じ問題が・・・
毎年(あるいは隔年)おなじ問題を使いまわししているみたいです。

アバター
さかまき
記事: 92
登録日時: 14年前

Re: わからないのでどうかお得意な方、教えてください。

#10

投稿記事 by さかまき » 14年前

2008年に知恵袋にもありましたね。
夏のお中元シーズンに頻出するFAQのようです。

この問題を、いまだに丸投げしてくる人は、自分で検索する事すらしていない人という事です。
自分で解決する気が少しでもある人は、過去を検索して解決しているんでしょう。

出題側も毎年、一字一句同じ問題じゃ芸が無いですねぇ
この大学にしてこの生徒ありとは言い過ぎですか。

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

Re: わからないのでどうかお得意な方、教えてください。

#11

投稿記事 by GRAM » 14年前

適当に書いたのでバグがあるかもしれませんm(_ _)m

言語は違うかもしれませんが、"参考に"どうぞ アルゴリズムはたぶん求めているものだと思います

コード:


#include <iostream>
#include <string>
#include <ctime>
#include <random>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;


const unsigned int SIZE = 4;


int main(){
	mt19937 engine((unsigned long)time(0));
	uniform_int_distribution<char> dist('0','9');
	auto GeneratePeg = [&]()->char{return dist(engine);};
	string org (SIZE,'_'), user;
	generate(org.begin(),org.end(),GeneratePeg);
	
	vector<string> head(2);
	head[0] = "1st", head[1] = "2nd";
	for(int i=0; i<2; ++i){
		cout << "Input the " <<head[i] << " value" << endl;
		cin >> user;
		user.resize(org.size(),' ');
		map<char,int> umc, umu;
		int unord = 0, home_run = 0;
		transform(
			org.begin(),org.end(),
			user.begin(),user.begin(),
			[&](char cc,char cu)->char{
				if(cc == cu) ++home_run;
				++umc[cc];
				++umu[cu];
				return cu;
			}
		);
		string uOrg = org;
		sort(uOrg.begin(), uOrg.end());
		for_each(
			uOrg.begin(), unique(uOrg.begin(),uOrg.end()), [&](char c){ unord += min(umc[c],umu[c]); }
		);
		cout << unord-home_run <<" hit(s) " << home_run << " home run(s)\n" <<endl;
	}
	cout << "答え:" << org <<endl;

	return 0;
}
毎度思うけど、Cっぽく書くのは難しいなぁ。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: わからないのでどうかお得意な方、教えてください。

#12

投稿記事 by ISLe » 14年前

以前同じ職場にいたひとに聞いた話ですが、優秀な回答が翌年教材に化けることがあるらしいですよ。
提出した本人に何も知らされずに。

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

Re: わからないのでどうかお得意な方、教えてください。

#13

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

私も書いてみました。
まともですみません。

コード:

#include <stdio.h>

int main(void) {
	char n[2][100];
	int i,h,r,j;
	for(i=0;i<2;i++) {
		printf("Input the %s value > ",i?"2nd":"1st");
		fgets(n[i],sizeof(n[i]),stdin);
	}
	h=r=0;
	for(i=0;i<4;i++) {
		for(j=0;j<4;j++) {
			if(n[0][i]==n[1][j])i-j?h++:r++;
		}
	}
	printf("%d hit(s) %d home run(s)\n",h,r);
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

しひ

Re: わからないのでどうかお得意な方、教えてください。

#14

投稿記事 by しひ » 14年前

得意ではありませんが書いてみました。
ひねりが無い上に入力取れなくてごめんなさい。

コード:

#include <iostream>

// { 6, 4, 7, 9 }
template <int N> struct Arr1 { static const int value = 0; };
template <> struct Arr1<1> { static const int value = 6; };
template <> struct Arr1<2> { static const int value = 4; };
template <> struct Arr1<3> { static const int value = 7; };
template <> struct Arr1<4> { static const int value = 9; };

// { 1, 4, 9, 7 }
template <int N> struct Arr2 { static const int value = 0; };
template <> struct Arr2<1> { static const int value = 1; };
template <> struct Arr2<2> { static const int value = 4; };
template <> struct Arr2<3> { static const int value = 9; };
template <> struct Arr2<4> { static const int value = 7; };

static const int LENGTH = 4;

template<int N, template <int> class A, int T>
struct Find
{
	static const int value = (A<N>::value == T)? 1: Find<N-1, A, T>::value;
};

template<template <int> class A, int T>
struct Find<0, A, T>
{
	static const int value = 0;
};

template<int N, template <int> class A1, template <int> class A2, int R>
struct Batter
{
	static const int value = Batter< N-1, A1, A2,
		R+( A1<N>::value == A2<N>::value )*9+Find<LENGTH, A1, A2<N>::value>::value>::value;
};

template<template <int> class A1, template <int> class A2, int R>
struct Batter<0, A1, A2, R>
{
	static const int value = R;
};

int main()
{
	std::cout << Batter<LENGTH, Arr1, Arr2, 0>::value%10 << " hit(s) ";
	std::cout << Batter<LENGTH, Arr1, Arr2, 0>::value/10 << " home run(s)";
}

かずま

Re: わからないのでどうかお得意な方、教えてください。

#15

投稿記事 by かずま » 14年前

しひ さんが書きました: 得意ではありませんが書いてみました。
ひねりが無い上に入力取れなくてごめんなさい。
template で再帰とは面白いですね。
でも、template だとコンパイル時に静的に値が決まっていなければならないので入力が取れません。
#define に再帰はないけれど、案外強力で、御覧のように C で書けて、入力も OK です。

コード:

#include <stdio.h>
 
#define H0(x) (H1(x) + H1(x+8))
#define H1(x) (H2(x) + H2(x+4))
#define H2(x) (H3(x) + H3(x+2))
#define H3(x) (H4(x) + H4(x+1))
#define H4(x) (a[x&3] == b[x>>2])

#define R0(x) (R1(x) + R1(x+2))
#define R1(x) (R2(x) + R2(x+1))
#define R2(x) (a[x] == b[x])

int main(void)
{
    char a[4], b[4];
    printf("Input the 1st value > "), scanf(" %4c", a);
    printf("Input the 2nd value > "), scanf(" %4c", b);
    printf("%d hit(s) %d home run(s)\n", H0(0)-R0(0), R0(0));
    return 0;
}

かずま

Re: わからないのでどうかお得意な方、教えてください。

#16

投稿記事 by かずま » 14年前

かずま さんが書きました: #define に再帰はないけれど、案外強力で、御覧のように C で書けて、入力も OK です。
ヒットとホームランを同時に求めるようにしてみました。
でも、main で D を 2回参照するので無駄ですね。

コード:

#include <stdio.h>
 
#define D       (D1(0) + D1(1) + D1(2) + D1(3))
#define D1(x)   (D2(x,0) + D2(x,1) + D2(x,2) + D2(x,3))
#define D2(x,y) ((a[x]==b[y]) << (x==y)*3)

int main(void)
{
    char a[4], b[4];
    printf("Input the 1st value > "), scanf(" %4c", a);
    printf("Input the 2nd value > "), scanf(" %4c", b);
    printf("%d hit(s) %d home run(s)\n", D & 7, D >> 3);
    return 0;
}
関数の再帰呼び出し版も作ってみました。

コード:

#include <stdio.h>
 
int p(const char *a, int n)
{
    return n--?p(a,n)+(a[n&3]-a[n>>2|4]?0:(n&3)!=n>>2?1:8):0;
}

int main(void)
{
    char a[8];
    printf("Input the 1st value > "), scanf(" %4c", a);
    printf("Input the 2nd value > "), scanf(" %4c", a+4);
    printf("%d hit(s) %d home run(s)\n", p(a,16)&7, p(a,16)>>3);
    return 0;
}

閉鎖

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