わからないのでどうかお得意な方、教えてください。
わからないのでどうかお得意な方、教えてください。
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)
どうかよろしくお願いします。
参考までに、見本を作っていただけますか?
プログラムの仕様
次のようにキーボードから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: わからないのでどうかお得意な方、教えてください。
フォーラムルールを読んでいただくと分かるのですが、宿題・課題の丸投げとなりますのでご自身である程度やっていただきたいと思います。
http://dixq.net/board/board.html
こちらとしてはお手伝いをするというスタンスになります。
まず、ご自分の出来る範囲で作ったソースコードをcodeタグを使って貼り付けてくださいね。
http://dixq.net/board/board.html
こちらとしてはお手伝いをするというスタンスになります。
まず、ご自分の出来る範囲で作ったソースコードをcodeタグを使って貼り付けてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: わからないのでどうかお得意な方、教えてください。
自分で書いてみたところ、40行くらいになりました。
/ % printf scanf for文 if文 がわかればできるのではないでしょうか。
プログラムが全くできていないのなら
hit数とhomerun数を入力させ、表示するプログラムを書いてください。
/ % printf scanf for文 if文 がわかればできるのではないでしょうか。
プログラムが全くできていないのなら
hit数とhomerun数を入力させ、表示するプログラムを書いてください。
Re: わからないのでどうかお得意な方、教えてください。
作り方がわからないから見本をくださいってなんかおかしいように思います。
作り方がわからないのであれば
どう作っていけばいいのかを教えてもらった方が良いのではないでしょうか。
完成品を見て読めても自分で書けなかったらあまり意味がありませんし。
作り方がわからないのであれば
どう作っていけばいいのかを教えてもらった方が良いのではないでしょうか。
完成品を見て読めても自分で書けなかったらあまり意味がありませんし。
Re: わからないのでどうかお得意な方、教えてください。
プログラムの作り方がわからないからといって他人に作ってもらっていてはいつまで経っても作り方はわかりませんよ?
まずは必要な処理を考えてみましょう。
1.2回数字を入力してもらう
2.それぞれの数値を一桁ずつ取りだす
3.ホームランかヒットか判定する
4.結果を表示する
上記のような処理になると思います。
さて、上記に関連して質問者さんはどこまでできますか?
・数値を入力し、入力された数値を表示することはできますか?
・入力された4桁数値の特定の桁だけを取り出すことはできますか?
・hello,worldと出力することはできますか?(ぉ
まずは必要な処理を考えてみましょう。
1.2回数字を入力してもらう
2.それぞれの数値を一桁ずつ取りだす
3.ホームランかヒットか判定する
4.結果を表示する
上記のような処理になると思います。
さて、上記に関連して質問者さんはどこまでできますか?
・数値を入力し、入力された数値を表示することはできますか?
・入力された4桁数値の特定の桁だけを取り出すことはできますか?
・hello,worldと出力することはできますか?(ぉ
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: わからないのでどうかお得意な方、教えてください。
4年前に全く同じ問題の質問が...
http://dixq.net/forum/viewtopic.php?f=3&t=607
http://dixq.net/forum/viewtopic.php?f=3&t=607
Re: わからないのでどうかお得意な方、教えてください。
参考にならない見本なら作ってさしあげられます。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;
}
Re: わからないのでどうかお得意な方、教えてください。
さすがかずまさん。参考にならなさ過ぎに笑ってしまった。
明日シラフで勉強させてもらいます。
明日シラフで勉強させてもらいます。
Re: わからないのでどうかお得意な方、教えてください。
2年前の今頃にも知恵袋に同じ問題が・・・h2so5 さんが書きました:4年前に全く同じ問題の質問が...
http://dixq.net/forum/viewtopic.php?f=3&t=607
毎年(あるいは隔年)おなじ問題を使いまわししているみたいです。
Re: わからないのでどうかお得意な方、教えてください。
2008年に知恵袋にもありましたね。
夏のお中元シーズンに頻出するFAQのようです。
この問題を、いまだに丸投げしてくる人は、自分で検索する事すらしていない人という事です。
自分で解決する気が少しでもある人は、過去を検索して解決しているんでしょう。
出題側も毎年、一字一句同じ問題じゃ芸が無いですねぇ
この大学にしてこの生徒ありとは言い過ぎですか。
夏のお中元シーズンに頻出するFAQのようです。
この問題を、いまだに丸投げしてくる人は、自分で検索する事すらしていない人という事です。
自分で解決する気が少しでもある人は、過去を検索して解決しているんでしょう。
出題側も毎年、一字一句同じ問題じゃ芸が無いですねぇ
この大学にしてこの生徒ありとは言い過ぎですか。
Re: わからないのでどうかお得意な方、教えてください。
適当に書いたのでバグがあるかもしれませんm(_ _)m
言語は違うかもしれませんが、"参考に"どうぞ アルゴリズムはたぶん求めているものだと思います
毎度思うけど、Cっぽく書くのは難しいなぁ。
言語は違うかもしれませんが、"参考に"どうぞ アルゴリズムはたぶん求めているものだと思います
#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;
}
Re: わからないのでどうかお得意な方、教えてください。
以前同じ職場にいたひとに聞いた話ですが、優秀な回答が翌年教材に化けることがあるらしいですよ。
提出した本人に何も知らされずに。
提出した本人に何も知らされずに。
Re: わからないのでどうかお得意な方、教えてください。
私も書いてみました。
まともですみません。
まともですみません。
#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: わからないのでどうかお得意な方、教えてください。
得意ではありませんが書いてみました。
ひねりが無い上に入力取れなくてごめんなさい。
ひねりが無い上に入力取れなくてごめんなさい。
#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: わからないのでどうかお得意な方、教えてください。
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: わからないのでどうかお得意な方、教えてください。
ヒットとホームランを同時に求めるようにしてみました。かずま さんが書きました: #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;
}