【C,C++】 ちょっと問題解いて行け 【勉強】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
他人のソースを読むことは非常に勉強になります。
と言うわけで、初心者〜プロの方まで様々な人が書いたソースを見て、より良いプログラムを作れるようになろうと言う目論見です。
問題は未来アンカーで踏んだ人が空気を読んだ問題を出しましょう。

解答ソースを貼る人用テンプレ
【C言語歴】 (例)4年
【レベル】 (例)初心者、プロ、学校で習った程度 など
【コンセプト】 (例)処理速度重視、可読性重視、容量重視 など
【コメント】 (例)みっくみくにしてやんよ。など、有れば

長すぎるソースはこちらへ
ttp://codepad.org/

宿題は C/C++の宿題片付けます 130代目へ
http://pc12.2ch.net/test/read.cgi/tech/1250204272/
相談は C言語なら俺に聞け(入門篇)Part54などへ
http://pc12.2ch.net/test/read.cgi/tech/1254829314/
2デフォルトの名無しさん:2009/10/12(月) 01:17:21
言い出しっぺの法則

【問題】 5個の数を入力すると合計と平均を計算し出力するプログラムを作成してください。

次の問題は>>50
3デフォルトの名無しさん:2009/10/12(月) 01:20:30
【C言語歴】 1ヶ月
【レベル】  超初心者
【コンセプト】 ちゃんと動くように書くのが精一杯
【コメント】 先月からC言語を勉強しはじめました。一応講義受けてます・・。

#include<stdio.h>
#define BUF_SIZE (16)
#define COUNT (5)

int main(void){
int i;
double sum = 0;
char buf[BUF_SIZE];

printf("%d回、数を入力してください。\n",COUNT);
for(i=0;i<COUNT;i++){
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%lf",&sum);
sum +=sum;
}
printf("合計は%f、平均は%fです。",sum,sum/COUNT);
return (0);
}
4デフォルトの名無しさん:2009/10/12(月) 01:21:48
該当問題をアンカーしたほうがいいですね・・。
5デフォルトの名無しさん:2009/10/12(月) 01:27:15
ちょw
>
6デフォルトの名無しさん:2009/10/12(月) 03:12:57
霊長類研
7デフォルトの名無しさん:2009/10/12(月) 05:39:25
>>2
【C言語歴】 1年 【レベル】 学校で習った 【コンセプト】 普通に
#include <stdio.h>
int main(void)
{
char str[20];
int num1;
int num2;
int num3;
int num4;
int num5;
int sum;
puts( "整数を5回入力して下さい。" );
fgets( str, 20(str), stdin );
sscanf( str, "%d", &num1 );
fgets( str, 22(str), stdin );
sscanf( str, "%d", &num2 );
fgets( str, 24(str), stdin );
sscanf( str, "%d", &num3 );
fgets( str, 26(str), stdin );
sscanf( str, "%d", &num1 );
fgets( str, 28(str), stdin );
sscanf( str, "%d", &num1 );

sum = num1 + num2 + num3 + num4+ num5;

printf( "合計: %d\n", sum );
printf( "平均: %d\n", sum / 5 );

return 0;
}
これでどうですか?
8デフォルトの名無しさん:2009/10/12(月) 07:50:45
>7
わざと()にしたのかなアセンブリじゃないんだから[]使わないとだめだよ
20[str]みたいにね、と思ったがfgets(, size_t, )だったなぁ
脳内lintには引っかかったが、脳内コンパイルできなかった
9デフォルトの名無しさん:2009/10/12(月) 14:32:38
【C言語歴】 1ヶ月
【レベル】 超初心者
【コンセプト】 なし
【コメント】 なし

#include <stdio.h>
int main(){
int a[5];
scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4]);
int b=a[0]+a[1]+a[2]+a[3]+a[4];
printf("%d\n%g\n",b,(float)b/5);
return 0;
}
10デフォルトの名無しさん:2009/10/12(月) 14:42:32
>>9

bが宣言されてなくない?
あとその書き方だと数が多いと大変
11デフォルトの名無しさん:2009/10/12(月) 14:43:28
おっと、b見落としてた
12デフォルトの名無しさん:2009/10/12(月) 19:45:13
ageて置きますね(^^;)
13デフォルトの名無しさん:2009/10/12(月) 21:52:38
>>2
【C言語歴】 5〜6年
【レベル】 けど初心者
【コンセプト】 stl で書いてみた
【コメント】 プログラムがうまくなりたーい

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

int main()
{
std::vector<int> arr;
std::cout<< "整数を5回入力してね。"<<std::endl;
for( int i = 0; i < 5; ++i)
{
int input_tmp;
std::cin >> input_tmp;
arr.push_back( input_tmp );
}
int sum = std::accumulate(arr.begin(), arr.end(), 0);
std::cout << "Sum:" << sum <<std::endl;
std::cout << "Mean:"<< (double)sum/arr.size() << std::endl;
return 0;
}
14 ◆yic3X9PxrE :2009/10/13(火) 00:29:00
>3
・buf は for の中で宣言しても良いかも。(その方が後で改造しやすい)
・sscanf は「scanできた数」を返すから、それできちんと入力されたかチェックした方が好ましい。
 ※ >3だと空入力とかも1回とカウントされてしまう。
・%lfでsscanfしてるんだから、 printfも %lf で出力した方が好ましい。

>7,9
・個別に書く事は得になし。

>13
・c++なんだからキャストは static_cast の方が好ましい。
 (というか出題は整数限定じゃないのだから、double型にしときゃ良い気が。)

総評:
・初期化を書くクセを突けた方が良いと思われ。
・コンパイルが通るのを確認してから書いた方が良いと思われ。
 今やWindowsでもコンパイラはタダなのだし。
15デフォルトの名無しさん:2009/10/13(火) 02:48:58
>・%lfでsscanfしてるんだから、 printfも %lf で出力した方が好ましい。
これは論外。何故論外なのか判らないならprintf()とscanf()のマニュアルペー
ジを読め。
それでも判らないなら、人に物を教えようなどと言う烏滸がましいことは金輪際
止めた方がいい。
16デフォルトの名無しさん:2009/10/13(火) 06:42:17
っ C99
17デフォルトの名無しさん:2009/10/13(火) 07:34:01
shortだったらどうするんだろう……
18普通の名無しさん:2009/10/13(火) 16:10:40
/*
【C言語歴】 22年 ソースにコメントされても、多分返事は無い
【レベル】 プロ
【コンセプト】 可読性重視
【コメント】 C++ は入出力がスマートで便利

*/
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

const int MAX_COUNT = 5;

int main(void) {
  double data[5];
  double total = 0.0;
  int i;

  for(i=0; i<MAX_COUNT; i++) {
    cout << "何かの数:";
    cin >> data[i]; cout << data[i] <<endl;
    total += data[i];
  }
  cout << "合計:" << total <<endl;
  cout << "平均:" << total/MAX_COUNT <<endl;
}
19別に返事は要らん:2009/10/13(火) 16:50:31
通常、標準入力はエコーバックされていると言う前提だから、入力直後の出力は冗長だね。
一方、標準出力はバッファリングされている可能性があるからフラッシュしないと折角のプロンプト出力が無駄になる。
20デフォルトの名無しさん:2009/10/13(火) 19:16:48
const int MAX_COUNT = 5;



double data[5];

さすがプロ
つーか、配列の意味無し
21デフォルトの名無しさん:2009/10/13(火) 20:32:55
>>20
ありがちなミスだなw
というお前さんも問題解いて行ってくれよ?
22 ◆yic3X9PxrE :2009/10/14(水) 00:45:18
>15
失敬。そしてわざわざ指摘をありがとう。(思いっきり勘違いしてますねこりゃ。)
そして>13さんごめんなさい。

>18
先輩、忘れ物です。
つ return 0;

>19
一応どのように読み取ったかを確認できるので、冗長ではあるけど意味はあるかと。
(例えば 1,2 などと入力すると…)
23デフォルトの名無しさん:2009/10/14(水) 06:24:20
>>7 コンパイル済み
#include <stdio.h>
int main(void)
{
  char str[20];
  int num1;
  int num2;
  int num3;
  int num4;
  int num5;
  int sum;
  puts( "整数を5回入力して下さい。" );
  fgets( str, 20, stdin );
  sscanf( str, "%d", &num1 );
  fgets( str, 20, stdin );
  sscanf( str, "%d", &num2 );
  fgets( str, 20, stdin );
  sscanf( str, "%d", &num3 );
  fgets( str, 20, stdin );
  sscanf( str, "%d", &num4 );
  fgets( str, 20, stdin );
  sscanf( str, "%d", &num5 );

  sum = num1 + num2 + num3 + num4+ num5;

  printf( "合計: %d\n", sum );
  printf( "平均: %d\n", sum / 5 );

  return 0;
}
24デフォルトの名無しさん:2009/10/14(水) 09:33:04
こういうのはイディオムとして覚えておこうよ。
fgets(str, sizeof(str), stdin);
25デフォルトの名無しさん:2009/10/14(水) 10:12:37
よう、友達じゃないんだから。
26普通の名無しさん:2009/10/15(木) 17:35:50
/*
【C言語歴】 22年 ソースにコメントされても、返事は期待しないように
【レベル】 プロ
【コンセプト】 可読性重視
【コメント】 途中で数字以外を入れるとそこまでで計算を終わる
*/
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

const int MAX_COUNT = 5;
int main(void) {
  double data, sum=0.0;
  int i;

  for(i=0; i<MAX_COUNT; i++) {
//    cout << "何かの数:";
    if(!(cin >> data)) break;
//    cout << data <<endl;
    sum += data;
  }
  cout << "合計:" << sum <<endl;
  cout << "平均:" << sum/i <<endl;
}
27普通の名無しさん:2009/10/15(木) 17:36:35
/*
【C言語歴】 22年 ソースにコメントされても、返事は期待しないように
【レベル】 プロ
【コンセプト】 可読性重視
【コメント】 途中で数字以外を入れるとそこまでで計算を終わる
*/
#include <stdio.h>

#define MAX_NUM 5
int main(){
  double data, sum=0.0;
  int i;

  for(i=0; i<MAX_NUM; i++){
//    printf("何かの数:");
    if(scanf("%lf", &data ) != 1) break;
//    printf("%g\n", data);
    sum += data;
  }
  printf( "合計:%g\n", sum);
  printf( "平均:%g\n", sum/i);
  return 0;
}
28デフォルトの名無しさん:2009/10/15(木) 17:54:24
/*
【C言語歴】 沢山
【レベル】 プロ
【コンセプト】 即興
【コメント】 >27に準拠、0件にも対応
*/
#include <stdio.h>

static const int MaxNum = 5;

int main()
{
double sumData = 0;
int ic;
for (ic = 0; ic < MaxNum; ++ic) {
double data;
fprintf(stderr, "Input a number:");
if (scanf("%lf", & data) != 1) break;
sumData += data;
}
if (ic) {
printf("Summation:%g\nAverage:%g\n", sumData, sumData / ic);
} else {
printf("There are no numbers.\n");
}
return 0;
}
29デフォルトの名無しさん:2009/10/16(金) 00:02:18
// 【C言語歴】 10年くらい
// 【レ ベ ル】 底辺SIerのPG
// 【コンセプト】 C++で。例外処理は省略。
// 【コメント】ベースは>18
#include <iostream>
#include <vector>
#include <numeric>
int main ( void )
{
const int MAX_COUNT = 5;
std::vector<double> buf;
std::cout << MAX_COUNT << "個の数値を入力してください。" << std::endl;
for( int count = 0; count < MAX_COUNT; ) {
double tmp = 0.0;
std::cin >> tmp;
if ( std::cin.fail() ) {
std::cin.clear(); // エラーを消す
std::cin.ignore(); // エラーとなった文字を読み飛ばす
}
else {
buf.push_back( tmp );
++count;
}
}
double sum = std::accumulate( buf.begin(), buf.end() , 0.0);
std::cout << "合計:" << sum << std::endl;
std::cout << "平均:" << (sum / MAX_COUNT) << std::endl;
return 0;
}
30デフォルトの名無しさん:2009/10/16(金) 09:53:42
int main( /**/ void /**/ )
31デフォルトの名無しさん:2009/10/18(日) 18:22:00
次の問題に行かずに沈みそうなのでage....

ゆ っ く り と い て い っ て ね
32デフォルトの名無しさん:2009/10/18(日) 21:44:24
>>24
カッコつけんなボケ
33デフォルトの名無しさん:2009/10/19(月) 10:02:18
別に格好悪いわけじゃないからいいじゃん。
34デフォルトの名無しさん:2009/10/19(月) 17:18:01
そろそろ次の問題行かないと間が持たないな
35デフォルトの名無しさん:2009/10/19(月) 21:35:57
では少し早いですが問題を・・。

【問題】 100個の数字をランダムに並べ替えて出力するプログラムを作成してください。
     ※同じ数は出力しない。毎回違った実行結果を表示する。

アルゴニズムと処理の違いが楽しみです。

次の問題は 一応50レス先の >>85
スレが停滞したらまたその時。。
36デフォルトの名無しさん:2009/10/19(月) 21:45:20
>>35

問題訂正・・。
【問題】 1〜100までの数字をランダムに並べ替えて出力するプログラムを作成してください。
     ※同じ数は出力しない。毎回違った実行結果を表示する。
37デフォルトの名無しさん:2009/10/19(月) 21:53:52
$ cat a.cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
time_t t;
t = time(0);
srandom(t);

int a[100];
for (int i = 0; i < 100; ++i) a[i] = i;
for (int i = 0; i < 100; ++i) {
int k = i + random() % (100 - i);
printf("%d\n", 1 + a[k]);
a[k] = a[i];
}
return 0;
}

C99ってことで
3837:2009/10/19(月) 21:58:41
乱数は考えるのがめんどくさかったので、 random() でごまかした。
random()の剰余で求める範囲の値を取り出すのは、ほんとはよい習慣ではない。
割り算を使うほうがいい。
3937:2009/10/19(月) 22:00:23
いちおうテンプレ
【C言語歴】 かなり長い
【レベル】 プロ
【コンセプト】 KISS
【コメント】 たたき台ってことで、よろしく。
40デフォルトの名無しさん:2009/10/19(月) 22:27:31
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MIN (1)
#define MAX (100)
#define LENGTH (MAX - MIN + 1)
int main()
{
int data[LENGTH];
// データの初期化
for(int i = MIN; i <= MAX; i++)
{
data[i - MIN] = i;
}
// データの並べ替え
srand(time(NULL));
for(int i = 0; i < LENGTH; i++)
{
int temp;
temp = data[i];
int selected_index = rand() % (MAX - i) + i;
data[i] = data[selected_index];
data[selected_index] = temp;
}
// 出力
for(int i = 0; i < LENGTH; i++)
{
printf("%d\n", data[i]);
}
return 0;
}
41デフォルトの名無しさん:2009/10/19(月) 22:28:29
>>37

はえー・・・・
さすがプロ・・。
問題作った言い出しっぺが作れてません。
コンパイル通るのに動かないょ。
4240:2009/10/19(月) 22:32:14
【C言語歴】 ほとんど書いたことない
【レベル】 Cは初級
【コンセプト】 変化を考慮
【コメント】 書き方などご指摘がありましたらよろしくお願いします。
43デフォルトの名無しさん:2009/10/19(月) 23:20:43
【C言語歴】 6年 【レベル】 仕事で使用 【コンセプト】 擬似乱数 【コメント】 PCは書き込み規制・・・
#include <stdio.h>
#include <string.h>
#include <time.h>
void main(){
 char map[100];
 time_t timer;
 int a, b, p, q, i = 0;
 memset(map, 0x02, sizeof(map)); time(&timer);
 a=timer%100000; p=(timer/7)%1000; q=(timer/3)%1000;
 while(1){
  a=(((a*p+q)/10)%100000); b=a/1000;
  if(0<map[b]){
   printf("%3d ",b); map[b]--; i++;
  }else{
   while(1){
    if(b<99) b++;
    else b = 0;
    if(0<map[b]){
     printf("%3d ", b); map[b]--; i++; break;
    }
   }
  }
  if(i>=200) break;
 }
}
44デフォルトの名無しさん:2009/10/19(月) 23:23:36
【C言語歴】 1ヶ月 【レベル】  超初心者 【コンセプト】 ちゃんと動くように書くのが精一杯
【コメント】 先月からC言語を勉強しはじめました。無限ループから抜け出せない。。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_NUM (100)

int main (void){
int rnd[MAX_NUM] = {0};
int i, j, temp;
MORE:
for(i = 0; i < MAX_NUM; ){
temp = 0;
srand((unsigned)time(NULL));
temp = rand () % MAX_NUM;
if (0 < temp && temp < MAX_NUM){
for (j = 0; j = i; j++){
if (rnd[j] != temp){
rnd[i] = temp;
i++;
}else
goto MORE;
}
}else
goto MORE;
}
for ( i = 0; i <= MAX_NUM - 1 ; i++){
printf ("%d\n", rnd[i]);
}
return (0);
}
4543:2009/10/19(月) 23:25:35
100*2で出力になってる…
memsetは1でi>=100でbreak

これだと発生しにくい数が出るけど…
46デフォルトの名無しさん:2009/10/19(月) 23:36:03
>>37
目から鱗が・・。
コンパイル通りませんでしたが。
コピペだからでしょうか。

そのアルゴいただきます。
47 ◆yic3X9PxrE :2009/10/19(月) 23:49:20
>37
これは良いお手本。

>40
レベル考えりゃ上出来。叩き台にはむしろこちらが相応しい。
敢えてツッコミ入れるなら、
・稀に「1と1を交換」のような、無駄な操作が発生する辺りは要改善かも。
・並べ替えの部分は↓を先頭に持ってきて、swap処理を固めた方が好ましいかと。
 int selected_index = rand() % (MAX - i) + i;
48 ◆yic3X9PxrE :2009/10/20(火) 00:42:15
>43
・if(i>=100) break; は while の条件に書けば良いような。(効率気にするならdo〜while)
・1で初期化し-1するより、0で初期化し、1代入の方が良い気が。
 (「配列全体を0で初期化」なら char map[100] = {0}; のように書けるので。)
・アルゴリズムは中々凝ってるような。(一部良く分からないけど…)


>44
・まづはgoto使うのを止めれ。ループとかブロック脱出に使うのは絶対ダメ。
・else ケースに括弧を付けるべき。括弧の対応が分かり辛く、フローも追い難い。

ちなみに無限ループに陥るのは、i がMOREにジャンプする度リセットされるから。
かつ内側のforループ内でほぼ確実にMOREにジャンプする。
49デフォルトの名無しさん:2009/10/21(水) 05:29:42
この問題じゃ工夫の余地が無いよな。
50デフォルトの名無しさん:2009/10/21(水) 06:10:06
>> // データの並べ替え
>> srand(time(NULL));
>> for(int i = 0; i < LENGTH; i++)
>> >40
>> ・稀に「1と1を交換」のような、無駄な操作が発生する辺りは要改善かも。
for(int i = 0; i < LENGTH-1; i++)
51 ◆yic3X9PxrE :2009/10/21(水) 23:21:31
>50

それだけでは不足。
selected_index の範囲も要修正。


>46
>コンパイル通りませんでしたが。

c99対応のコンパイラ(gccなど)が必要。
52デフォルトの名無しさん:2009/10/22(木) 00:59:05
良う修正せん。どう修正する。
53デフォルトの名無しさん:2009/10/22(木) 10:49:43
>>52
何を?
54デフォルトの名無しさん:2009/10/22(木) 11:09:17
55デフォルトの名無しさん:2009/10/22(木) 11:17:13
>>54
どっちを?
56デフォルトの名無しさん:2009/10/22(木) 11:23:14
selected_index を修正する?
57デフォルトの名無しさん:2009/10/23(金) 00:54:03
>40
>int selected_index = rand() % (MAX - i) + i;

selected_index ⇒ i 〜 MAX-1
58デフォルトの名無しさん:2009/10/23(金) 01:49:52
>40
int selected_index = rand() % (LENGTH - i) + i;

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9999.c
5958:2009/10/24(土) 13:54:06
これをtemp省略前の状態にリバース!
http://pc12.2ch.net/test/read.cgi/tech/1255709298/229
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  int i, k, n, *p, temp;

  srand(time(0));
  scanf("%d", &n);
  p = malloc(n * sizeof(int));
  if(!p) return 1;

  for(i=0; i<n; i++) {
    p[i] = i;
    k = rand() % (i + 1);
    temp = p[i]; p[i] = p[k]; p[k] = temp;
  }

  printf("[");
  for(i=0; i<n; i++) printf(" %d", p[i]);
  printf(" ]\n");

  free(p);
  return 0;
}
60>>1:2009/11/08(日) 09:10:38
C/C++/STL/MFC/CLI 共通問題

【問題】 10進数を入力して2進数を表示する。
     ※入力は1回のみで、繰返しはしない。数字以外は入力しない。
     ※正数は先頭の0は表示しない。負数は32ビットを表示する、間に空白などは埋めない。
     ※入力にE又は小数点がある場合、浮動小数点数は32ビットで考える。

次の問題は 40 レス先の >>100
61デフォルトの名無しさん:2009/11/08(日) 10:47:38
頭の0を取るのは正規表現でも使ってください

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

void dmp(unsigned char *b, int len)
{
int i;
for(i = len; --i >= 0; ){
int j;
/* printf(" %02x ", b[i]); */
for(j = 256; (j >>= 1) > 0; ){
printf("%d", (b[i] & j) ? 1 : 0);
}
}
printf("\n");
}
62デフォルトの名無しさん:2009/11/08(日) 10:49:27
int main(int ac, char **av)
{
char buf[4096];
int i, f;
printf("input: (123, 0.5, 3.4e-6, etc...) > ");
fgets(buf, sizeof(buf), stdin);
printf(buf);
f = 0;
for(i = 0; i < strlen(buf); i++){
char c = buf[i];
if((c == '.') || (c == 'E') || (c == 'e')){
f = 1;
break;
}
}
if(f){
double d;
sscanf(buf, "%lf", &d);
printf("%.16f\n", d);
dmp((unsigned char *)&d, sizeof(d) / sizeof(char));
}else{
sscanf(buf, "%d", &i);
printf("%d\n", i);
dmp((unsigned char *)&i, sizeof(i) / sizeof(char));
}
return 0;
}
63デフォルトの名無しさん:2009/11/08(日) 11:27:06
>>61
リトルエンディアンとビックリエンディアンの判別くらいしないといけないね

>>60
ここの人か
http://pc12.2ch.net/test/read.cgi/tech/1256818218/442
6460:2009/11/08(日) 16:10:15
 >>61
 リトルエンディアンとビックリエンディアンの判別くらいしないといけないね
C++ でコンパイルしてください。ビックリ→ビッグ。ワーニング→ウォーニング
bool is_little_endian(unsigned char *b)
{
  return b[0] ? true : false;
}

void dmp(unsigned char *b, int len, bool fill)
{
  int i, j; bool zero = false;
  if(i=1, is_little_endian( (unsigned char *)&i )){
    for(i = len; --i >= 0; )
      for(j = 256; (j >>= 1) > 0; ) {
        if(b[i] & j) zero = true;
        if(fill || zero) printf("%d", (b[i] & j) ? 1 : 0);
      }
  } else {
    for(i = -1; ++i < len; )
      for(j = 256; (j >>= 1) > 0; ) {
        if(b[i] & j) zero = true;
        if(fill || zero) printf("%d", (b[i] & j) ? 1 : 0);
      }
  }
  printf("\n");
}
65デフォルトの名無しさん:2009/11/09(月) 14:52:05
>>60
>     ※入力にE又は小数点がある場合、浮動小数点数は32ビットで考える。
整数はなんとなくわかるが、浮動小数点数の仕様がわからない。
具体例をあげてくれ。
0.0 =>
1.0 =>
0.1 =>
1E2 =>
1E-1 =>

ところで、回答してるやつはちゃんとテストしている?
0 => 0
1 => 1
-1 => 11111111111111111111111111111111 (1が32個)
65535 => 11111111111111 (1が16個)
-65536 => 111111111111110000000000000000 (1が16個と0が16個)
2147483647 => 1111111111111111111111111111111 (1が31個)
-2147483648 => 10000000000000000000000000000000 (1が1個、0が31個)
特にエンディアンがどうこう言ってるやつは、リトルエンディアンとビッグエンディアンの両方でテストしている?
66デフォルトの名無しさん:2009/11/10(火) 15:56:34
input: (123, 0.5, 3.4e-6, etc...) > 0.0
0
00000000000000000000000000000000
0
0000000000000000000000000000000000000000000000000000000000000000

input: (123, 0.5, 3.4e-6, etc...) > 1.0
1
00111111100000000000000000000000
1
0011111111110000000000000000000000000000000000000000000000000000

input: (123, 0.5, 3.4e-6, etc...) > 0.1
0.1000000014901161
00111101110011001100110011001101
0.1
0011111110111001100110011001100110011001100110011001100110011010

input: (123, 0.5, 3.4e-6, etc...) > 1E2
100
01000010110010000000000000000000
100
0100000001011001000000000000000000000000000000000000000000000000

input: (123, 0.5, 3.4e-6, etc...) > 1E-1
0.1000000014901161
00111101110011001100110011001101
0.1
0011111110111001100110011001100110011001100110011001100110011010
67デフォルトの名無しさん:2009/11/10(火) 16:18:26
>>66
>【問題】 10進数を入力して2進数を表示する。
題意にそえば、10進数の0.5は2進数では0.1になるはずだが。
0.75(decimal)ならば0.11(binary)
68デフォルトの名無しさん:2009/11/10(火) 20:00:57
IEEEの仕様があるのは知ってるか?
69デフォルトの名無しさん:2009/11/10(火) 23:00:40
>>67
それはただの少数であって浮動小数点数ではないから題意に添わない
70デフォルトの名無しさん:2009/11/10(火) 23:25:18
71デフォルトの名無しさん:2009/11/10(火) 23:31:45
>>67
しったか乙
72デフォルトの名無しさん:2009/11/11(水) 01:56:45
>>69
基の問題文は、浮動小数点数と明記していないから、67のような捉え方もできると思う。
もっとも、その後の※を読めば浮動小数点数なのだろうとは考えられるけど。
73デフォルトの名無しさん:2009/11/23(月) 00:53:29
捕手
74デフォルトの名無しさん:2009/12/06(日) 07:57:49
次のようなデータがテキストファイルで1ギガ程度あり、これを数値順にソートしたいです。
どのようにすればいいですか。

文字列 タブ文字1個 数値
・・・・・・・・・・ ・・
・・・・・ ・・
[参考]文字列は可変長です、文字列にタブは含みません。
数値範囲は32ビットunsigned intの整数です。
課題の要点ではないので、ソートはqsort等ライブラリを使用して下さい。
速度の為、malloc, newを使うなら、1024個を1回にとか、まとめてして下さい。
7574:2009/12/06(日) 07:59:40
次のレス番は>100くらい
7674:2009/12/06(日) 12:08:24
> 文字列は可変長です、文字列にタブは含みません。
文字列の長さは固定長の間違いでした。
77デフォルトの名無しさん:2009/12/06(日) 13:00:12
> 文字列の長さは固定長
そんなら OS で用意されている sort 使うよw
※"文字列は可変長"でも sort 使うが
78デフォルトの名無しさん:2009/12/06(日) 13:53:38
sort -n +1
79デフォルトの名無しさん:2009/12/26(土) 08:34:04
題目:宝くじの「還元率計算」
入力:標準ストリーム(テキストファイル)
1行目 1枚の金額 "," 発売総枚数
2行目以降 順位 "," 当選金額 "," 当選本数
最終行 改行
出力:標準ストリーム
タイトル行
入力データ、各行毎の期待値
合計期待値、還元率

ヒント:当選確率*当選金額=期待値(予想配当額)
    期待値/1枚の金額=還元率

CUI/GUIどちらでも可
次スレは>>100あたり
80デフォルトの名無しさん:2009/12/26(土) 10:00:24
宝くじって売り切れる訳じゃないんだろ
売れ残った部分に当りくじがあったら
還元率は大幅に下がるんじゃね?
81デフォルトの名無しさん:2009/12/26(土) 10:13:23
>>80
あなた、いつ議員に「当選」したんだ?
82デフォルトの名無しさん:2010/02/19(金) 15:50:26
[1] 授業単元:
[2] 問題文(含コード&リンク):

一次方程式y=a*x+bにおいて、A[x1,y1]とB[x2,y2]が与えられた時、
方程式の係数a,bを求めよ。
x1 y1: 450 454.4
x2 y2: 452 454.8
y=0.2*x+364.4

[3] 環境
 [3.1] OS: (Windows)
 [3.2] コンパイラ名とバージョン: (Visual C++)
 [3.3] 言語: (C++/CLI C/Win32API C++/MFC いづれか)
[4] 期限: ( なし )
[5] その他の制限: ( GUIまたはgetc()で終わること)
83デフォルトの名無しさん:2010/02/20(土) 15:41:01
>>82
宿題はスレ違い
84デフォルトの名無しさん:2010/02/28(日) 08:23:12
#include <malloc.h>
#define MAXSIZE 20
typedef double WORD;
main(){
WORD (*b)[100];
WORD *a[2];
int i=1,j=1;

b = malloc(sizeof(WORD)*MAXSIZE*2);
a[0] = malloc(sizeof(WORD)*MAXSIZE);
a[1] = malloc(sizeof(WORD)*MAXSIZE);

b[i][j] = 0;
a[i][j] = 0;
/* [と]を使わない方法は?*/
b[i][j] = 0;
a[i][j] = 0;
}
85デフォルトの名無しさん:2010/02/28(日) 17:47:41
>>84
b??(i??)??(j??) = 0;
a??(i??)??(j??) = 0;
86デフォルトの名無しさん:2010/02/28(日) 19:14:14
b<:i:><:j:> = 0;
a<:i:><:j:> = 0;
87デフォルトの名無しさん:2010/03/03(水) 03:08:44
>>86
すげー、ほんとにコンパイル通る。
それなんて名前なの?記号だけなのでググりようがない。
88デフォルトの名無しさん:2010/03/03(水) 22:31:16
memset() すりゃいいんでないの?w
89デフォルトの名無しさん:2010/03/04(木) 09:47:49
0で初期化したいんならcalloc()でいいだろw

*(*(b + i) + j) = 0;
*(*(a + i) + j) = 0;
90デフォルトの名無しさん:2010/03/04(木) 20:52:47
>>87
ダイグラフ
9184:2010/03/04(木) 23:36:37
>>89
WORD (*b)[2]; // まちがえた
92デフォルトの名無しさん:2010/03/07(日) 02:46:41
>>90
とんくす
日本語じゃ情報少ないのな。英語だとWikipediaにのってるが
9384:2010/03/07(日) 08:18:53
Trigraph
× トリグラフ
○ トライグラフ
http://dic.yahoo.co.jp/dsearch?p=trigraph&dtype=1
94デフォルトの名無しさん:2010/03/22(月) 09:38:47
コンパイラ名とバージョン: (Visual C++)

作業用フォルダの所は空白、ソースと同じフォルダにショートカットは有ります。
ショートカット「Visual Studio 2005」
から cl xxx.cpp するのが面倒な場合はどのようにするのでしょうか。
PATHをずらっと並べるのは無しで.batのみで可能でしょうか?
95デフォルトの名無しさん:2010/03/23(火) 01:04:08
>>94
まず、ここは質問スレじゃない。
さらに、それはC/C++の問題ではない。
96デフォルトの名無しさん:2010/03/23(火) 10:09:52
C#, C♯, C#相談室 Part55
>>95 返信サンキュこちらで聞いてきます。
97デフォルトの名無しさん:2010/03/27(土) 21:58:00
>>2
【C++言語歴】 15時間
【レベル】 超ド素人
【コンセプト】 えっ・・と・・・
【コメント】 参照?ポインタ?構造体?クラス?イミフ

#include <iostream>
using namespace std;

int main() {
double a, b, c, d, e, sum;

cout << "5つの数の合計と平均値を出力します。" << endl;
cin >> a >> b >> c >> d >> e;

sum = a + b + c + d + e;

cout << "合計は" << sum << "で、平均は" << sum/5 << "です。" << endl;
}
98デフォルトの名無しさん:2010/03/28(日) 08:36:40
>>2
【レベル】 プロ
#include <iostream>
using namespace std;
struct Average {
  int count;
  double total;
  Average() : count(0), total(0.0) {}
};
int main(){
  Average a;
  double data;

  for(int i=0; i<5; i++){
    cout << "Input Number:";
    cin >> data;
    a.total += data;
    a.count++;
  }
  cout << "total=" << a.total << endl;
  cout << "average=" << a.total/a.count << endl;
}
99デフォルトの名無しさん:2010/03/28(日) 17:21:22
次の問題は>>100
100デフォルトの名無しさん:2010/03/29(月) 10:53:12
【問題】
点A、点B、点Cがあり、点Aと点C、点Cと点Bがそれぞれ線分ac、線分bcで結ばれている。
点A、点Bの座標(Pa(xa, ya), Pb(xb, yb))と線分の長さ(Lac, Lbc)が与えられたとき、点Cの座標を求めよ。
但し、解は一つとは限らない。
また、与えられた座標または長さが不適切で求められない場合はそれと判るようにすること。
# 作図的には点A、点Bからそれぞれ半径Lac、Lbcの円を書いて交点を求めればいいが……
101デフォルトの名無しさん:2010/03/29(月) 15:59:04
もっとゆとりでも解けるような問題が欲しいよ
102デフォルトの名無しさん:2010/03/29(月) 16:14:25
ユークリッド平面でいいの?
103デフォルトの名無しさん:2010/03/29(月) 16:41:57
>>101
それじゃ、次の制約でどうぞ。
・ya == yb, Lac == Lbc

>>102
非ユークリッド平面だと私自身がついていけないからパスw
104デフォルトの名無しさん:2010/03/29(月) 16:45:45
要は三角不等式と2円の交点でしょ?
105デフォルトの名無しさん:2010/03/29(月) 18:16:54
2つの球の交線(円)かもしれん
106デフォルトの名無しさん:2010/03/30(火) 01:39:29
これってA点を (0,0) に移動して
計算するとわりと簡単?
107デフォルトの名無しさん:2010/03/30(火) 14:41:15
いや計算量は変わらん

むしろ座標系を回転して >>103 が正解(ry
108デフォルトの名無しさん:2010/04/13(火) 22:08:11
>>26のさ

for(i=0; i<MAX_NUM; i++){
// printf("何かの数:");
if(scanf("%lf", &data ) != 1) break;  ←この文
// printf("%g\n", data);
sum += data;
}

ifの中身がよくわからんないんだけどどうなってんの?
109デフォルトの名無しさん:2010/04/14(水) 00:10:05
>>108
if(!(scanf("%lf", &data))) break;

if(!(scanf("%lf", &data))!=0) break;
と変形した後に
if(scanf("%lf", &data)==0) break;
と変形するのが正しい
※論理否定は必ず否定が掛かっている方の真偽を逆にする
と言っても、cinの定義なんか覚えてないから
単純に戻り値をscanf()に置き換えて良いかは知らんので
そこら変は他の人にまかせる
110109:2010/04/14(水) 00:15:40
※論理否定は必ず否定が掛かっている方の真偽を逆にする
って書いたけど、何か違うな…
正確には、偽で比較するって言うか、真で比較しては駄目っての言うのが正しいのか?
111デフォルトの名無しさん:2010/04/14(水) 00:20:39
そもそも>>108が分からないのがifの何なのかが俺には分からない。
112デフォルトの名無しさん:2010/04/14(水) 00:27:56
>>109-110
ごめんよくわかんない

>>111
if文の()の中身の
scanf("%lf", &data ) != 1
ってどういうこと?って意味
113デフォルトの名無しさん:2010/04/14(水) 00:46:00
>>112
scanfの戻り値が1でない場合真

int scanf(const char* format, ...);
scanfの戻り値は"formatで指定された型に従って代入に成功した要素数"

scanf("%lf", &data )
↑でdataに代入成功すれば1が返る 失敗すれば多分0(scanfなんて使わないから分からない)
114デフォルトの名無しさん:2010/04/14(水) 00:57:19
>>112
今回の要素数は1個なので>>118のように変形しても大丈夫だが
2以上の数値が変える場合、変形には気をつけないとね

NG例
!(2) != 0
両辺に論理否定をかけて
!(!(2)) != !(0)
左辺の二回の論理否定を打ち消すと
2 != !(1)
さらに変形すると
2 != 1
真になってしまう

OK例
!(2) != 0
両辺に論理否定をかけて
!(!(2)) != !(0)
変形すると
!(0) != 1
さらに変形すると
1 != 1
よって偽になる(これが正解)
115114:2010/04/14(水) 01:00:30
>>118に期待しよう…orz
まあ、こんな感じで、ミスを避けるために、
数値の真偽を問う場合は、必ずfalse(0)と比較するってのが良く使われる。
116デフォルトの名無しさん:2010/04/14(水) 01:17:26
>>100
答えの数までは簡単に出せるが、その先が思いつかん…
何か、結構単純な解き方になる気もするのだが…

Lab = sqrt( fabs( pow( xa - xb, 2.0 ) + pow( ya - yb, 2.0 ) ) )
ans = 0;
if( ( Lac + Lbc == Lab ) || ( Lab == fabs( Lac - Lbc ) ) ) ans = 1;
if( ( Lac + Lbc < Lab ) && ( Lab < fabs( Lac - Lbc ) ) ) ans = 2;
117デフォルトの名無しさん:2010/04/15(木) 00:11:52
Cが2コ存在する場合要するに三角形が出来る場合
正解かどうかも分からんし考えながら起こしたのでもの凄い汚い点に注意。

double Len_AB, Len_AC, Len_BC;
double Pnt_XA, Pnt_XB, Pnt_XC1, Pnt_XC2, Pnt_YA, Pnt_YB, Pnt_YC1, Pnt_YC2;
double angle;
double Pnt_XB1, Pnt_YB1;

/*
入力部分は面倒なんで省略
値が入力されるのはLen_AC, Len_BC, Pnt_XA, Pnt_YA, Pnt_XB, Pnt_YB

Aを(0,0)に移動するとBの座標が変化する
Bの新座標は元の座標からAの座標を引けば良いので
*/
Pnt_XB1 = Pnt_XB - Pnt_XA;
Pnt_YB1 = Pnt_YB - Pnt_YA;

/*
(0,0)に移動後のAを中心にBを回転させ、Bの座標を(0,X)にする
回転させる角度は正接から出せる(tanX=Pnt_YB1/Pnt_XB1)
ついでにABの長さ(Len_AB)も出しておく
*/
angle = atan(Pnt_YB1/Pnt_XB1);
Len_AB = sqrt(pow(Pnt_XB1, 2) + pow(Pnt_YB1, 2));

/*
回転後のBのX座標は長さそのもの
*/
Pnt_XB1 = Len_AB;
118デフォルトの名無しさん:2010/04/15(木) 00:15:16
つ*づ*き
sqrt,pow,sin,cos,atan等使ったこと無いので何か使い方間違ってるかも

/*
Cの座標を(a,b)と仮定すると、三平方の定理から
a^2 + b^2 = Len_AC^2
また、CからX軸に垂線を下ろして、交差したところをpとすると、
pの座標は(a,0)になり、更に
(Len_AB - a)^2 + b^2 = Len_BC^2
になるので、この連立式を解く

a^2 + b^2 = Len_AC^2
Len_AB^2 - ( 2 * Len_AB * a ) + a^2 + b^2 = Len_BC^2

上の式から下の式を引くと

-Len_AB^2 + ( 2 * Len_AB * a ) = Len_AC^2 - Len_BC^2
2 * Len_AC * a = Len_AC^2 - Len_BC^2 + Len_AB^2
a = ( Len_AC^2 - Len_BC^2 + Len_AC^2 ) / 2 * Len_AC

となる
*/
Pnt_XC = ( Len_AC^2 - Len_BC^2 + Len_AC^2 ) / 2 * Len_AC;

/*
CのX座標が分かったので、後は三平方の定理からCのY座標を出せる
Len_AB^2 = Pnt_XC^2 + Pnt_YC^2
*/
Pnt_YC1 = sqrt(pow(Len_AB, 2) - pow(Pnt_XC, 2));

119デフォルトの名無しさん:2010/04/15(木) 00:17:42
お*わ*り
数学なんざやるの久々だから正しい保証はない

/*
CのY座標は負値もある
*/
Pnt_YC2 = Pnt_YC1 * -1;

/*
CのXY座標が分かったので、回転させて戻す
*/
Pnt_YC1 = Len_AB * sin(angle) + Len_BC * cos(angle) + Pnt_YA;
Pnt_XC1 = Len_AB * cos(angle) - Len_BC * sin(angle) + Pnt_XA;
Pnt_YC2 = Len_AB * sin(angle) - Len_BC * cos(angle) + Pnt_YA;
Pnt_XC2 = Len_AB * cos(angle) + Len_BC * sin(angle) + Pnt_XA;
120デフォルトの名無しさん:2010/04/15(木) 02:00:40
cからabを通る直線上に垂線を下ろしたときの交点をdとすると垂線の長さhの2乗は
h*h = Lac*Lac - Xd*(Xd + 2*Xa) - Xa*Xa - Yd*(Yd + 2*Ya) - Ya*Ya
かつ
h*h = Lbc*Lbc - Xd*(Xd + 2*Xb) - Xb*Xb - Yd*(Yd + 2*Yb) - Yb*Yb

ここでXn = Xa - Xb、Yn = Ya - Ybとすると
a,b,dは同じ直線上にあるので、あるkに対して
Xd = Xa + k*Xn、Yd = Ya + k*Xn
が成立する

以上から変数k以外しか含まない2次方程式ができるから、解いたらkが求まる。
(kが求まらないときは三角形になっていない)
kがわかれば、dの位置が確定するから、adとcdが直角(=内積が0)、bdとcdが直角
で連立して解けばいいじゃないって… どこがプログラミングの問題だよw
121デフォルトの名無しさん:2010/04/15(木) 02:02:15
>>120 訂正
×Yd = Ya + k*Xn ○Yd = Ya + k*Yn
122デフォルトの名無しさん:2010/04/15(木) 02:09:26
あ、内積じゃなくて高さ求めるのかw ごめん。
でadと直角な単位ベクトルにhと-hをかけて二つ答えだしておしまいだ。
123デフォルトの名無しさん:2010/04/15(木) 22:23:40
>>113-114
サンクス
数字だと1をかえしてそれ以外だと0かえして
ブレイクしてやんお!
ってことだよねと、わかったかんじだ
124デフォルトの名無しさん:2010/04/15(木) 23:48:04
>>103の条件(ya == ybのみでも可)であれば、三角形ABCの三辺の長さから
ヘロンの公式で面積Sを求めて、底辺を辺Labとする高さh(座標yc)を求め
その高さと、辺Lac、辺Lbcのどちらかと、三平方の定理で座標yxcを求めて終わり
ただ>>100の条件では、やっぱり分からんわ…

double Lab, Lac, Lbc, xa, ya, xb, yb, xc, yc1, yc2, s, S, h, w;
// xa = xxx, ya = xxx, xb = xxx, yb = xxx, Lac = xxx, Lbc = xxx;
// → 解が2点となるような点であること
Lab = fabs( xa - xb );
// ヘロンの公式から三角形ABCの面積Sを求める
s = ( Lab + Lac + Lbc ) / 2;
S = sqrt( s * ( s - Lab ) * ( s - Lac ) * ( s - Lbc ) );
// → Sの計算でエラーが発生した場合解なし
//  → 解が一つの場合の処理も省略しているので、解無しの処理も省略
// 面積Sから辺Labを底辺とした三角形の高さhを求める
h = S / Lab * 2;
// 三角形ABCの高さhから、座標 yc1, yc2 を求める
yc1 = ya + h;
yc2 = ya - h;
// 三角形ABCの頂点Cから垂直に降ろした点をOとする(線分COは高さhに等しい)
// 三角形ACOの垂辺CO(高さh)と斜辺Lacから底辺AOの長さwを求める
w = sqrt( pow( Lac, 2.0 ) - pow( h, 2.0 ) );
// 三角形ACOの底辺AOの長さwから座標xcを求める
// → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定
xc = xa + ( xa > xb ? 1 : - 1 ) * ( Lac < Lab ? 1 : -1 ) * w;

125デフォルトの名無しさん:2010/04/15(木) 23:53:11
プログラマは数学出来ない人多いんだなと驚いた
126124:2010/04/16(金) 00:04:59
> // → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定
> xc = xa + ( xa > xb ? 1 : - 1 ) * ( Lac < Lab ? 1 : -1 ) * w;
最後間違えてるな…

// → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定
xc = xa + ( xa > xb ? 1 : - 1 ) * ( pow( Lac, 2.0 ) < ( pow( Lab, 2.0 ) + pow( h, 2.0 ) ) ? 1 : -1 ) * w;
127デフォルトの名無しさん:2010/04/24(土) 01:34:54
100の出題者はそろそろ解答書くべきじゃないの。
それに問題複数あった方がつまらない問題無視できるからいいと思う。
128デフォルトの名無しさん:2010/04/24(土) 01:38:20
【問題1:時計】
現在時刻をアスキーアートで表示せよ

【表示例】
●●○○○●○○○○○○●○●○○●●
○○●○●○●○○●○○●○●○●○○
○●●○●○●○○○○○●●●○●●●
●○○○●○●○○●○○○○●○●○●
●●●○○●○○○○○○○○●○●●●

【難易度】
40分で初級
129デフォルトの名無しさん:2010/04/24(土) 01:44:05
適当に作ったので面白いかどうかはしらないけれど
こんな感じの問題名、解答時間、難易度つきテンプレ希望
130デフォルトの名無しさん:2010/04/24(土) 09:17:18
できたが、俺にはAA作りの才能がないことが分かったのと、codepadじゃ時間取得系関数動かねぇ。
http://codepad.org/E9sGRiit

ローカルでの実行結果。
○●○○●●●○○○○○○●○○○●●
●○●○●○●○○●○○●●○○●○○
●○●○●●●○○○○○○●○○●●●
●○●○○○●○○●○○○●○○●○●
○●○○●●○○○○○○●●●○●●●
131デフォルトの名無しさん:2010/04/24(土) 09:37:15
>>129
所要時間: 25分
感想: 文字盤を作るのが面倒…orz
問題の品質: △(文字盤を作るのがメインになってしまうので…)

#include <stdio.h>
#include <time.h>
#define artrow 5
#define artcol 7
int main() {
int i, j, idx[artrow]; time_t timer; struct tm *t_st;
char art[][artrow][artcol] = {
{ "○●○", "●○●", "●○●", "●○●", "○●○", },
{ "○○●", "○○●", "○○●", "○○●", "○○●", },
{ "●●○", "○○●", "○●●", "●○○", "●●●", },
{ "●●○", "○○●", "●●○", "○○●", "●●○", },
{ "●○●", "●○●", "●●●", "○○●", "○○●", },
{ "●●●", "●○○", "●●●", "○○●", "●●○", },
{ "○●●", "●○○", "●●●", "●○●", "●●●", },
{ "●●●", "○○●", "○○●", "○●○", "●○○", },
{ "●●●", "●○●", "●●●", "●○●", "●●●", },
{ "●●●", "●○●", "●●●", "○○●", "●●○", },
{ "○○○", "○●○", "○○○", "○●○", "○○○", },
};
time(&timer); t_st = localtime(&timer);
idx[0] = t_st->tm_hour / 10; idx[1] = t_st->tm_hour % 10; idx[2] = 10;
idx[3] = t_st->tm_min /10 ; idx[4] = t_st->tm_min % 10;
for( i=0; i<artrow; i++ ) for( j=0; j<5; j++ )
printf( "%s%s", art[idx[j]][i], j == 4 ? "\n" : "○" );
return 0;
}
132デフォルトの名無しさん:2010/04/24(土) 09:46:00
○があると読みにくいので
スペースに置き換えてください
ずれないように注意出来たら二段
133130:2010/04/24(土) 10:10:14
うげぇ、配列サイズ足りてねぇorz
134131:2010/04/24(土) 11:20:02
変数名等、全体の見通しを良くして、さらにAAを>>130から借用。

#include <stdio.h>
#include <time.h>
#define FIELD_ROW_SIZE 5
#define FIELD_COL_SIZE 5
#define ART_KIND_COUNT 11
#define COLON_IDX 10
int main() {
int row, idx, cols[FIELD_COL_SIZE];
time_t timer;
struct tm *t_st;
char *art_ptr[FIELD_ROW_SIZE][ART_KIND_COUNT] = {
{ "○●○", "○●○", "●●○", "●●○", "●○●", "●●●", "○●●", "●●●", "●●●", "●●●", "○○○" },
{ "●○●", "●●○", "○○●", "○○●", "●○●", "●○○", "●○○", "●○●", "●○●", "●○●", "○●○" },
{ "●○●", "○●○", "○●●", "●●○", "●●●", "●●○", "●●●", "○○●", "○●○", "●●●", "○○○" },
{ "●○●", "○●○", "●○○", "○○●", "○○●", "○○●", "●○●", "○○●", "●○●", "○○●", "○●○" },
{ "○●○", "●●●", "●●●", "●●○", "○○●", "●●○", "●●●", "○○●", "●●●", "●●○", "○○○" },
}, *field_sep[FIELD_COL_SIZE] = { "○", "○", "○", "○", "\n"} ;
time(&timer);
t_st = localtime(&timer);
cols[0] = t_st->tm_hour / 10;
cols[1] = t_st->tm_hour % 10;
cols[2] = COLON_IDX;
cols[3] = t_st->tm_min / 10;
cols[4] = t_st->tm_min % 10;
for( row=0; row<FIELD_ROW_SIZE; row++ ) for( idx=0; idx<FIELD_COL_SIZE; idx++ )
printf( "%s%s", art_ptr[row][cols[idx]], field_sep[idx] );
return 0;
}
135デフォルトの名無しさん:2010/04/24(土) 13:58:53
// UTF-8 SJIS EUC 対応してたらちょっと時間掛かった
#include <stdio.h>
#include <time.h>
#define COLON_IDX 10
#define DOT "●"
char *cout(char *b, unsigned int s, int n, int r){
  unsigned short art[] = { 0x56d4, 0xe934, 0xe746, 0x71c6, 0x93da, 0x719e, 0xf79c, 0x925e, 0xf55e, 0x73de, 0x0820 };
  unsigned short i, j, c, d;
  --s;
  for(i = 0, c = art[n]; i < r; ++i) c >>= 3;
  for(i = 0; i < 3 * s; i += s)
    for(j = 0, d = (c >>= 1); j < s; ++j)
      b[i + j] = d & 1 ? "●"[j] : "○"[j];
  b[i] = 0;
  return b;
}
int main(int ac, char **av){
  time_t timer;
  struct tm *t;
  char b[sizeof(DOT) * 3];
  int i;
  time(&timer);
  t = localtime(&timer);
  for(i = 0; i < 5; ++i){
    printf("%s○", cout(b, sizeof(DOT), t->tm_hour / 10, i));
    printf("%s○", cout(b, sizeof(DOT), t->tm_hour % 10, i));
    printf("%s○", cout(b, sizeof(DOT), COLON_IDX, i));
    printf("%s○", cout(b, sizeof(DOT), t->tm_min / 10, i));
    printf("%s\n", cout(b, sizeof(DOT), t->tm_min % 10, i));
  }
  return 0;
}
136デフォルトの名無しさん:2010/04/24(土) 14:12:24
http://www2.ezbbs.net/24/techside/img/1266584278_1.jpg

このパズルを解くプログラム
137デフォルトの名無しさん:2010/04/24(土) 14:19:04
>>136
すまんがシラミツブシは興味ないんよ
それより論理的にさ
ここに1を置いたら絶対全部の合計は等しく出来ないから
1はこっちかこっちにしか置けない
っていう風に考えたい訳
138デフォルトの名無しさん:2010/04/24(土) 16:38:16
>>136程度だと総当たりでも十分速いだろなぁ。
それ書くくらいならナンプレの答え探すプログラムの方がいいんじゃね?
139デフォルトの名無しさん:2010/04/24(土) 18:04:37
>>136がわからない
なにこれどうすんの?
140デフォルトの名無しさん:2010/04/24(土) 18:33:55
総和が5の倍数であることを利用するとあまる数字の組み合わせを何個かに限定できるかな
141デフォルトの名無しさん:2010/04/24(土) 18:49:23
1~10の総和は55
和がすべて等しいので
和の値は55/5=11
4個の和で11になる組み合わせを選ぶ

142デフォルトの名無しさん:2010/04/24(土) 18:59:23
え?
143デフォルトの名無しさん:2010/04/24(土) 19:04:15
>>141
それで解けたら1億やるよw
144デフォルトの名無しさん:2010/04/24(土) 19:09:01
>>141でやるとかむずいな
145デフォルトの名無しさん:2010/04/24(土) 19:10:17
むずいとかじゃなくて、解がない
146デフォルトの名無しさん:2010/04/24(土) 19:18:42
4個の和が11じゃねーだろw
全ての位置は2回数えられるから2倍にして4個の和が22になる組み合わせを選ぶ。

まあ、それでも解はないんだけどねw
147デフォルトの名無しさん:2010/04/24(土) 19:22:28
>>136
7-11いい気分
148デフォルトの名無しさん:2010/04/24(土) 19:26:21
>>147
プログラムお願いします
149デフォルトの名無しさん:2010/04/24(土) 19:27:16
宿題スレのでも見とけ
150デフォルトの名無しさん:2010/04/24(土) 19:55:56
数学の問題にも著作権はあるんだからパクリはいくない
151デフォルトの名無しさん:2010/04/24(土) 23:22:00
問題
ジョーカーを除いたトランプ1組(52枚)で下記のルールで神経衰弱を行った場合、
最大何手必要なのかを求めるプログラム。
※但しコンピュータは最善の手を実行するものとする。

1. 52枚を適当にシャッフルしカードを伏せる(ことにする)
2. カードを2枚めくる(この行為を1手と数える)
2-1. 同じ数字であれば表にする(ことにする)
2-2. 異なる数字であれば、それらの数字を覚えて裏に戻す(ことにする)
3. 全てのカードが表になった(ことになった)ら終了
152デフォルトの名無しさん:2010/04/24(土) 23:51:13
>>151
それも数学の問題。プログラミングできないなら無理に出題しないでいいよ。
答えは全てのカードを覚えるのにかかる回数26回と
全てのカードを取るのにかかる回数26回の合わせて52回。
153デフォルトの名無しさん:2010/04/25(日) 00:02:36
>>152
不正解
覚えるのは25回で十分
154デフォルトの名無しさん:2010/04/25(日) 00:16:41
いや26回だ
155デフォルトの名無しさん:2010/04/25(日) 00:21:08
>>154
指摘してやってるのに分からんいなんてアホなのか?
25回覚えて、取り始めは、残った2枚のうちの1枚から始めれば良い。
(1枚取った時点で全てのカードが把握できる)
156152:2010/04/25(日) 00:31:34
>>155
言われみればそうだね。でも154はおれじゃねえ。
157デフォルトの名無しさん:2010/04/25(日) 00:44:56
いや合わせて50回だ
158デフォルトの名無しさん:2010/04/25(日) 00:50:12
そうだorz
159デフォルトの名無しさん:2010/04/25(日) 00:51:41
>>157
>いや合わせて50回だ
何を合わせるんだ?
160157:2010/04/25(日) 01:23:37
最大40手 50回は間違い
161デフォルトの名無しさん:2010/04/25(日) 01:24:10
最大52回
162デフォルトの名無しさん:2010/04/25(日) 01:32:21
↓の26回を2回繰り返す
A-2 3-4 5-6 7-8 9-10 J-Q K-A
A-A 2-3 2-2 3-3 4-5 4-4 5-5 6-7 6-6 7-7
8-9 8-8 9-9 10-J 10-10 J-J Q-K Q-Q K-K
163157:2010/04/25(日) 02:07:42
A_1-A_2 A_3-A_4 A_5-A_6 A_7-A_8 A_9-A10 A11-A12 A13-B_1
C_1-D_1 B_2-B_3 C_2-D_2 C_3-D_3 B_4-B_5 C_4-D_4 C_5-D_5 B_6-B_7 C_6-D_6 C_7-D_7
B_8-B_9 C_8-D_8 C_9-D_9 B10-B11 C10-D10 C11-D11 B12-B13 C12-D12 C13-D13
26回中、終わった数は次の13回
C_1-D_1 C_2-D_2 C_3-D_3 C_4-D_4 C_5-D_5 C_6-D_6 C_7-D_7
C_8-D_8 C_9-D_9 C10-D10 C11-D11 C12-D12 C13-D13
ここまでで、A_1からA13 の位置が全て分かっている。
ここまでで、B_1からB13 の位置が全て分かっている。
ここまでで、C_1からC13 の位置が全て分かっている。
ここまでで、D_1からD13 の位置が全て分かっている。
まだ出ていないのは、ない。
残っているのは13回。合計39回。


↓の20回を2回繰り返す
A_1-A_2 A_3-A_4 A_5-A_6 A_7-A_8 A_9-A10 A11-A12 A13-B_1
A_1-B_1 B_2-A_2 B_3-A_3 B_4-A_4 B_5-A_5 B_6-A_6
B_7-A_7 B_8-A_8 B_9-A_9 B10-A10 B11-A11 B12-A12 B13-A13
 …
164デフォルトの名無しさん:2010/04/25(日) 04:07:54
1と2だけの8枚のとき6回、1と2と3だけの12枚のとき10回だから、52枚なら50回が正解
165デフォルトの名無しさん:2010/04/25(日) 06:15:43
なかなか難しいなw
結局何手が正しいのかわからないが、ネットワーク対戦とか少し面白そうと思ってしまったww
166デフォルトの名無しさん:2010/04/25(日) 07:51:20
方法はともかく、トランプの持つ情報量考えたら下限は見えてくるんじゃないかなぁ。
トランプの並べ方は52!/(4!^13) = 249987600 (27.897 bit)

けど、引いたカードをどう考えればいいんだろう。
最初は1/13の確率で引くカードを予言できるから、1枚引くと3.7 bit得られることになるんだが、
2枚目以降は引くカードによって得られる情報量が変わってくる。
167デフォルトの名無しさん:2010/04/25(日) 08:47:00
分かった。正解は39回だ。
各々の数に対して、丁度半分の2枚づつの情報が分かればOK。
1枚目は必ず知らない情報のカードをめくる。
そのカードの数の情報が1枚以下しか出てない場合、次に引くカードは知らない情報のカード。
2枚分かっていれば、分かっているカード組み合わせて表にしておく。
これを繰り返していけば、最悪、39回で全てのカードを表にできる。
168デフォルトの名無しさん:2010/04/25(日) 08:55:56
>>167
A-2 A-2 3-A 3-A 4-2 4-2 5-3 5-3 6-4 6-4
7-5 7-5 8-6 8-6 9-7 9-7 10-8 10-8 J-9 J-9
Q-10 Q-10 K-J K-J

最初から24手目までこういう風に出たら?
169167:2010/04/25(日) 09:05:18
何か少しだけ違う気がするな。
数の種類が奇数だと、+1回になりそうな気もするし、
>>155と組み合わせられる気もするし
無理やり取ってしまえば、上手く行きそうな気もする…。
細かいところまでは分からんが、正解は38〜40回のどれか
170169:2010/04/25(日) 09:07:05
>>168
おー、言われてみれば、そうだね。
2枚目が、被る場合も場合もあるのか…。
なかなか、上手くいかんの…
171デフォルトの名無しさん:2010/04/25(日) 09:42:23
>なかなか、上手くいかんの…
最大に上手く行かない手をどうぞ。

>>163 の者だけど
A_1-B_2 C_1-D_2 A_3-B_1 C_3-D_1 A_4-C_2 C_4-D_2 A_5-B_3 C_5-D_3 A_6-B_4 C_6-D_4
A_7-B_5 C_7-D_5 A_8-B_6 C_8-D_6 A_9-B_7 C_9-D_7 A10-B_8 C10-D_8 A11-B_9 C11-D_9
A12-B10 C12-D10 A13-B11 C13-D11

ここまでで24回、開いたカードは
A_1 A_2 A_3 A_4 A_5 A_6 A_7 A_8 A_9 A10 A11 A12 A13
B_1 B_2 B_3 B_4 B_5 B_6 B_7 B_8 B_9 B10 B11 B== B==
C_1 C_2 C_3 C_4 C_5 C_6 C_7 C_8 C_9 C10 C11 C12 C13
D_1 D_2 D_3 D_4 D_5 D_6 D_7 D_8 D_9 D10 D11 D== D==
後はどの裏カードから開いても、26回。合計50回

しかし、同じ開く順番なら
A_1-B_2 C_1-A_1 D_2-B_2 clear3
A_3-B_1 C_3-A_3 D_1-B_1 clear6
A_4-C_2 C_4-A_4 D_2-C_2 clear9
A_5-B_3 C_5-A_5 D_3-B_3 clear12
A_6-B_4 C_6-A_6 D_4-B_4 clear15
A_7-B_5 C_7-A_7 D_5-B_5 clear18
A_8-B_6 C_8-A_8 D_6-B_6 clear21
A_9-B_7 C_9-A_9 D_7-B_7 clear24
A10-B_8 C10-A10 D_8-B_8 clear27
A11-B_9 C11-A11 D_9-B_9 clear30
A12-B10 C12-A12 D10-B10 clear33
A13-B11 C13-A13 D11-B11 clear36
*12-*13 *12-*12 *13-*13 clear39
合計39回
172デフォルトの名無しさん:2010/04/25(日) 10:08:20
>>171
つまり、あれか?
情報がなんちゃらかんちゃら考えずに
分かってる組み合わせで取ってくのが最善手ってことか?
173デフォルトの名無しさん:2010/04/25(日) 10:12:51
取れるカード開いたときにとらないのはどう考えても開く回数の無駄だし。
174デフォルトの名無しさん:2010/04/25(日) 10:33:12
1枚目開いて知ってるのが出てきたときは、取らないと損。
2枚目で知ってるのが出たときは、取らなくてよい(取ったら損する場合があるが、取って得する場合はない)
175デフォルトの名無しさん:2010/04/25(日) 10:43:38
>>171
> しかし、同じ開く順番なら
> A_1-B_2 C_1-A_1 D_2-B_2 clear3
これは3手目以降が変わっていくのでは?
176デフォルトの名無しさん:2010/04/25(日) 13:06:56
[最悪のケース]
裏がえしのカードをめくると既に見たことのある数字がでまくる
(なければどれでも同じ)
ただし裏がえしのカードを二枚同時にめくったときは
二枚目は一枚目と違う数字の中から既に見たことのある数字がでまくる
(なければ一枚目と違う数字ならどれでも同じ)
最後の裏がえし4枚は同じ数字なのでめくると同時にとれる

だから52-2で50回だっつーの、とっくに結論でてるだろ


いい加減スレ違いなんだから終わりにしろよ
177デフォルトの名無しさん:2010/04/25(日) 13:20:30
2枚同時じゃなきゃにめくれないのか。onz
178デフォルトの名無しさん:2010/04/25(日) 13:34:31
どうしても理解できない人は、まだ開けたことのない所のカードをめくると
1 2 1 2 1 2 1 2 3 4 3 4 3 4 3 4 …
の順番にでてくる神経衰弱のプログラムを作ってみればいいんじゃない
50回だからw
179デフォルトの名無しさん:2010/04/25(日) 13:44:16
神経衰弱に2枚同時なんてルールはねーだろw
180デフォルトの名無しさん:2010/04/25(日) 14:00:57
ごめん39だわ…
181デフォルトの名無しさん:2010/04/25(日) 14:06:44
>>176==178
最後の裏がえし4枚は同じ数字なのでめくると同時にとれる
なんで、最後の4枚が同じ数字って予言出来るの?
そりゃ、>>1 2 1 2 1 2 1 2 3 4 3 4 3 4 3 4
って並べれば、残るのは全部13だけど、最後がこんなパターンだったら?
11 12, 11 12, 11 13, 11 13, 12 13, 12 13
182デフォルトの名無しさん:2010/04/25(日) 14:22:23
>>157==171?
トランプとしては直感的じゃないけどA->1, 10->A, J->B, Q->C, K->Dで表す。
こんな場合どうなる?(以下、俺の試算)

1-D, 2-D, 3-D, 4-D, 5-C, 6-C, 7-C, 8-C, 9-B, A-B (ここまで10回 0組)
1-1, 2-2, 3-3, 4-4, 5-5, 6-6, 7-7, 8-8, 9-9, A-A (ここまで20回10組)
1-B, 2-B, 3-A, 4-A, 5-9, 6-9, 7-8 (ここまで27回10組)

あとは、見てないもう一枚をみるところから始めれば
全てのカードが把握できるから、残り16回16組 ( 計43回 )

183デフォルトの名無しさん:2010/04/25(日) 14:47:51
182で正解のような気がするが
184デフォルトの名無しさん:2010/04/25(日) 15:01:48
マスターマインドというゲームがあります
4つの中身が不明な箱と
そのなかに4色のボールが入っていて
(同じ色は何度でも使えます)
中身を知らない方の人が4つ箱に入っているボールの色を予想して
中身を知っている方の人が
1.色だけがあっている数
2.色と場所があっている数
を教えます(ウソはつかないものとします)
正解を出すのに最低何回質問をすればよいでしょうか?
185160:2010/04/25(日) 15:04:02
A_1-A13, A_2-B13, A_3-C13, A_4-D13, A_5-A12, A_6-B12, A_7-C12, A_8-D12, A_9-A11, A10-B11 (ここまで10回 0組)
B_1-A_1, B_2-A_2, B_3-A_3, B_4-A_4, B_5-A_5, B_6-A_6, B_7-A_7, B_8-A_8, B_9-A_9, B10-A10 (ここまで20回10組)
C_1-C11, C_2-D11, C_3-C10, C_4-D10, C_5-D_9, C_6-C_9, C_7-C_8 (ここまで27回10組)

ここまでで場所の分かっているカードは
A_1〜A10,A11,A12,A13
B_1〜B10,B11,B12,B13
C_1〜C_8,C_9,C10,C11,C12,C13
     D_9,D10,D11,D12,D13
場所の分かっていないカードはD_1〜D_8 の8枚。残りの組は16組。27+16=43
186デフォルトの名無しさん:2010/04/25(日) 15:08:16
数学
http://science6.2ch.net/math/

よし、とりあえず板移動w
187GAME:2010/04/25(日) 15:20:18
188デフォルトの名無しさん:2010/04/25(日) 15:22:01
1 2 3 1 4 1 5 1 6 2 7 2 8 2 9 3 10 3 11 3 12 4 13 4 5 6 7 8 9 10 11 12 13 5 4 6 7 6 8 7 9 8 10 9 11 10 12 11 13
189160:2010/04/25(日) 16:21:37
A_1-A_2 A_3-B_1 A_4-C_1 A_5-D_1 A_6-B_2 A_7-C_2 A_8-D_2
A_9-B_3 A10-C_3 A11-D_3 A12-B_4 A13-C_4
B_5-B_6 B_7-B_8 B_9-B10 B11-B12 B13-C_5
D_4-C_6 C_7-D_6 C_8-D_7 C_9-D_8 C10-D_9 C11-D10 C12-D11 C13
ここまでで、25回。
場所の分かっているカードは、
A_1〜A13
B_1〜B13
C_1〜C13
D_1〜D_4,===,D_6〜D11,===,===
場所の分かっていないカードは、D_5,D12,D13
すでに出来ているペアはC13-*13の1組、残りは25組。25+25=50

しかし、同じ開く順番なら
(A_1)-(A_2) (A_3)-(B_1) (A_1-B_1) (A_4)-(C_1) (A_5)-(D_1) (C_1-D_1)
(A_6)-(B_2) (A_2-B_2) (A_7)-(C_2) (A_8)-(D_2) (C_2-D_2) (A_9)-(B_3) (A_3-B_3)
(A10)-(C_3) (A11)-(D_3) (C_3-D_3) (A12)-(B_4) (A_4-B_4) (A13)-(C_4)
(B_5-A_5) (B_6-A_6) (B_7-A_7) (B_8-A_8) (B_9-A_9) (B10-A10) (B11-A11)
(B12-A12) (B13-A13) C_5-(D_4) (C_4-D_4) (C_6)-(C_7) (D_6-C_6)
(C_8)-(D_7) (C_7-D_7) (C_9)-(D_8) (C_8-D_8) (C10)-(D_9) (C_9-D_9)
(C11)-(D10) (C10-D10) C12-(D11) (C11-D11) C13
ここまでで、42回とC13
場所の分かっていないカードは、D_5,D12,D13
まだペアにならなくて、場所の分かっているカードはC_5,C12,C13
残りは3組。42+3=45
190デフォルトの名無しさん:2010/04/25(日) 16:26:40
質問するスレ間違えたようなので引っ越します
191デフォルトの名無しさん:2010/04/25(日) 16:59:55
バイバーイ
192デフォルトの名無しさん:2010/04/25(日) 17:16:29
46回?

1234567890JQK11223344556677889900JJQQKK1234567890JQK

これを左から2枚ずつ引いていき、
覚えているのがあったら新しいのと覚えているのを引く。

12 34 56 78 90 JQ K1 11 12 22
23 33 34 44 45 55 56 66 67 77
78 88 89 99 90 00 0J JJ JQ QQ
QK KK K1 11 22 33 44 55 66 77
88 99 00 JJ QQ KK
193デフォルトの名無しさん:2010/04/25(日) 21:50:26
>>184
最低だと、1でいいんじゃないのか?
194デフォルトの名無しさん:2010/04/25(日) 21:55:38
バカがいるw
195デフォルトの名無しさん:2010/04/25(日) 22:40:43
>>194
いや、そのくらい軽くこなさないとマインドシーカーはクリアできないよ。
つーか終盤になると質問すら出来んレベル
196デフォルトの名無しさん:2010/04/25(日) 23:07:26
>>194
ん?1回目で当たったら1になるんじゃないのかい?
問題の不備だとは思うが。
197デフォルトの名無しさん:2010/04/26(月) 00:04:50
198デフォルトの名無しさん:2010/04/26(月) 01:04:46
>>130
仕事はやいですね
cpyすっごいならんでるよ
>>131
品質△ (悲
次はもっといい問題作ってきます

作者の自己解答上げておきます
http://codepad.org/c32vQo2w
199160:2010/04/26(月) 01:31:28
>>197
40回?
A23A4A5A6272829303J3Q4K44556566778788990900JJQJQQKKK

A2 3A AA 4A 5A AA 62 22 72 82
22 93 33 03 J3 33 Q4 K4 44 44
55 56 66 55 66 77 78 88 77 88
99 00 99 00 JJ QQ JJ QQ KK KK

(A)(2) (3)(A) (AA) (4)(A) (5)(A) (AA) (6)(2) (22) (7)(2)
(8)(2) (22) (9)(3) (33) (0)(3) (J)(3) (33) (Q)(4) (K)(4)
(44) ((4)4) ((5)5) (5)(6) (66) ((5)5) ((6)(6)) ((7)7) (7)(8)
(88) ((7)7) ((8)(8)) ((9)(9)) ((0)0) ((9)9) ((0)(0)) ((J)(J)) ((Q)Q)
((J)J) ((Q)(Q)) ((K)(K)) ((K)K)
200160:2010/04/26(月) 02:14:09
>>197
もとい!42回。
A23A4A5A6272829303J3Q4K44556566778788990900JJQJQQKKK

A2 3A AA 4A 5A AA 62 22 72 82
22 93 33 03 J3 33 Q4 44 K4 44
55 56 66 55 66 77 78 88 77 88
99 90 00 99 00 JJ JQ QQ JJ QQ
KK KK

(A)(2) (3)(A) (AA) (4)(A) (5)(A) (AA) (6)(2) (22) (7)(2) (8)(2) (22)
(9)(3) (33) (0)(3) (J)(3) (33) (Q)(4) (44) (K)(4) ((4)4) ((5)5) (5)(6) (66)
((5)5) ((6)(6)) ((7)7) (7)(8) (88) ((7)7) ((8)(8)) ((9)9) (9)(0) (00)
((9)9) ((0)(0)) ((J)J) (J)(Q) (QQ) ((J)J) ((Q)(Q)) ((K)K) ((K)(K))
201192:2010/04/26(月) 03:19:16
やっぱ46回になる。
ttp://codepad.org/sBOxHahJ

また、「カードの総数 - 数字の数 / マークの数」
みたいな式でもあらわせるかも。
202デフォルトの名無しさん:2010/04/26(月) 04:13:55
>>201
8手目に+A-Aで取らないという選択肢

+A+2 +3+4 +5+6 +7+8 +9+0 +J+Q +K-A *A+A -2*2 -3*3 #10手03組
-4*4 -5*5 -6*6 -7*7 -8*8 -9*9 -0*0 -J*J -Q*Q -K*K #20手13組
/A-A /2+2 /3+3 /4+4 /5+5 /6+6 /7+7 /8+8 /9+9 /0+0 #30手23組
/J+J /Q+Q /K+K
203192:2010/04/26(月) 07:42:45
>>202
それは、後に出てくるのが分かっている上での最善の手の気もする。
>>151に↓と書いてあるけど、この解釈の仕方により変わるので難しいが。
※但しコンピュータは最善の手を実行するものとする。
作者さんの答えきぼん。
204デフォルトの名無しさん:2010/04/26(月) 08:07:04
2回目のめくりである札の2枚目がわかったときに、
次の手でその2枚を取るのはどう考えても悪手。
205189:2010/04/26(月) 09:30:20
45.5 というか やっぱり 46回だ。
>>188なら>>204の作戦にも強い。ID無いのが残念。
206デフォルトの名無しさん:2010/04/26(月) 09:46:02
>>205
A01-A02 A03-B01 A04-C01 A05-D01 A06-B02 A07-C02 A08-D02 A09-B03 A10-C03 A11-D03
A12-B04 A13-C04 B05-B06 B07-B08 B09-B10 B11-B12 B13-C05
ここまで17手 0/26組
これで1-13が2組出ているんだから後は消していくだけじゃね?

C06-C13 がでたら A06-A13を取る
D04-D13 がでたら B04-B13を取る
ここまで35手 18/26組

記憶している残りのカードを取る
A01-05 & C01-05
B01-03 & D01-03
ここまで43手 26/26組
207デフォルトの名無しさん:2010/04/26(月) 09:53:03
>>189で言うと (A_4-B_4) これが悪手
208デフォルトの名無しさん:2010/04/26(月) 10:04:01
207は忘れてくれww
209デフォルトの名無しさん:2010/04/26(月) 10:10:00
悪手は悪手だよ。
C_4とD_4が2回目のめくりで出てるから回数には影響しないってだけで。
210デフォルトの名無しさん:2010/04/26(月) 10:58:00
もうトランプの話題はいいだろ。

最大値は計算するまでもないわけだから、
期待値とかどう?
211デフォルトの名無しさん:2010/04/26(月) 11:25:44
>>210 最大値は43だろ。
212デフォルトの名無しさん:2010/04/26(月) 14:57:10
She never eats NONI.
213192:2010/04/26(月) 17:46:05
>>204
分かったかも。
覚えるのに2ターン、取るのに1ターンの3ターンかかり無駄という感じか。
2枚目で覚えているのを取れば、覚えるのに1ターン、取るのに1ターンにできる。
厳密には、覚えたのが1枚残るから、3-1=2、2-0.5=1.5ターンという感じか。
214デフォルトの名無しさん:2010/04/26(月) 18:12:45
>>189
開いてないC13を分かってるカードに分類しちゃだめだろw
215100:2010/04/26(月) 18:33:16
アク禁その他で遅くなりました。
私の作った関数はこんな感じ。
--
using namespace std;
typedef complex<double> coordinate;
static vector<coordinate> func(coordinate const pa, coordinate const pb, double lac, double lbc)
{
double lab = abs(pb - pa);
double s = (lac + lbc + lab) / 2;
double s2abc = s * (s - lac) * (s - lbc) * (s - lab);
vector<coordinate> rtn;
if (s2abc < 0) return rtn;
double lcd = sqrt(s2abc) / lab * 2;
double lad = sqrt(lac * lac - lcd * lcd);
double lbd = sqrt(lbc * lbc - lcd * lcd);
double k = (lbd > lab ? -lad / (lbd - lad) :
lad > lab ? lad / (lad - lbd) :
lad / (lad + lbd));
coordinate pd = pa + k * (pb - pa);
if (lcd > 0) {
rtn.push_back(coordinate(pd.real() - lcd / lab * (pb.imag() - pa.imag()),
pd.imag() + lcd / lab * (pb.real() - pa.real())));
}
rtn.push_back(coordinate(pd.real() + lcd / lab * (pb.imag() - pa.imag()),
pd.imag() - lcd / lab * (pb.real() - pa.real())));
return rtn;
}
--
考え方はヘロンの公式で面積を求めてからCからの垂線を延ばすという意味で>124とほぼ同じ。>120もそうかな。
後は水平だろうとそうでなかろうと、垂線の足の位置はLadとLbdの比で決まる。どっち側かは兎も角。
最後に足から両側に垂線を延ばせば両方の点Cが求まる。
# 一点しかないとき(=面積が0)のときはもっとLcdを求める必要もないんだけど、そこは横着w
216デフォルトの名無しさん:2010/04/26(月) 18:43:33
円の方程式を二つつくる
引く
ax + by = cができる
円の方程式の片方に代入して解の公式を使う
解がある場合にax + by = cに代入すれば座標が求まる
217デフォルトの名無しさん:2010/04/26(月) 23:48:45
>>198
なるほど、printfに%.8sなんて使い方あったのですか。目から鱗。
218デフォルトの名無しさん:2010/04/27(火) 02:28:28
>>184
面白い。
最初はバラバラに予想して何色存在するかを見るのがいいのかな。
219デフォルトの名無しさん:2010/04/29(木) 09:21:04
>>184
たぶん4回。
1回目は0123の一手。
それでHit0、Blow3の時が一番難しいと思うが、
2回目は0122とかと1箇所を変えて入れ、
H0B2、H0B3、H1B1、H1B2のどれになるかで予想を変える。

2回目の結果で一番難しいのは、多分H0B2とBlowが減ってしまうやつ。
それでも、色の種類が3、2は1つ以下、3は1つ以上という事から、
答えを15種類ぐらいにしぼれる。
3回目はその15種類のうちのひとつの3200とかにすると、
その結果によって、4回目になりうる入力は1つに絞られるはず。

ただ、これはプログラムの問題というより、数学の問題だな。
ランダムで生成された問題を100回解いて、
平均回数を少なくするプログラムを作れとかの方が面白いかも。
220デフォルトの名無しさん:2010/04/29(木) 11:32:36
正しく(もっとも効率よく)質問をするプログラムを作るのも難しくて面白いと思われ
221デフォルトの名無しさん:2010/05/01(土) 03:15:57
>>203 も言っているように、後で出てくるカードが分かっていなかったら。
12 31 41 51 62 72 82 93 03 J3
Q4 K4 55 66 77 88 99 00 JJ QQ
KK 54 67 66 87 98 09 J0 QJ K5
QQ KK 11 22 33 44 11 22 33 44
55 77 88 99 00 JJ

46回
222デフォルトの名無しさん:2010/05/01(土) 06:22:15
>>221
なんで13〜21手の所でペア取っちゃうんだ?
223デフォルトの名無しさん:2010/05/01(土) 06:24:43
そうじゃないと手数が増えるからだろw
224デフォルトの名無しさん:2010/05/01(土) 06:34:35
残しておいて3枚目引いたときに取った方が手数減ると思うが
225デフォルトの名無しさん:2010/05/01(土) 06:37:06
2枚目をめくった時に3枚目を引いたら、4枚目が出るまでスルーな
226デフォルトの名無しさん:2010/05/01(土) 06:39:47
3枚目、4枚目がめくりの2枚目に出る可能性がある以上、
一回目のめくりで2枚目が出たら次に1枚目をめくるのが正しい。
227デフォルトの名無しさん:2010/05/01(土) 06:42:23
>>226
13種類の絵柄で、めくりの2枚目で3枚目4枚目を出せるのは何種類だ?
228デフォルトの名無しさん:2010/05/01(土) 06:46:20
何種類とか関係意味わかんねーよw
だいたい、とっておいてもその場でめくるよりめくる回数増える可能性こそあれ、
減る可能性は全くないのにw
229デフォルトの名無しさん:2010/05/01(土) 06:49:11
>>228
じゃあ言い方を変えるわ。
>>224-225の取り方で最大何手になるよ
230デフォルトの名無しさん:2010/05/01(土) 06:51:17
残した方が手数が減るって主張してるのはお前だろ?
46手より小さい手をお前が示さなきゃだめだろw
231デフォルトの名無しさん:2010/05/01(土) 06:59:47
232デフォルトの名無しさん:2010/05/01(土) 07:16:16
そういう並びに強いってだけだしなあ。
>>224-225
1 2 1 2 3 2 3 2 4 3 4 3 5 4 5 4 6 5 6 5 7 6 7 6 8 7 8 7 9 8 9 8 10 9 10 9 11 10 11 10 12 11 12 11 13 12 13 12 1 1 13 13
これやってみろよ
233デフォルトの名無しさん:2010/05/01(土) 07:30:51
50手か
234デフォルトの名無しさん:2010/05/01(土) 07:33:58
結局並びかたによって2枚目の時点でとるか、3枚目まで待つかどっちがいいか
一概には言えないってことか。
235デフォルトの名無しさん:2010/05/01(土) 10:54:01
>>234
3枚目まで待った方がいい。そしてそれは>>174が既に指摘してる。

待っても待たなくても同じか、待った方が手数減るかのどっちかで
待たない方が手数減るパターンは有り得ないのだから、待った方がいい。

引いた時点で、待っても得しないと分かりきっている場合は引いてしまってもいいが、別に引くメリットはない。
236デフォルトの名無しさん:2010/05/01(土) 11:18:12
>>235
お前はちょっと前の>>232すら見えないのか?
237デフォルトの名無しさん:2010/05/01(土) 11:36:01
>>236
一概には言えないなんてとぼけたこと抜かしてるから、
常にとらなければいいと言ってるだけ。
238デフォルトの名無しさん:2010/05/01(土) 11:40:07
A01 A02 B01 B02 A03 C02 B03 D02 A04 C03 B04 D03 A05
C04 B05 D04 A06 C05 B06 D05 A07 C06 B07 D06 A08 C07
B08 D07 A09 C08 B09 D08 A10 C09 B10 D09 A11 C10 B11
D10 A12 C11 B12 D11 A13 C12 B13 D12 C01 D01 C13 D13

同じ数字が3回目に出てから取る場合。
(A01)-A02 (B01)-B02 A03-C02 B03-D02 A04-C03 B04-D03 A05-C04 B05-D04 A06-C05 B06-D05
A07-C06 B07-D06 A08-C07 B08-D07 A09-C08 B09-D08 A10-C09 B10-D09 A11-C10 B11-D10
A12-C11 B12-D11 (A13)-C12 (B13)-D12 C01-A01 D01-B01 C13-A13 D13-B13
ここまでで28回
すでに取れたのは4ペア、残り22ペアなので、22回。28+22=50

同じ数字が2回目に出てから取る場合。
(A01)-(A02) (B01-A01) (B02-A02) (A03)-(C02) (B03-A03) (D02-C02) (A04)-(C03) (B04-A04) (D03-C03) (A05)-(C04)
(B05-A05) (D04-C04) (A06)-(C05) (B06-A06) (D05-C05) (A07)-(C06) (B07-A07) (D06-C06) (A08)-(C07) (B08-A08)
(D07-C07) (A09)-(C08) (B09-A09) (D08-C08) (A10)-(C09) (B10-A10) (D09-C09) (A11)-(C10) (B11-A11) (D10-C10)
(A12)-(C11) (B12-A12) (D11-C11) (A13)-(C12) (B13-A13) (D12-C12) (C01-D01) (C13-D13)
38回
239デフォルトの名無しさん:2010/05/01(土) 11:44:13
はぁ?
>>232は3枚目まで待った場合に2枚目で取る場合より手数が増えるパターンなんだけど?
240238:2010/05/01(土) 11:47:35
同意
241デフォルトの名無しさん:2010/05/01(土) 11:49:47
わかってると思うけど>>239>>235=>>237へのレスね
242デフォルトの名無しさん:2010/05/01(土) 11:56:36
>>188の並びなら2枚目が一回目にめくられても3枚目以降に取っておいた方が、
その場で1・2枚目を取るよりも手数が少なくなる。
>>232の並びなら2枚目が一回目にめくられたら2回目で1枚目をめくって取ったほうが、
3枚目以降に取っておくより手数が少なくなる。

片方のやり方がもう一方のやり方より絶対少ないとはいいきれないので、
一概には言えないってのは正しい。
243デフォルトの名無しさん:2010/05/01(土) 15:12:27
>>239
3枚目まで待つってどういう場合想定してる?

(1 2), (3 1)と引いたときに次に(1 1)を引くのは無駄だと言ってるだけで、
(1 2)の後に1引いたのに3枚目の1出るまで待てなんて気違いはいないぞ。
244デフォルトの名無しさん:2010/05/01(土) 15:23:48
>>243
>>224-225はお前が言う気違いのやり方のことだし、
そのパターンで手数が減るのが>>188の並びなんだよw

理解してないならしゃしゃり出てくんなよ
245デフォルトの名無しさん:2010/05/01(土) 15:53:22
def func(cards){
unknown = cards # まだ引いてない未知のカード
known = [] # 引いたので既知だがまだとってないカード
i = 1
while(unknown, knownがともになくなる){
if(unknownがまだある){
card1 = unknownから1枚引く
if(card1 と同じ数がknownにある){
card2 = knownからcard1と同じ数を取り出す
print '%2d: (%2d* %2d)' % (i, card1, card2)
}
else{
card2 = unknownから1枚引く
if(card1 != card2){
knownにcard1を追加
knownにcard2を追加
}
print '%2d: (%2d* %2d*)' % (i, card1, card2)
}
else{ # unknownがもうない
card1 = knownから1枚取り出す
card2 = knownからcard1と同じ数を取り出す
print '%2d: (%2d %2d)' % (i, card1, card2)
}
i += 1
}
}
C/C++コードじゃなく擬似コードだが、カード引く順番はこれよりも効率よくやる方法ある?
246デフォルトの名無しさん:2010/05/01(土) 16:00:57
>>244
すまない。そんなバカがいることに気づかず>>174を出してしまった。
>>188のカードが3枚足りないことに気づかなかった君と同じくらいドジで申し訳ない。
247デフォルトの名無しさん:2010/05/01(土) 16:03:42
上手く揚げ足とったつもりだろうけど、3枚どう追加してもかわんねーんだよw
248デフォルトの名無しさん:2010/05/01(土) 16:09:25
ていうか、あんまり真面目によんでなかったけど、ほんとに>>224-225はそうやりたかったの?
読み直したら

225 名前:デフォルトの名無しさん [sage]: 2010/05/01(土) 06:37:06
2枚目をめくった時に3枚目を引いたら、4枚目が出るまでスルーな

での2枚目は、めくりの2枚目だから>>225は分かってるように思えるんだが。
めくりの1枚目とめくりの2枚目の区別をつけて、めくりの2枚目で引いたときに引き直さなくていいと言ってるなら
>>174やら>>235, >>237と同じ意見。
249デフォルトの名無しさん:2010/05/01(土) 16:13:42
読んでないなら口出すなよ、頼むから。
>>222読めば>>224-225の意味はわかるだろ。
一々バカに説明する身にもなってくれ。
250デフォルトの名無しさん:2010/05/01(土) 16:15:33
>>247
じゃあ、3枚追加したら何回になる?
>>188のカードに足りない5 12 13を追加して
君の方法で
1 2 3 1 4 1 5 1 6 2 7 2 8 2 9 3 10 3 11 3 12 4 13 4 5 6 7 8 9 10 11 12 13 5 4 6 7 6 8 7 9 8 10 9 11 10 12 11 13 5 12 13
を、46回よりも少なくできたのなら、俺が間違いだったことになる。
251デフォルトの名無しさん:2010/05/01(土) 16:22:39
252デフォルトの名無しさん:2010/05/01(土) 16:26:20
>>249
>>222は読みようがない。それまで話の流れ的に使われていた
A23A4A5A6272829303J3Q4K44556566778788990900JJQJQQKKK
を使っていたとすれば、Q4 K4の後に5はこない。
253デフォルトの名無しさん:2010/05/01(土) 16:34:02
(1 2) (3 1) (4 1) (5 1) [1 1] [1 1] (6 2) (7 2) (8 2) [2 2]
[2 2] (9 3) (10 3) (11 3) [3 3] [3 3] (12 4) (13 4) (5 6) (7 8)
(9 10) (11 12) (13 5) (4 4] [4 4] (6 6] (7 7] (6 6] (8 8] (7 7]
(9 9] (8 8] (10 10] (9 9] (11 11] (10 10] (12 12] (11 11] (13 13] (5 5]
(12 12] (13 13] [5 5]

>>252
これだから読解力のないバカは困る。
>>221の13〜21手目は一回目にめくったときに一枚位置がわかってるものを取ってる。
それに対して否定してるんだから>>222=>>224-225の意図が>>174とかと別なのは明白。
254デフォルトの名無しさん:2010/05/01(土) 17:28:05
>>253
うむ。俺の負けだな。ごめんよ。
255デフォルトの名無しさん:2010/05/01(土) 18:05:01
なーんだ、前もって並びを知らない前提だと、常に最短の手を返すアルゴリズムは存在しないんだ。

KKKKQQQQJJJJ00009999888877776666555544443322 12 113312
KKKKQQQQJJJJ00009999888877776666555544443322 12 121133
この2つは残りの6枚までは、前から順にとりつづける他にない。

残り8枚のところから考えると
1 2 1 1 3 3 1 2
(1 2) (1 1] (1 3) (3 3] (1 1] (2 2] ←負けた人の戦略
(1 2) (1 1) (3 3) (1 1] (2 2] ←勝った人の戦略

1 2 1 2 1 1 3 3
(1 2) (1 1] (2 2] (1 1) (3 3) ←負けた人の戦略
(1 2) (1 2) [2 2] (1 1) [1 1] (3 3) ←勝った人の戦略

(1 2)の後の1引いた時点で残りの並び順をエスパーしないと、最短手は得られない。
256デフォルトの名無しさん:2010/05/01(土) 18:10:56
探しているのは常に最短ではなく、(自分にとって)最悪なカードを引き続けた場合の最短…だよね?
257デフォルトの名無しさん:2010/05/01(土) 19:29:32
>>256
そうなのだが、個人的にはなんだかつまらない。
258デフォルトの名無しさん:2010/05/01(土) 20:19:00
初期配置は13*13*13*13*12*12*12*12* ... *2*2*2*2パターンか?
それを全部解かせるのは無理なので、
100回とかをシャッフルしたのを解いて、
平均手数の少なさを勝負?するとかは。
259デフォルトの名無しさん:2010/05/01(土) 20:31:17
}else{ # unknownがもうない
4*4*4*4*3*3*3*3*2*2*2*2*1*1*1*1=331,776
unknownがもうないフラグを追加すれば動くと思う。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10578.c
260デフォルトの名無しさん:2010/05/02(日) 15:59:01
>>151
シャッフルしたのを解き続けてみると43回っぽい。
1引き目からすぐにそろっているのを引くと46回が最大になる。

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10584.txt
261デフォルトの名無しさん:2010/05/02(日) 17:59:26
>>188 の並びでやると、最大値が変わる
static int Num[]={0,1,2,0,3,0,4,0,5,1,6,1,7,1,8,2,9,2,10,2,11,3,12,3,4,5,6,7,8,9,10,11,12,4,3,5,6,5,7,6,8,7,9,8,10,9,11,10,12,4,11,12};
static int Mark[]={0,0,0,1,0,2,0,3,0,1,0,2,0,3,0,1,0,2,0,3,0,1,0,2,1,1,1,1,1,1,1,1,1,2,3,2,2,3,2,3,2,3,2,3,2,3,2,3,2,3,3,3};

r = Mark[c] * NUM_SUU + Num[c];
/* r = rand() % CARD_SUU;

if(make[r])
continue;
*/
[46回 平均46.00回 最大46回] (1枚目からそろいを取らない)
[46回 平均46.00回 最大46回] (1枚目からそろいを取る)
262sage:2010/05/02(日) 22:09:28
>>261
ほんとそうなるね。
いくつかの数値の1つ目を1手目、2つ目以降を2手目で取らせて
4つを取れる事なく覚えてしまい、
1つ目に覚えているのを取らせているのか。(+→-とゲットしているターン)

だとやはり正解は46回なのかな。
それかアルゴリズムで工夫する余地があるのか。
263デフォルトの名無しさん:2010/05/02(日) 23:40:09
46回より小さい回数(43回)で>>188の並びを解く手順が>>253にあるけど、
それをアルゴリズムとして定式化したときに、他のも46回未満で解けるかどうか。

試してみたところ、>>188は43回で出来たが他のは下手すりゃ50回越えたりした。
もっとアルゴリズムを改善すればできるのかもしれないが、できないかもしれない。

この問題を解くアプローチとしては、次のどちらか
・どんな札でも46回よりも少なく解ける取り方のアルゴリズムを開発してみる
・プレイヤーと、いじわるな運命の神様の2人プレイのゲームとみなして、
  プレイヤーの行動に対し、常に最悪なカードを返しつづける神様のアルゴリズムを開発する
  (最初から札を固定で与えるのじゃなくて、プレイヤーの行動によって次に出すカードを選ぶ)
になると思う。
264デフォルトの名無しさん:2010/05/03(月) 01:07:35
>>263
>>253の技がよく分からん・・
そのアプローチは両方面白いな、試して見る。
265デフォルトの名無しさん:2010/05/03(月) 08:43:31
問題、ドラクエのまんたんを実装せよ。
MP、回復量はホイミ2:20、ベホイミ5:75、ベホマ8:全快、ベホマラー15:75(全体)。
回復量に誤差はなし(難しくなるので)。
MPぱパーティー共通の物とし、少ないMPで全快させる。
表示のさせ方などは自由。

キャラの能力例
勇者/300 戦士/350 僧侶/250 魔法使い/200 (←キャラの名前、最大HP)
(↓現在HP)
1、250 350 210 200
2、210 350 150 200
3、250 300 200 150
4、280 300 050 150

次の問題は>>280
266デフォルトの名無しさん:2010/05/03(月) 08:53:21
ナップサック問題?
267デフォルトの名無しさん:2010/05/03(月) 09:35:14
ベホマラーを使うかどうかを最初に判断。
後は個別に一番MP消費の少ない魔法を選ぶ。
268デフォルトの名無しさん:2010/05/03(月) 10:30:09
ベホマラーを2回の使ったほうがいい場合は?
269デフォルトの名無しさん:2010/05/03(月) 10:42:54
まず、ベホマラーなしでの最小MP消費を考える。
次に、ベホマラー1回での最小MP消費を考える。
次に、ベホマラー2回での最小MP消費を考える。
この中で最小のものを答えとする。

なお、ベホマラー3回以上はありえない(ベホマ*4の方が少なくなるから)
270デフォルトの名無しさん:2010/05/03(月) 10:46:06
ベホマラー1回のときのMPがベホマラーなしのときのMPより多くて
ベホマラー2回がベホマラーなしよりMPすくなくなる場合なんてあんの?
271268:2010/05/03(月) 11:32:43
>>270 (↓現在HP)
150 200 100  50
272デフォルトの名無しさん:2010/05/03(月) 20:57:29
>>265
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10585.cpp
使い勝手の悪いところがあります。直せる方は教えてください。
273デフォルトの名無しさん:2010/05/04(火) 01:19:30
>>272
問題は正解!
ベホマラー3回は無い事や、ベホマよりベホイミ+ホイミ
の方がMPが少ない事も考慮されててgood。

使いにくくはなかったけど、HP入力ボックスの右か下に
/300とかと最大HPを表示するといいかも。

後、結果がメインウィンドウとMsgBox両方に表示されるが、
メインウィンドウの方は表示が途中できれてしまう。
274272:2010/05/04(火) 14:39:51
(修正しました)タブキーで移動したいのですが、やり方をご存知の方居ませんか?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10586.c
275デフォルトの名無しさん:2010/05/04(火) 21:17:15
    以下 loopyなループ

    === 開始 ===

276デフォルトの名無しさん:2010/05/05(水) 03:20:55
She never eats NONI.
277デフォルトの名無しさん:2010/05/05(水) 07:52:30
loopy goopy
278 ◆5yaOF3KA5w :2010/05/05(水) 17:45:05
うむ
279デフォルトの名無しさん:2010/05/06(木) 04:04:32
五月病の季節
280デフォルトの名無しさん:2010/05/06(木) 10:43:13
亀だが>>1やってみた
【C言語歴】 2年
【レベル】 ゲーム製作やってるぐらい
【コンセプト】 慣れた方法で。
#include <iostream>
#include <vector>
const static int NUM_SIZE = 5;
void main()
{
std::vector<int> intContiner;
int temp = 0;
int sum = 0;

std::cout << "5つ数を入力して下さい。" << std::endl;
for( int i = 0 ; i < NUM_SIZE ; ++i )
{
std::cout << i + 1 << "番目入力" << std::endl;
std::cin >> temp;
intContiner.push_back( temp );
}

std::cout << "5つ数の合計" << std::endl;
std::vector<int>::iterator itr = intContiner.begin();
for( ; itr != intContiner.end() ; ++itr )
{
sum += (*itr);
}
std::cout << sum << std::endl;

std::cout << "5つ数の平均" << std::endl;
std::cout << sum / NUM_SIZE << std::endl;
}
281デフォルトの名無しさん:2010/05/06(木) 12:44:44
>>280
tempは入力ループでしか使わないのだから、関数の先頭で宣言するのはバグの元。
sumは計算ループ以降でしか使わないのだから、関数の先頭で宣言するより直前で宣言した方が見通しがいい。
C流でやると言うのなら別に止めはしないが、iの宣言だけはポリシーに反することになるので美しくない。
あと、void main()よりもint main()の方が一般的だ。

↓以下main()の戻り値の型についてのいつもの議論w
282デフォルトの名無しさん:2010/05/06(木) 12:48:54
>>281
イテレータの宣言位置が変態なのは指摘漏れ?w

処で、>280は切り捨てられた平均値なんだね。小数点以下一桁まで欲しくね?
283デフォルトの名無しさん:2010/05/07(金) 22:53:42
なんで const static int で宣言するんだ?
メモリ無駄だろ。

しかも表示のところは 5 決め打ちだし。
284デフォルトの名無しさん:2010/05/08(土) 01:06:15
> メモリ無駄だろ。
アホか?
285デフォルトの名無しさん:2010/05/08(土) 02:29:33
>>283
知らないなら書かなくていいんだよ。
286デフォルトの名無しさん:2010/05/08(土) 16:45:35
>>283
流石にワロタ
287デフォルトの名無しさん:2010/05/08(土) 21:53:40
>>283の人気に嫉妬
というかどうみても釣り
288デフォルトの名無しさん:2010/05/11(火) 06:01:52
>>274
ここのでできるかも。
ttp://www.sm.rim.or.jp/~shishido/wsclass.html
289デフォルトの名無しさん:2010/05/13(木) 21:04:22
>>283の前半はアレだけど、後半は同意する。
290デフォルトの名無しさん:2010/05/13(木) 21:23:42
なんでお前ら揃って悪意に解釈してんだ?
俺は>>283じゃないけどさ
すぐ揚げ足とって茶化すのだけは得意だな
もうちょっと意味、意図を汲み取る努力しろよ
お前らみたいなのと仕事したくないな正直
291デフォルトの名無しさん:2010/05/13(木) 21:25:52
私女だけどコンソールのちょっとしたプログラムなのに
「メモリが無駄(キリッ」とか言ってる男の人って恥ずかしいと思う。

いつの時代のPC使ってるんだろ?きもーい
292デフォルトの名無しさん:2010/05/13(木) 22:28:22
お前みたいなのがこうやって死んで会社や社会に迷惑掛けるんだよ
http://tsushima.2ch.net/test/read.cgi/newsplus/1273411891/
http://tsushima.2ch.net/test/read.cgi/newsplus/1273746605/
293デフォルトの名無しさん:2010/05/14(金) 01:17:43
>>290
悪意に解釈もなにも、メモリ無駄にならないのになるって書いてあるんだもん。
294デフォルトの名無しさん:2010/05/14(金) 02:42:33
>>291
あんたの方がよっぽどきもい。
295デフォルトの名無しさん:2010/05/14(金) 09:25:57
拙者の彼女をプログラムしてくれでござる
296デフォルトの名無しさん:2010/05/15(土) 11:26:35
> iの宣言だけはポリシーに反することになるので美しくない。
どゆこと?
297デフォルトの名無しさん:2010/05/15(土) 12:57:01
>>296
また古いものをw

>280では、以下の例外を除く変数は全て関数の先頭で宣言している。
但し、ループ制御のiだけはC99やC++でしか通用しない宣言を使っている。
また、>282でも指摘されているが、イタレータもブロックの途中で宣言している。
こういうのをポリシーがないというのだろ。
298デフォルトの名無しさん:2010/05/18(火) 21:33:58
うちも今更>>2をやってみる

【C++言語歴】約10年。
【レベル】いわゆるサンデープログラマ。主にフリーソフト制作等。
【コンセプト】 シンプルに。
【コメント】STLコンテナは簡潔に表記する為にある。本題でvector使うのは逆効果。

#include <iostream>
#include <iterator>

int main()
{
using namespace std;
const int numberOfNumbers = 5;
// 入力
cout << "数字を" << numberOfNumbers << "個入力" << endl;
istream_iterator<double> it(cin);
double sum = *it;
for (int i = 1; i < numberOfNumbers; ++i) sum += *++it;
double average = sum / numberOfNumbers;
// 出力
cout << "合計: " << sum << endl;
cout << "平均: " << average << endl;
// 終わり
return 0;
}
299デフォルトの名無しさん:2010/05/18(火) 21:36:56
【問題2:ワード覆面算】
入力された任意の8文字以内の単語2つからワード覆面算を作成せよ
入力された単語に含まれない文字は適当な記号を用いて表示すること
ただしそれぞれの覆面算は単一の解を持つものとし"浮き"は認めない

【難易度】
80分で中級

【入力例】
バナナ
バナナ

【出力例】
バナナ+バナナ=ナナ◎ [ 499+499=998 ]
バナナ+バナナ=○ナナナ [ 500+500=1000 ]
バナナ+バナナ=△△バ◇ [ 577+577=1154 ]
バナナ+バナナ=△△ナ◎ [ 599+599=1198 ]
バナナ+バナナ=ナ△△△ [ 611+611=1222 ]
バナナ+バナナ=△▽※バ [ 688+688=1376 ]
バナナ+バナナ=△ナ△○ [ 755+755=1510 ]
バナナ+バナナ=△☆バ※ [ 788+788=1576 ]
バナナ+バナナ=△ナ☆◇ [ 877+877=1754 ]
バナナ+バナナ=△◎ナバ [ 899+899=1798 ]
バナナ+バナナ=△バ△○ [ 955+955=1910 ]

【補足】
上記はWikipediaの例"バナナ+バナナ=シナモン"に合わせただけであり
入力される単語2つが同じとは限らない
300デフォルトの名無しさん:2010/05/18(火) 21:42:41
かなりの良スレの予感がするけど自分にはついてけないぜ・・・
301298:2010/05/18(火) 22:01:47
覆面算を解く問題はたまに見かけるのでちょっとひねって作成のほうにしてみました。
前回の出題よりは品質あげたつもりなんですがどうでしょう。
80分は作者が実際に解くのにかかった時間が基準なので異論は認めません。
302デフォルトの名無しさん:2010/05/21(金) 03:07:45
using namespace std;

ヒェー。
303デフォルトの名無しさん:2010/05/21(金) 05:47:06
>>302
それを使うことの弊害を知りつつ使ってるのなら、無駄に恐れることはない。

おまじないのように付けてるのならタダのバカだけど、
おまじないのように避けてる人とそう変わらんよ。
304デフォルトの名無しさん:2010/05/21(金) 12:43:18
>>302
標準ライブラリ以外のライブラリは使っていないのだから
故意にcoutという変数を定義するようなことをしない限り名前は衝突しない
#include <iostream>してるんだから構文解析はそこで終わっていて
std名前空間にcoutの定義を探しにいっても追加のコストはほどんどない
と考えて記述が短くなる方を選んでるんだけど何か問題ありますか
305デフォルトの名無しさん:2010/05/21(金) 13:16:46
nothing
306デフォルトの名無しさん:2010/05/21(金) 15:38:45
おまじないのように付けてるタダの馬鹿ですんません・・・
307デフォルトの名無しさん:2010/05/22(土) 15:39:29
>>299
バナナ+バナナ

099+099=198(○ナ○)
100+100=200(○ナナ)

とかは不成立?
308デフォルトの名無しさん:2010/05/22(土) 22:55:51
>>307 不成立です

バナナ+バナナ=○ナ○ [099+099=198]
覆面算は同じ文字のところには同じ数字を入れるルールなので
バナナ+バナナ=○ナ△のように記号を変えなければなりません

また数字の先頭が0ではないというのは暗黙の了解になっていて
こういった場合"バ"が0ではないことを利用して解くのが
普通なので099という表記もできません

バナナ+バナナ=○ナナ [100+100=200] については他にも
200+200=400、300+300=600、400+400=800と回答が複数あるので
パズルとして成立しません

Wikipediaに解説があります
http://ja.wikipedia.org/wiki/%E8%A6%86%E9%9D%A2%E7%AE%97
309デフォルトの名無しさん:2010/05/23(日) 00:27:34
そういや、ここってスレタイにはC,C++って入ってるけど、限定する意味あんのか?
310307:2010/05/23(日) 03:14:31
>>308
サンクス、了解した。
311デフォルトの名無しさん:2010/05/25(火) 04:36:49
お題 (次>>350)
16進テキストをファイル・コマンド・またはgetsから入力して、
バイナリーに変換し、test.txtファイルに落とす。
312デフォルトの名無しさん:2010/05/25(火) 05:46:32
%81%AB0%E3%81 とかも。
81 AB 30 E3 81
313デフォルトの名無しさん:2010/05/25(火) 19:41:39
お題: >>311,312に示す文章にはいくつかの誤りがあります。正しい日本語へ修正しなさい。
314デフォルトの名無しさん:2010/05/26(水) 09:39:13
gets()を使えだなんてろくでもない問題、直すほどの価値もない。
315デフォルトの名無しさん:2010/05/26(水) 10:03:55
>>314
使わせといてあとでこれこれこういう理由があるから使うな、と言った方が
何でか教えないけどとにかく使うな、よりは覚えると思う
316デフォルトの名無しさん:2010/05/26(水) 10:21:26
>>315
そういうのは初心者スレでやれ。
317デフォルトの名無しさん:2010/05/26(水) 11:19:19
それは>>314に言ってくれ
318デフォルトの名無しさん:2010/05/26(水) 11:29:50
ちょっと待ってくれ。
とどのつまりは>311の説明が下手なことが原因じゃないか。
ここは一つ、>311がお題を提示し直すまで静観しようじゃないか。
319デフォルトの名無しさん:2010/05/26(水) 15:08:20
例えば、gets()で1行入力
http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E6%A4%9C%E7%B4%A2?search=%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A22010
標準出力には、
E7 89 B9 E5 88 A5 E6 A4 9C E7 B4 A2 E3 82 A6 E3 82 A3 E3 82 AD E3 83 9A E3 83 87
E3 82 A3 E3 82 A2
ファイルには 文字コードUTF-8で、
http://ja.wikipedia.org/wiki/特別検索?search=ウィキペディア2010
320デフォルトの名無しさん:2010/05/26(水) 22:57:18
>>319
何が言いたいんだよ。リンク間違ってるし。
あなたが311でgets()の使い方教えてあげてるつもりなら芯でくれ。
gets()は学校では習うかもしれないけど安全じゃないから誰も使わないの。
そもそもファイルからの入力にはgets()使えないでしょ。(本当は使えるけど。)
もしファイルからの入力はどの関数を使ってもいいのに
標準入力にはgets()を使わなければいけないという意味なら問題がおかしい。

311は出力ファイルは指定しているのに入力ファイルは指定していなかったり
バイナリーファイルの拡張子がtxtだったり
なぜか"%AB0"とか三桁の数字がでてきたり意味不明な上に
16進テキスト(16進数のこと?)とかコマンド(コマンドラインのこと?)とか
単語も日本語の文法もめちゃくちゃなんだからウダウダいってないで直せよ。
321デフォルトの名無しさん:2010/05/27(木) 00:02:13
お題を出す立場じゃなくて、課題を出された方なんだろうな。
322デフォルトの名無しさん:2010/05/27(木) 00:03:04
問題;scanf()で入力して、バイナリー変換し、ファイルに書き出してください。
%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%8Ctxt%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%8A%20
323デフォルトの名無しさん:2010/05/27(木) 00:13:10
>>322 嫌です。
324デフォルトの名無しさん:2010/05/27(木) 00:22:31
URLデコーダー
325デフォルトの名無しさん:2010/05/27(木) 00:25:12
あきらかに宿題だろ。
326デフォルトの名無しさん:2010/05/27(木) 03:05:10
ていうか、>>311には文字コード指定されてないんだから、空読みしてオレオレコードで書き出せばいいんじゃないの?

#define ENOUGH_LONG_LENGTH 3
int main(void)
{
char buf[ENOUGH_LONG_LENGTH];
FILE *fp;
int miyazaki = 0xdeadbeef;

gets(buf);
fp = fopen("test.txt", "wb");
fwrite(&miyazaki, sizeof(int), 1);
fclose(fp);
return 0;
}
327デフォルトの名無しさん:2010/05/27(木) 03:26:17
>>326
ところが>>322でURLエンコードのデコードをバイナリー変換と呼んでるらしいことが
判明しているのでそれでは正解にならない
つか宮崎って何w
328デフォルトの名無しさん:2010/05/27(木) 04:01:43
>>327
deadbeef…(´;ω;`)ブワッ
329デフォルトの名無しさん:2010/05/27(木) 08:08:54
>>320
>バイナリーファイルの拡張子がtxtだったり
ftpでbinary modeで*.txtを転送するなんて当たり前のことだろ。
330319:2010/05/27(木) 08:19:39
>>326
16進数のASCII文字列を読み込んで、その内容をバイナリーでファイルに出力だ。
gets()して、それは捨てるって書いて無いよ。
デフォルトで使うだろうと予想してたけど。
331デフォルトの名無しさん:2010/05/27(木) 08:43:08
>>319
だからきちんと問題書けよ。つーか、課題丸投げなんだろ。宿題スレに逝けよ。
332デフォルトの名無しさん:2010/05/27(木) 23:13:26
>>330
問題文を短くしてgets()を使わなければ突っ込まれないと短絡的に考えたのだろうが
あいにくURLエンコーディングには英数字の平文が混ざるので16進数ではないし
実装を比べるスレの趣旨からしてscanf()を指定する必然性も全くないし
URLデコードは文字列から文字列への変換なんだからバイナリーとか発してる時点で馬科決定。
関数の使い方もコンピュータ用語も理解してないレベルで出題するなよ。


333デフォルトの名無しさん:2010/05/28(金) 00:32:43
#include <stdio.h>
#define ENOUGH_LONG_LENGTH 24
int main(void)
{
  char buf[ENOUGH_LONG_LENGTH];
  FILE *fp;
  int miyazaki = 0xefBeadDe;

  strcpy(buf, "ef Be ad De");
  fp = fopen("test.txt", "wb");
  fwrite(&miyazaki, sizeof(int), 1, fp);
  fclose(fp);
  return 0;
}
334デフォルトの名無しさん:2010/05/30(日) 10:54:03
お題 (次>>350) 文字コードに関係の無いURLデコード
%と16進文字2桁を標準入力(コマンド引数、ファイル以外)から入力して、
バイナリーに変換し、test.txtファイルに落とす。
%の後に2桁の16進文字が続かない場合は、変換しないでそのまま出力する。
例:
%Y %0X ⇒ 出力無し
%Y0 ⇒ '0'出力
%00 ⇒ '\0'出力
%Aa01 ⇒ '\xaa' '0' '1'出力
335デフォルトの名無しさん:2010/06/05(土) 09:13:37
>>281 日本語でオス
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
const int NUM_SIZE = 5;
int main()
{
  int i, temp = 0, sum = 0;
  vector<int> intContiner;

  cout << "5つ数を入力して下さい。" << endl;
  for( i = 0 ; i < NUM_SIZE ; ++i ) {
  // 上のfor文内でiを宣言するなら、sumやtempも移動すべき場所があるべきだろう。
    cout << i + 1 << "番目入力" << endl;
    cin >> temp;
    intContiner.push_back( temp );
  }

  cout << "5つ数の合計" << endl;
  vector<int>::iterator itr = intContiner.begin();
  for( ; itr != intContiner.end() ; ++itr ) {
    sum += *itr;
  }
  cout << sum << endl;

  cout << "5つ数の平均" << endl;
  cout << sum / NUM_SIZE << endl;
}
336デフォルトの名無しさん:2010/06/05(土) 17:16:25
>>335
>282
337デフォルトの名無しさん:2010/06/06(日) 15:00:48
問題:
ジョンにとって縁起のいい数字は4と7で,
他はどうでもいい.ラッキーナンバーとは,
縁起のいい数字を含んだ10進数である.
整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数を挙げよ.

オブジェクトの定義:
クラス名 : TheLuckyNumbers
メソッド名 : count
引数の型 : int,int
返値の型 : int
メソッドの表記 : int count(ints,intb)
として,公的メソッドとせよ.
注:
aの値は1から1,000,000,000まで
bの値は1から1,000,000,000まで

TopCoderでグーグル先生に聞いたら出てきた問題を適当に張ってみる
338デフォルトの名無しさん:2010/06/06(日) 19:38:26
a〜b=(1〜b)−(1〜a){a,b:a<b}
ここまで分かった。
339デフォルトの名無しさん:2010/06/12(土) 18:49:53
>>337
できたぞ
#include <iostream>
#include <cmath>
using namespace std;

class TheLuckyNumbers
{
public:
int count(int s, int b);
};

int TheLuckyNumbers::count(int s, int b)
{
int digits=0,temp;
int k=0;
if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0;
for(int i=s;i<=b;i++)
{
temp=i;
while(temp){digits++;temp/=10;}
temp=i;
while(digits)
{
if(temp % 10 == 4 || temp % 10 == 7) k++;
temp/=static_cast<int>(pow(10.0,digits));
digits--;
}
}
return k;
}
340339:2010/06/12(土) 19:07:36
temp/=static_cast<int>(pow(10.0,digits));
digits--;

じゃなくて

temp/=static_cast<int>(pow(10.0,--digits));
だな。
341339:2010/06/12(土) 19:25:34
全然間違ってた
while(digits)
{
if(temp % 10 == 4 || temp % 10 == 7) k++;
temp/=10; digits--;
}
で最後だ
342デフォルトの名無しさん:2010/06/13(日) 10:22:47
if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0; は必要。
始めにdigitを求め無くても、tempを10で割って行ったら0になる、
そうするともっと早い修正になる。
343デフォルトの名無しさん:2010/06/13(日) 10:55:40
>>341
7777とかだと一つの数字で+4されないか?
344デフォルトの名無しさん:2010/06/13(日) 11:27:16
>>343
そうだな
7777→1個だな
まぁすぐ直せるだろうけど
345344:2010/06/13(日) 11:51:22
#include <iostream>
using namespace std;

class TheLuckyNumbers
{
public:
int count(int s, int b);
};

int TheLuckyNumbers::count(int s, int b)
{
if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0;

int digits=0,temp;
int k=0;
for(int i=s;i<=b;i++)
{
temp=i;
while(temp)
{
if(temp % 10 == 4 || temp % 10 == 7){ k++; break;}
temp/=10;
}

}
return k;
}
346342:2010/06/13(日) 12:25:23
temp%10は2回やる必要なくてtmp=temp%10とかで、俺もやった。
347デフォルトの名無しさん:2010/06/13(日) 13:13:26
Javaで貼ってもよかとですか?
348デフォルトの名無しさん:2010/06/13(日) 13:24:40
349347:2010/06/13(日) 13:33:56
350348じゃばじんすげえ:2010/06/13(日) 14:47:13
class TheLuckyNumbers {
public: inline
  static int count(int a, int b) {
    if (a < 1 || a > 1000000000 || b < 1 || b > 1000000000 || a > b) return 0;
    return count(b) - count(a - 1);
  }
private: inline
  static int count(int a) {
    int result = 0, digits/*=0*/, add = 0;
    if ((digits = search(a)) != 0) {
      result = a % digits; a -= result; result += 1;
    }
    digits = 1;
    while (a != 0) {
      for (int i = 0, j = a % 10; i < j; i++) {
        result += (i == 4 || i == 7) ? digits : add;
      }
      a /= 10; add = add * 8 + digits * 2; digits *= 10;
    }
    return result;
  }
private: inline
  static int search(int a) {
    int result = 0;
    for (int digits = 1; a != 0; digits *= 10, a /= 10) {
      if (a % 10 == 4 || a % 10 == 7) {
        result = digits;
      }
    }
    return result;
  }
};
351デフォルトの名無しさん:2010/06/14(月) 00:35:58
>>350
コメントくらい書こうぜ。
つーか、問題文にはsの方がbより小さいとは書いてないみたいだけれど。

>>337
再帰でやってみた。
http://codepad.org/3FZQcU4D
352デフォルトの名無しさん:2010/07/20(火) 16:32:58
この問題ができません。申し訳ありませんが、よろしくお願いします。

n個の実数(double型)を配列に読み込んだ後,配列を指すポインタを用いて,最大値と最小値を探索するプログラムを作成せよ.また,入力した値の平均値もポインタ変数を用いて計算せよ.
353デフォルトの名無しさん:2010/07/20(火) 20:06:10
宿題スレいけよ
354デフォルトの名無しさん:2010/07/20(火) 21:13:41
>>352
べっべつにあんたの為じゃないんだからっ///

ttp://codepad.org/H60OFDtO
355デフォルトの名無しさん:2010/07/20(火) 23:05:53
356デフォルトの名無しさん:2010/07/28(水) 05:55:11
今更ながら>>2をやってみる

【C言語歴】1〜2ヶ月くらい
【レベル】独学
【コンセプト】
【コメント】

#include<stdio.h>
int main()
{
int dat[5];
int i,a=0;

for(i=0;i<5;i++){
printf("数を入力\n");
scanf("%d",&dat[i]);
a +=dat[i];
}
printf("合計%d 平均%f",a,(float)a/i);
}
357デフォルトの名無しさん:2010/08/01(日) 00:32:04
>>2 やってみる。

【C言語歴】 2日
【レベル】  初心者
【コンセプト】 今日やったところまででベストな感じでやる。
【コメント】 確認はした。


#include <stdio.h>
int main( void )
{
int i, num;
int sum = 0;
double ave;

puts("5つの整数を入力してね");
for(i=1; i < 6 ; i++){
printf( "%d個目:",i ); scanf("%d", &num);
sum += num;
ave = sum / i;
}

printf("合計は%dで平均は%.2fだよ\n", sum , ave);

return 0;
}




358デフォルトの名無しさん:2010/08/01(日) 23:38:14
>>352
これ、四則演算は自由に使ってよいけど、なるべく比較演算を減らそうとすると難しくなるよ。
359デフォルトの名無しさん:2010/08/02(月) 00:21:12
>>358
max = array[0];
min = array[0];
for(int i=1;i<n;i++){
if(array[i] >= max) max = array[i];
else if(array[i] < min) min = array[i];
}
よりも明確に少なくできるってこと?

それとも、
max = array[0];
min = array[0];
for(int i=1;n-i;i++){
if((int)(array[i]/max)) max = array[i];
else if((int)(min/array[i])) min = array[i];
}
ってこと?
360359:2010/08/02(月) 00:24:43
ゼロ割考えるの忘れてたorz
361デフォルトの名無しさん:2010/08/02(月) 11:17:25
>>357
Cではループは0からスタートするのが一般的。
まして、5つの整数を入力するのに6と比較するのではややこしい。

∴for (i = 0; i < 5; ++i) {
# printf()の引き数も変更する必要があるけどね。


aveへの代入はループ内である必要が無い。
→そもそもaveに一時代入する必要もない。
sum / iでは整数除算が行なわれてしまう。
つまり、ave = sum / i では整数除算の結果をわざわざ実数に直しているだけ。

∴printf("合計:%d, 平均:%g\n", sum , (double) sum / N);
362デフォルトの名無しさん:2010/08/02(月) 17:20:32
配列に保存しないなら、for(i = 1; i <= N; i++)って書いて
表示時の加算をはぶくほうがいい
363デフォルトの名無しさん:2010/08/02(月) 19:14:04
つ前置
364デフォルトの名無しさん:2010/08/02(月) 19:21:43
forのインクリメント部が前置と後置でなんかかわるとか思ってんの?w
365デフォルトの名無しさん:2010/08/02(月) 19:45:17
for(i = 0; ++i < N; )
こうする人もいる
366デフォルトの名無しさん:2010/08/02(月) 19:56:22
それじゃループ回数足りないんだけど
for(i = 0; i++ < N; ) ならN回ループするけど、前置じゃないしな
367デフォルトの名無しさん:2010/08/02(月) 20:27:15
for(i = 0; ++i <= N; )
368デフォルトの名無しさん:2010/08/02(月) 20:34:20
インクリメントは前置のが効率的だと聞く。

まぁ大して変わらないだろうけど
369デフォルトの名無しさん:2010/08/03(火) 03:30:09
Cではどうでもいいけど、C++では前置の方がいい。特にイテレータとかだと。
370デフォルトの名無しさん:2010/08/03(火) 23:03:21
>>368
ぶっちゃけなにもかわらんよ
371デフォルトの名無しさん:2010/08/04(水) 07:14:29
>>362はわざわざ後置に書き換えてるんだから何か意味があるんじゃないの?
372デフォルトの名無しさん:2010/08/05(木) 01:11:51
>>371
一般的な書き方に合わせただけだろ
373デフォルトの名無しさん:2010/08/24(火) 15:30:12
んー
374デフォルトの名無しさん:2010/09/07(火) 00:14:48
今頃ながら >>2 をやってみたりした。

【C言語歴】 半年程
【レベル】  初心者〜中級者の狭間
【コンセプト】 テンプレートと再帰
【コメント】 テンプレートが今熱い

ttp://codepad.org/dXXiEEdC

誰かとかぶってたら許して。
375374:2010/09/07(火) 00:33:31
よくよく考えたら>>374は別にテンプレートクラス化しなくても
テンプレート関数でよかたな。
376デフォルトの名無しさん:2010/09/28(火) 14:05:15
過疎いな。
377377 ◆/91kCCQXBo :2010/09/28(火) 16:48:20
[問題]
a,b,cを入力後、二次方程式 a*x^2+b*x+c を平方完成して、
 = i*(x+j)^2+k となる、i,j,k を求めよ。
378デフォルトの名無しさん:2010/09/28(火) 16:55:08
i = a;
j = b / (2 * a);
k = c - b * b / (4 * a);
379377 ◆/91kCCQXBo :2010/09/28(火) 18:13:25
【C言語歴】 C 24年
【レベル】 C プロ
【コンセプト】C++
【コメント】次回言語は C++/CLI

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10932.cpp
380デフォルトの名無しさん:2010/09/28(火) 18:22:30
>>379
一般に浮動小数点数を == や != で比較するべきではない
381デフォルトの名無しさん:2010/09/28(火) 20:46:28
>>2
【C言語歴】 C++のみ半年程
【レベル】  ゲームプログラムしてる
【コンセプト】 単純に、シンプルに
【コメント】 コードは読みやすく書きましょう。

#include <iostream>
#include <numeric>
int main(){
size_t const INPUT_NUM = 5;
std::cout << INPUT_NUM << "個の数字を入力" << std::endl;

double buf[INPUT_NUM];
for ( size_t i = 0; i < INPUT_NUM; ++i ){
std::cin >> buf[i];
}

double const sum = std::accumulate( buf, buf + INPUT_NUM, 0 );
double const ave = sum / INPUT_NUM;

std::cout << "合計:" << sum << std::endl;
std::cout << "平均:" << ave << std::endl;

return 0;
}


>>298 のコメントは正しいけど、 >>298 のコードは読みにくいよね。
382デフォルトの名無しさん:2010/10/03(日) 09:35:59
>>381
そうか? 別に読みにくくなかったぞ。
383デフォルトの名無しさん:2010/10/03(日) 13:46:56
>>381
「ave」がキモくて読みにくいです
384デフォルトの名無しさん:2010/10/03(日) 16:34:11
avec moi
385デフォルトの名無しさん:2010/10/22(金) 21:06:15
そもそも何のつもりでコードを書いてるのかわからない
386デフォルトの名無しさん:2010/10/22(金) 21:09:10
誤爆すまん
387デフォルトの名無しさん:2010/10/23(土) 00:38:53
>>385
そこに問題があるからさ
388超絶初心者:2010/11/10(水) 22:46:01
すいません
急いでます…

ピタゴラスの定理で、
数字を入力したら、その数字aまでのほかの2辺の値をtxtに書き込む
プログラムソース求めてます。
よろしければ協力お願いします。
389超絶初心者:2010/11/10(水) 22:49:50

↑たとえば、
 aに999いれたらaが3〜999までのときの
 b,cの値がずらぁ〜っと書き込まれる感じです。
390デフォルトの名無しさん:2010/11/11(木) 00:04:29
a,b,cがなんなのかさっぱりわからない
391デフォルトの名無しさん:2010/11/11(木) 12:11:05
勝手な解釈だけどこんな感じかな
整数じゃないと問題解けないし

#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int main(){
int a;
cout<<"a => ";
cin>>a;
ofstream fOut("pythagoras.txt");
for(int j=1; j<sqrt(a) ; ++j){
for(int k=j ; k<sqrt(a) ; ++k){
int sum(j*j+k*k);
if( sum<=a )
fOut<<sum<<"\t"<<j<<"\t"<<k<<endl;
else
break;
}
}
fOut.close();
}
392超絶初心者:2010/11/12(金) 00:18:50
急いでたんで丸投げしてしまいました。
たとえばのソースが、
#include<stdio.h>

int main()
{
FILE *fp;
int a,b,c,x,saikouchi;

printf("整数値を入力…\n");
scanf("%d",&saikouchi);
printf("あなたの入力は%d",saikouchi);
fp = fopen("suugaku.txt" , "a");
for(a = 3;a <= saikouchi;a += 2)
{
x = a * a;
x = x - 1;
b = x / 2;
c = b + 1;
fprintf(fp,"%d , %d , %d\n",a,b,c);
}
return 0;
}

393超絶初心者:2010/11/12(金) 00:38:56

#include<stdio.h>

int main()
{
FILE *fp;
int a,b,c,x,saikouchi;

printf("整数値を入力…\n");
scanf("%d",&saikouchi);
printf("あなたの入力は%d",saikouchi);
fp = fopen("suugaku2.txt" , "a");
for(a = 4;a <= saikouchi;a += 2)
{
x = a * a;
x = x - 4;
b = x / 4;
c = b + 2;
fprintf(fp,"%d , %d , %d\n",a,b,c);
}
return 0;
}
みたいなかんじです。
これをひとつにまとめたいんですが
if,for,…何をどう使えばいいのかわからずにいます
教えてください。
394デフォルトの名無しさん:2010/11/12(金) 01:00:29
>>392-393
詳細な仕様をちゃんと書いてくれ、誰もが数学を知ってるとはいえない状況だ。
場合分けするにも理屈がわからんとアドバイスできないからな。
395超絶初心者:2010/11/12(金) 01:55:17
了解です
a×a = 2b+1 = 2c-1という最も簡単な式を使ってます
x = a * a; (2b+1 = 2c-1 = x)
x = x - 1; (x = 2bにします)
b = x / 2; (b/2にしてます)
c = b + 1; (最後に1を足します)
説明不足でしたら
お願いします
396デフォルトの名無しさん:2010/11/12(金) 02:11:40
aが奇数と偶数のどちらでも計算できるコードが知りたいということ?
397デフォルトの名無しさん:2010/11/12(金) 02:16:22
x = a * a; (2b+1 = 2c-1 = x) ←aが奇数ならxは奇数,偶数なら偶数
x = x - 1; (x = 2bにします) ←aが奇数ならxは偶数,偶数なら奇数
b = x / 2; (b/2にしてます) ←aが奇数ならxは整数,偶数なら実数
c = b + 1; (最後に1を足します)  ←aが奇数ならxは整数,偶数なら実数
てなるからbcは実数型にして
b = x / 2.0
てすればおk
398超絶初心者:2010/11/12(金) 02:45:32
はい奇数偶数
どちらでもできるのがわからないんです
399デフォルトの名無しさん:2010/11/12(金) 18:53:57
int a,b,c,x,saikouchi;
fprintf(fp,"%d , %d , %d\n",a,b,c);

int a,x,saikouchi; double b,c;
fprintf(fp,"%d , %lf , %lf\n",a,b,c);
400デフォルトの名無しさん:2010/11/12(金) 19:07:04
△%lf
○%f
◎%g
401 ◆/91kCCQXBo :2010/12/27(月) 12:21:49
1.)10桁の乱数を求めます。
2.)下2桁を表示します。この時、上位桁の0は表示します。
3.)以前に表示した数字と同じ数字の場合は+1桁を表示します。
4.)1000回繰り返しなさい。
言語:C#
402 ◆/91kCCQXBo :2010/12/27(月) 12:29:44
何なら、言語:C++/CLI でもいいです。
403デフォルトの名無しさん:2010/12/27(月) 16:04:26
>>401
これくらいは自分でかこうやw

Mathの乱数つかって後は箇条書きの通りの処理実装するだけだぞ。
そこまでわかってるなら自前でかいた方がたぶんはやい。

うまく動かないときはソース貼り付ければ誰かがデバッグを手伝ってくれるとおもうよ。
404デフォルトの名無しさん:2010/12/27(月) 16:09:21
二桁の数は100種類しかないのに重複したらプラス1するって意味がわかんねえ。
1000回くりかえしたらどの数も平均10回重複するだろ。
405デフォルトの名無しさん:2010/12/27(月) 16:10:32
つうか、2桁しか表示しないのに内部で10桁の乱数を作る意味がねえ。
406デフォルトの名無しさん:2010/12/27(月) 17:43:00
>>404
プラス一桁
407 ◆/91kCCQXBo :2010/12/28(火) 00:38:35
2+1=3
408デフォルトの名無しさん:2010/12/28(火) 01:09:35
暇だったので書いてみた。言語はC++のようなもの。
乱数がなかなか重複しねー。
#include <stdio.h>
#include <stdlib.h>
int Slice(unsigned int N,int Digit){
    int T = 1;
    for(int i = 0;i<Digit;i++) T*=10;
    return N-((N/T)*T);
}
int main(){
    unsigned int Rnd=rand()<<(17/3),Old=0;
    unsigned int Sli =0,A,B,j;
    srand(1);
    for(int i=0;i<1000;i++){
        for(j=2;j<10;j++){
            A=Slice(Rnd,j);
            B=Slice(Old,j);
            if(A!=B) break;
        }
        printf("%u-",Rnd);
        for(j=10-j;j!=0;j--)printf("0");
        printf("%u\n",A);   
        Old = A;
        Rnd=(rand()<<17)/3;
    }
    return 0;
}
409デフォルトの名無しさん:2010/12/28(火) 01:15:40
何か間違ってる気がしてきた。
Oldをstd::mapにすれば履歴とれるけどね・・・。
410 ◆/91kCCQXBo :2010/12/28(火) 01:55:32
>408 言語:C99
少なくとも乱数の下2桁が重複すればいいんです。
07
107
2107
411デフォルトの名無しさん:2010/12/28(火) 03:00:44
直前には対応してるが、何世代か前とかそういうのはmap使わないとめどい。
そもそも10桁の乱数の取得がめんどい。で、お茶をにごしてあるわけなんだが。
これはアリなのかナシなのか。。。
412デフォルトの名無しさん:2010/12/28(火) 03:03:09
今日は寝るよ。 >>408がアリかナシかだけききたいね。
413デフォルトの名無しさん:2010/12/28(火) 03:03:35
3)が満たされるときに
2)は実行するべきなのかスキップするべきなのか
普通に問題を読むと2)は実行した上で3)の条件を実行することになるがそれでいいのか
414 ◆/91kCCQXBo :2010/12/28(火) 09:40:36
>>412 投稿ありがとうございます。
02.)下2桁を表示します。 但し、以前に表示した数字と同じ数字が表示される場合は
前回より1桁多く表示します。
03.)従って、桁数は3桁4桁と増えます。必要桁数分の上位桁の0は表示します。
415 ◆/91kCCQXBo :2010/12/28(火) 10:36:27
return N%T;
// return N-((N/T)*T);
ちがってたら(ご
416デフォルトの名無しさん:2010/12/28(火) 19:58:57
>>415
そっちのほうがスマートかも。
417デフォルトの名無しさん:2010/12/28(火) 20:07:38
10桁の乱数って事は0 〜 99億9999万9999 だと思うんだけど、そこに突っ込まないのはお約束?
418デフォルトの名無しさん:2010/12/28(火) 20:17:48
0〜999999999は10桁じゃありません
419デフォルトの名無しさん:2010/12/28(火) 20:35:27
>>418
一桁足りないぞ
10億〜99億9999万9999か?
どっちみち unsigned int では駄目って事だけど
420デフォルトの名無しさん:2010/12/28(火) 20:37:11
0000000000〜9999999999だな
421デフォルトの名無しさん:2010/12/28(火) 20:55:47
あらま、int64じゃないとだめなのか。
422デフォルトの名無しさん:2010/12/28(火) 22:07:08
もしくは文字列
どうせ rand() が int64 に対応してないんだから、rand() で 0〜9 を取得して一桁づつ並べれば?
423 ◆/91kCCQXBo :2010/12/29(水) 10:45:48
std::map が使える/使えないはどっち?
GCC
BCC
VC
CLI
424デフォルトの名無しさん:2010/12/29(水) 13:42:33
ttp://d.hatena.ne.jp/kamoya11/20101228/1293536046
なにかと思ったらここのやつだったか
425デフォルトの名無しさん:2010/12/29(水) 14:42:27
426デフォルトの名無しさん:2010/12/29(水) 18:02:56
暇だったから書き直してみた。全履歴参照版。ところどころぱくってる。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <map>
uint64_t Slice(uint64_t N,uint64_t Digit){ 
    int T = 1; 
    for(int i = 0;i<Digit;i++) T*=10; 
    return (N%T); 

uint64_t MakeNumber(int Digit){
    uint64_t N=0;
    for(int i=0;i<Digit;i++) N=(N*10)+(rand()%10);
    return N;
}
int main(){
    std::map<uint64_t,uint32_t> Counter;
    uint64_t N=0,A;
    for(int i=0;i<1000;i++){
        N=MakeNumber(10);
        for(int j=2;j<=10;j++){
            A=Slice(N,j);
            Counter[A]++;
            if(Counter[A] == 1)break;
        }
        printf("%llu-%llu \n",N,A);
    }
    return 0;
}
427426:2010/12/29(水) 18:16:00
うぅーむ。頭の0の扱いが下手だからちょっとバグってるかも。
あと履歴は表示したやつだったのね。

>>if(Counter[A] == 1)break; 
上の一文の下に、
Counter[A]--;

いれないとだめかも。
もうアイディアないからほかの人、良いの頼む。
428 ◆/91kCCQXBo :2010/12/29(水) 19:08:11
>>426
02
002
1002
のように、頭の0を表示すると同じ数字でも別にできるという問題趣旨。
429デフォルトの名無しさん:2010/12/29(水) 19:21:51
>>428
俺のショートコーディング技術ではちょっと厳しいです。
文字列じゃないと0の扱いがかなり面倒ですなー。

誰か一番良いの頼む。
430デフォルトの名無しさん:2010/12/29(水) 20:20:39
問題を見直すと、言語が C# になってるな
環境が無いからパスします
431デフォルトの名無しさん:2010/12/29(水) 20:49:21
と思ったけど、C++でも良いってあるから書いてみた
文字列で処理したベタベタのCで良ければどうぞ

ttp://codepad.org/TxZ96ZVs
432 ◆/91kCCQXBo :2010/12/30(木) 01:59:06
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string>
#include <map>
uint64_t Slice(uint64_t N,uint64_t Digit){
  int T = 1;
  for(int i = 0;i<Digit;i++) T*=10;
  return (N%T);
}
uint64_t MakeNumber(int Digit){
  uint64_t N=0;
  for(int i=0;i<Digit;i++) N=(N*10)+(rand()%10);
  return N;
}
int main(){
  std::map<std::string, bool> Counter;
  uint64_t N=0,A;
  char aa[11];
  std::string a;
  for(int i=0;i<1000;i++){
    N=MakeNumber(10);
    for(int j=2;j<=10;j++){
      A=Slice(N,j);
      sprintf(aa, "%0*d", j, A);
      a = aa;
      if(! Counter[a]) { Counter[a]=true; break; }
    }
    printf("%s %llu\n", aa, N);
  }
  return 0;
}
433デフォルトの名無しさん:2010/12/30(木) 03:32:42
意外といけますな。何かコード量があまったのでふざけてみた。
文字処理は苦手だけどこれくらいならなんとかなったな。もうこれ以上は俺の中にはないね
#include <iostream>
#include <string>
#include <map>
static const int Digit = 10;
static const int Loop  = 1000;
std::string MakeNumber(int Digit,int Radix=10){
    std::string S;
    Radix = std::max(Radix,1);
    Radix = std::min(Radix,62); 
    char ch[]="0123456789abcdefghijllnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ";//Radix MAX = 62
    if(Digit > 0) S+= ch[(rand()%(Radix-1))+1];
    for(int i=1;i<Digit;i++) S+= ch[rand()%Radix];
    return S;
}
int main(){
    std::string N,T;
    std::map<std::string,int> Counter;
    for(int i=0;i<Loop;i++){
        N=MakeNumber(Digit);
        for(int j=0;j<Digit;j++){
            T = N.substr(Digit-j,j);
            Counter[T]++;
            if(Counter[T] == 1) break;
            Counter[T]--;
        }
        std::cout<<N<<'-'<<T<<std::endl;
    }
    return 0;
}
434デフォルトの名無しさん:2010/12/30(木) 03:39:19
まーた抜けがあったよ・・・orz

for(int j=0;j<Digit;j++){
        ↓
for(int j=2;j<Digit;j++){

なんだかんだではまっちゃったなぁ・・・。
435 ◆/91kCCQXBo :2010/12/30(木) 09:06:48
>>427
「だめかも」なら確かめてみろ。要らないだろう。
436デフォルトの名無しさん:2011/01/04(火) 21:42:59
#define rand() 0
とかで動作を確かめてから書き込んだほうがいいぞ
437デフォルトの名無しさん:2011/08/29(月) 12:58:12.54
コンセプトはいいなこのスレ
438デフォルトの名無しさん:2011/09/01(木) 00:50:12.27
なんか問題出して
439デフォルトの名無しさん:2011/09/02(金) 04:12:23.09
かっこいいmalloc
440デフォルトの名無しさん:2011/09/02(金) 19:36:35.12
そんなものはない
441デフォルトの名無しさん:2011/09/02(金) 20:17:42.01
ドブネズミみたいに美しいmalloc
442デフォルトの名無しさん:2011/09/04(日) 14:01:19.98
[1] 授業単元:プログラム設計
[2] 問題文:以下の条件で売り上げ集計プログラムを作りなさい。
 @クラスを用いる(困難なら構造体で可)
 A店舗毎に名前・売り上げを入力し、平均、標準偏差を計算
 B売り上げ毎に店舗を並び替える
 C店舗数は任意。
 D並び替えは簡単でよい。店舗数が少ない場合、単純に比較するだけでよい。
[3] コンパイラ名とバージョン: Microsoft Visual C++
[4] 言語:C
[5] その他の制限: 特にありません。

http://codepad.org/gz45HfDH
443デフォルトの名無しさん:2011/09/04(日) 14:37:19.89
宿題スレで満足いく回答が得られなかったからってこっちに持ってきて解かせようとか死ね
444デフォルトの名無しさん:2011/09/04(日) 18:44:46.76
Cなのにクラスとか。意味がわからんがな。
445デフォルトの名無しさん:2011/11/14(月) 21:54:47.12
446デフォルトの名無しさん:2011/11/19(土) 16:34:40.70
なに?
447デフォルトの名無しさん:2011/12/07(水) 19:06:42.05




自身が聞いた情報によると、もうじき中国はバブルがはじけて昔の貧乏な中国に戻るんだぜ
もう経済は破綻してて、取り戻すのは無理なんだそうだな


その世界ではやたら有名な政府関係者筋から聞いた確かな情報だな

まあお前ら頭の良い連中には、今さらなくらいのネタだ、
お前らからすればもう常識的なくらいの知識だろうぜ







448デフォルトの名無しさん:2011/12/07(水) 19:12:59.07
なぜココに書いたのかは不明だが、自分も昔の日本と同じ状況だなーとはうすうす思っていた。
まー、俺に関係ない。
449デフォルトの名無しさん:2012/05/14(月) 02:36:46.73
なんか布団の中で思いついた問題

1. 0から9999までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け
 例) 0→ぜろ 4→よん 14→じゅうよん 87→はちじゅうなな 801→はっぴゃくいち 7974→ななせんきゅうひゃくななじゅうよん

2. 0から99999999(9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け
 例)88880007→はっせんはっぴゃくはちじゅうはちまんなな

3. 0から9999999999999999(9999兆9999億9999万9999)までの整数を入力として受け取り、それをひらがなで出力するプログラムを書け
 例)8000800080008→はっちょうはちおくはちまんはち

4. 上記3において、入力が3の倍数もしくは3がつく数字であるときにはその数字を英語で出力せよ
450片山博文MZボット ◆0lBZNi.Q7evd :2012/05/14(月) 15:43:21.54
451デフォルトの名無しさん:2012/05/14(月) 15:57:23.18
452片山博文MZボット ◆0lBZNi.Q7evd :2012/05/16(水) 08:45:15.34
453片山博文MZボット ◆0lBZNi.Q7evd :2012/05/17(木) 12:44:12.34
454片山博文MZボット ◆0lBZNi.Q7evd :2012/05/17(木) 13:02:40.86
>>452 日本語版改良。
http://codepad.org/EhkY8LlQ
455片山博文MZボット ◆0lBZNi.Q7evd :2012/05/17(木) 13:11:01.73
>>454 日本語版バグ修正。
http://codepad.org/S1DtgCXB
456片山博文MZボット ◆0lBZNi.Q7evd :2012/05/18(金) 11:21:03.77
>>453 tweloveをtwelveに修正。 thityをthirtyに修正。fourtyをfortyに修正。
http://codepad.org/0mft2Mzh
457デフォルトの名無しさん
30Byteで100までのFizzBuzzを出力せよ
という記事に触発されて作ってみたんですが、
c++のiostreamだけでこれより短くなりませんか><?

http://ideone.com/QN526