こんにちは。C言語初心者で現在会社で勉強しているものです。上司に課題を出されました。以下の通りです。
「1~100までの数字をランダムに出力するプログラムを作成しなさい。ただし実行するたびにその結果は異なるようにし、同じ数字は表示されないようにしなさい。」
 time関数を使って実行する度に異なる結果が得られるところまではできたのですが、一度表示された数字を省くロジックがわかりません。質問検索で似たような質問をされていた方が何人かいて、それを参考にやってみたのですがどうもうまくいきません。できるだけCPUに負荷をかけないように、という条件もあります。
 提出期限が迫っており困っています。どなたか教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

2つの課題が有りますね。

今までにやってみて一番気に入った方法を。
(1)実行するたびに同じ並びになったら困る。
    time関数を使わなくても srand関数を最初に1回書けば実行するたびに乱数が変わるはずです。
   (勝手にtime関数を実行してくれる?)

(2)重ならない乱数を効率よく100個取り出す。
   配列を100個用意し、1から100の数字を入れます。
   randでそのうちの1個を選んで出力します。仮に48番目とします。
   48番目と100番目を入れ替えます。
   次に99個の範囲で1つ選んで出力します。仮に35番目とします。
   35番目と99番目を入れ替えます。
   次に98個の中から・・・
   
   ということを次々に繰り返していけば最後に配列の対象範囲が0になります。
   これをチェックしてループを終了すればいい訳です。
   
    • good
    • 0

プログラミングはできるだけ自分の力でやった方がいいですよ。


ゆくゆく苦労してしまいますから。
たとえ自分でやったとして効率の悪いのができたとしても
はるかにためになりますから。
今回はお困りのようなのでちょっとだけ力になります。

void main(void)
{
int num[100] = {1,2,3,4,5,6,7,8,9,10,11.....100};
int i,j;

for(i=0;i<100;i++){
cnt = rand()%(100-i);
printf("%d\n",num[cnt]);

for(j=cnt;j<100-1;j++){
num[j] = num[j+1];
}
}
}

これでできませんかね?
    • good
    • 0

「rand関数を使え」という指示が無ければ、こんな発想もあります。



1~100迄の値が入った数列を用意して、数字をバラバラに入れ替えれば終わりです。(結局ココにrandを使うことになりますので、ある意味課題クリアです)
プログラム量も非常に短くなりますし、負荷は入れ替えの回数次第で調節できます。

ところで、time関数ってミリ秒が帰ってくると思うのですが、高速CPUでやるとずっと同じ値が帰ってきたりしませんか・・?
    • good
    • 0

私も同じようなプログラムを作った経験があります。

お考えのように1~100までの乱数発生させ、一回登場した数値はフラグでチェックして飛ばすという考え方では100個目を選ぶのにえらく時間がかかり、何か無駄なような気がしました。
そこで例えば1~100までの番号がついたボールがあると考えて。
1.最初の1個を乱数で選ぶ
2.残りは99個なので1~99の乱数発生させ、次の一個を選ぶ
3.また1個減るので、1~98の乱数発生させ、次の一個を選ぶ
4.これを繰返す
5.最後には1個になり、ここで100個目を選んで終り。
いかがでしょうか

この回答への補足

 早速の解答ありがとうございます。すごく分かりやすいた例えでありがたいです。しかし現在の私の能力では具体的にどうプログラミングしたらよいかどうしても分かりません。選ぶボールを減らしていく方法を教えてください。

補足日時:2002/03/26 13:52
    • good
    • 0

データ型は bool , short , char のどれでも構いませんが


配列を 101 取ると 0~100 のフラグとして使用できます
その配列を初期化して(これが重要です)
出た結果をフラグに代入し,次に出た結果のフラグに何か代入されているか
をチェックすれば同じ数字を表示することは防げます
また,表示した個数を数えていれば全ての数字を表示したことがわかります
    • good
    • 0

このQ&Aに関連する人気のQ&A

意味 フラグ」に関するQ&A: メールのフラグ

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q正規乱数とは

学校の宿題ですがまず正規乱数の発生は2つの方法があるというのですが、意味がわかりません。
正規乱数でなんですか。
なぜ12個足して6をひくのですか。
また逆関数法の=NORMSINV(RAND())てどういう意味ですか。
正規乱数の発生
1
一様乱数を12個足して6を引く方法
=RAND()+RAND()+・・・・+RAND() - 612個分
2
逆関数法
=NORMSINV(RAND())

Aベストアンサー

正規乱数とは、正規分布に従う母集団からランダムに取り出された
数値の集合のことです。
Uを(0,1)上の一様分布に従う確率変数、Fを正規分布の分布関数とし
て、X=F^(-1)(U)(UのFの逆関数による確率変数)とすると、
P(X≦x)=P(F^(-1)(U)≦x)=P(U≦F(x))=F(x)
となって、Xの分布関数はFになり、Xは正規分布に従う確率変数と
なります。
これが、2の逆関数法です。
NORMSINVがFに相当し、RAND()がUに相当します。
1は私も意味が分かりません。

Qこのプログラムを実行すると座標列になるのですが、どうして実行結果のよう

このプログラムを実行すると座標列になるのですが、どうして実行結果のような座標列になるのかがよくわかりません。
僕はdraw_polygon()中のif(r>xxx)の部分に何かあるような気がします。単なる推測ですが・・・。
理由を教えていただけませんか?

#define _CRT_SECURE_NO_DEPRECATE 1
#include <stdio.h>
#include <math.h>
#defi ne PI 3.14159265358979323846

FILE *fp;//グローバル変数.あまり使うな!

double get_x(double r, double angle);
double get_y(double r, double angle);
void draw_polygon(int n, double r, double cx, double cy);

void main(void)
{

fp=fopen("polygon.csv","w");//チェック省略
draw_polygon(4,1,0,0);
fclose(fp);
}

double get_x(double r, double angle)
{
return(r*cos(angle));
}

double get_y(double r, double angle)
{
return(r*sin(angle));
}

void draw_polygon(int n, double r, double cx, double cy)
{
int i;
double delta,angle,x,y;

delta=2.0*PI/n;
for(i=0; i<=n; i++)//i<=n
{
angle=delta*i;
x=get_x(r,angle)+cx;
y=get_y(r,angle)+cy;
fprintf(fp,"%8.3f,%8.3f\n",x,y);
}
fprintf(fp,"\n");
if(r>0.05)
{
for(i=0; i<=n; i++)//i<=n
{
angle=delta*i;
x=get_x(r,angle)+cx;
y=get_y(r,angle)+cy;
draw_polygon(n,r*0.5,x,y);
}
}
}

プログラムを見やすく作ったのですが、この質問を掲示した途端に上下そろってしまいました(汗)
見にくくなってしまいすみません。

このプログラムを実行すると座標列になるのですが、どうして実行結果のような座標列になるのかがよくわかりません。
僕はdraw_polygon()中のif(r>xxx)の部分に何かあるような気がします。単なる推測ですが・・・。
理由を教えていただけませんか?

#define _CRT_SECURE_NO_DEPRECATE 1
#include <stdio.h>
#include <math.h>
#defi ne PI 3.14159265358979323846

FILE *fp;//グローバル変数.あまり使うな!

double get_x(double r, double angle);
double get_y(double r, double angle);
void draw_polygon(...続きを読む

Aベストアンサー

関数の再帰呼び出しって知っていますか?
draw_polygon()の中でdraw_polygon()を呼んでいますよね。これが再帰呼び出しです。
半径と中心座標を変えながらdraw_polygon()を実行していきます。半径が0.05以下になったらそれ以上再帰呼び出しをしません。

Q乱数について

こんばんは。
何度も申し訳ありませんが、今回は乱数について教えてください。
LinuxでCを勉強しているんですが、
randで乱数を発生させることはできたんですが、
そのプログラムを何度実行させても
出てきた乱数は同じ値なんです。
プログラム内で例えば10こ乱数を発生させたとすると
違うものが出ます。
しかし、もう一度そのプログラムをはしらせると
前回と全く同じ並びで同じ数が出るのはどうしてでしょうか?
言ってる意味わかっていただけましたでしょうか?
宜しくお願いします。

Aベストアンサー

乱数は計算によって、擬似的に求めています。
そのため同じ乱数が順番に出てきます。
乱数を初期化することで、順番の途中から使うことができます。
srand()がその関数です。
一般的にはプログラムが起動された時間を利用し、
乱数を初期化することが行なわれます。
コンパイラによって違うかもしれませんが、
たいてい、こんな感じで初期化します。

srand(time());

他にも方法はあります。
たとえば、人が入力するまでの時間は規則性がないので、
このとき、乱数の空回しをしてやることで、
乱数の周期性をなくすことができます。
while(1)
{
 rand(); ←乱数の空回し
 入力待ち;
 if(入力あり) break;
}

Q実行結果をデジタル時計みたいな数字のみの4桁(LEDみたいな?)に表示

おせわになってます。勉強中かなり初心者です。

映画「24」の数字みたいな表示形式の画面に、時刻表の計算結果を表示したいのですが(お分かりいただけたでしょうか。。。)

int main(void)
{
char type;
int a;
  do {
nt table[] = { // 時刻表

610, 636, 659, 723, 750, 820, 837, 906, 933, 951,
1032, 1110, 1149, 1230, 1310, 1349, 1427,
1505, 1542, 1608, 1640, 1708, 1736, 1806, 1835,
1900, 1938, 2008, 2035, 2056, 2117, 2155, 2233,
2319, 2348, -1, //テーブル終印
};
int findtime; // 0000形式に変換後の現在時間
int *search; // テーブル内の検索時間
int h; // 時
int m; // 分

time_t timer; // 現在時刻を取得し地方形式に
struct tm *local;

time(&timer); // 現在時刻の取得

local = localtime(&timer); // 現在時刻を構造体に変換

h = local->tm_hour; // 時
m = local->tm_min; // 分

findtime = h * 100 + m ; // 現在時間を0000形式へ変換

// 該当時間検索
for ( search = table ; *search != -1 ; search++ ) {
if ( *search > findtime ){
break;
}
}
// 結果表示
// テーブル内の-1に当たったら06:10
if ( *search == - 1 ) {
printf( "06:10\n\n" );
}
else {
printf( "%02d:%02d\n\n",
(*search / 100), // 「時」取り出し
(*search % 100) ); // 「分」取り出し
}
scanf("%c", &type); // Enterで再度プログラム開始
}
while (type == '\n');

return 0;
}

上記ソースの結果を点灯(表示)させたいのです。
下記ソースは時刻表とは関係なしに「8888」と点灯させた場合です

//Printer's port no. (メモリのアドレス?)
#define PRN_PORTD 0x0378
#define PRN_PORTC 0x037a

int main(void)
{
int ret = ioperm(PRN_PORTD, 4, 1));

outb (0x7f, PRN_PORTD); // 以下右の一桁目点灯
// ↑ 0x7f は 8表示 0x06は1   
// 0x5bは2 0x4fは3 0x66は4
// 0x6dは5 0x7dは6 0x27は7
// 0x6fは9 0x3fは0

outb (0x00, PRN_PORTC); // 「桁」選択
outb (0x00|0x04, PRN_PORTC); // STROBEをON
outb (0x00, PRN_PORTC) // STROBEをOFF


outb (0x7f, PRN_PORTD); // 以下右から二桁目点灯

outb (0x01, PRN_PORTC);
outb (0x01|0x04, PRN_PORTC);
outb (0x01, PRN_PORTC);

 ・・・以下四桁目までつづく

ret = ioperm(PRN_PORTD, 4, 0);
return 0;
}
会社の課題でして、上司の指示は、「何桁目にはこの数字を入れる」みたいな関数を作ってスッキリしたソースを見せてくれと。。。

ネットや関連書籍にも記載がありません。
本当に困っています。表示させるマシンの仕様も、上記説明では分からないと思いますが、「私だったらこうします」みたいなサンプルソースを見せて頂けたら幸いです。チョットしたヒントでも歓迎です。
長々と本当に申し訳ないです。ご教授願います。

おせわになってます。勉強中かなり初心者です。

映画「24」の数字みたいな表示形式の画面に、時刻表の計算結果を表示したいのですが(お分かりいただけたでしょうか。。。)

int main(void)
{
char type;
int a;
  do {
nt table[] = { // 時刻表

610, 636, 659, 723, 750, 820, 837, 906, 933, 951,
1032, 1110, 1149, 1230, 1310, 1349, 1427,
1505, 1542, 1608, 1640, 1708, 1736, 1806, 1835,
1900, 1938, 2...続きを読む

Aベストアンサー

★映画「24」は見ていましたが、どんな表示形式か忘れました。
・もう少し分かりやすい別表現が欲しかった。
 要するに単純なデジタル表示にしたいのですよね。
・main() 関数が2つありますが、上の main()と下の main() 関数の違いは何ですか?
 組み込み系のプログラミングには詳しくありませんが、下の main() 関数にある
 outb() の第一引数は表示する7セグメント LED の点灯ビットですね。
 確認の為に聞きますが、7セグメント LED の上を a とすると時計回りで b、c、d、e、fとなり、
 日の中心の横棒が g となりますよね。そして、a~g の対応が次のようになりますよね。
 a…0x01
 b…0x02
 c…0x04
 d…0x08
 e…0x10
 f…0x20
 g…0x40
 上記であっていますよね。ソースから解読すると。

●本題
・アドバイスとしては outb で1桁表示する部分をサブ関数にすれば簡単ですよ。
 つまり、
 outb( LED, PRN_PORTD );
 outb( loc, PRN_PORTC );
 outb( loc|0x04, PRN_PORTC );
 outb( loc, PRN_PORTC );
 上記の4行を1つの関数にして引数に num、loc の2つを受け取るのです。
・LED は点灯したい LED の点灯ビットで、loc は桁数を表す値です。

サンプル:
// 1桁の7セグメント LED を表示する関数
void lightLED( int num, int loc )
{
 static int table[] = {
  0x3F, // 0
  0x06, // 1
  0x5B, // 2
  0x4F, // 3
  0x66, // 4
  0x6D, // 5
  0x7D, // 6
  0x27, // 7
  0x7F, // 8
  0x6F, // 9
 };
 
 outb( table[ num ], PRN_PORTD ); ←table[ num ] で数値から点灯ビットに変換
 outb( loc, PRN_PORTC );
 outb( loc|0x04, PRN_PORTC );
 outb( loc, PRN_PORTC );
}

// 時刻表の時:分を表示する関数
void digitalLED( int findtime )
{
 int ret, a, b, c, d;
 
 a = ((findtime / 1000) % 10); ←4桁目を取り出す
 b = ((findtime / 100) % 10); ←3桁目を取り出す
 c = ((findtime / 10) % 10); ←2桁目を取り出す
 d = ((findtime / 1) % 10); ←1桁目を取り出す
 
 ret = ioperm( PRN_PORTD, 4, 1 );
 lightLED( a, 0x03 ); ←『時』の10桁を表示
 lightLED( b, 0x02 ); ←『時』の 1桁を表示
 lightLED( c, 0x01 ); ←『分』の10桁を表示
 lightLED( d, 0x00 ); ←『分』の 1桁を表示
 ret = ioperm( PRN_PORTD, 4, 0 );
}

解説:
・digitalLED() 関数の引数 findtime は時分をパックした整数値です。
 つまり、23時59分ならば 2359 という整数値です。
・digitalLED() 関数は7セグメントの1桁を表示する専用の関数です。
 第一引数 num が表示する数字 0~9 ですが、これを点灯ビットに変換する必要があります。
 この変換には table[10] を用意してテーブル参照することで簡単に出来ます。
 ただし、0~9 までの整数にして下さい。負の値や 10 以上を与えるとどうなるか不明ですよ。
・なお、サンプルでは分かりやすくするために繰り返し文を使っていません。
 実際には for、while 文などで繰り返しで記述すればスッキリします。→digitalLED() を改良。

その他:
>int table[] = { // 時刻表
 のテーブルには static をつけたほうが良い。つまり、
 static int table[] = { // 時刻表
  610, …, 951,
   :
  2319, 2348, -1, //テーブル終印
 };
 とします。
・以上。参考に。

★映画「24」は見ていましたが、どんな表示形式か忘れました。
・もう少し分かりやすい別表現が欲しかった。
 要するに単純なデジタル表示にしたいのですよね。
・main() 関数が2つありますが、上の main()と下の main() 関数の違いは何ですか?
 組み込み系のプログラミングには詳しくありませんが、下の main() 関数にある
 outb() の第一引数は表示する7セグメント LED の点灯ビットですね。
 確認の為に聞きますが、7セグメント LED の上を a とすると時計回りで b、c、d、e、fとなり、
 日の...続きを読む

Q乱数の数学的な定義はありますか?

数学の背景がないので、質問が変かも知れませんが、よろしくお願いします。

「乱数」には、数学的な定義がありますか?
例えば、「いかなる視点からも規則性のない数の並び」とか、「偶然にまかせた数の並び」とか言えるのでしょうか?

また、ある数列を与えられたときに、それが、「乱数」かどうかを調べる方法はあるのでしょうか?

というのは、たまたま、1が100個ならんだ数列でも、必ずしも「乱数」ではないと言えないような気がするのです。もし、偶然に任せるという意味で乱数を考えるとすると、たまたま、1が100個並ぶことも有り得るし、それを意識的に排除すると、むしろ、自然な「乱数」ではなくなってしまうような気がして、よくわからなくなってしまいました。

Aベストアンサー

まず,数字の出現頻度もある1つの確率分布にしたがっていることが第一の条件です。
つまり,1から100の間の整数の100万個の一様乱数と言った場合には,1の出現頻度がほぼ1万個,2も同じく1万個・・・100も同じく一万個であることです。
次に,どの数字も他の数字と関係がないことが必要です。これははっきり言うのが難しいのですが,たとえば直前の数字とその数字の間の相関が無い(つまり1あとはいつも2だったりしないこと)。先の例だと
1の後の数字を調べても1から100までの数字が同じ頻度で並んでいるような数字のことです。
ご指摘のように,1が100個ならんだ数が乱数であるか無いかは母数いくつの集団について考えているかによります。100個の集団について考えてみると明らかに上記の2条件を満たしませんから,乱数とはいえません。
しかし,10の百乗くらいの数の母集団であれば,ある一箇所に1が100個続いても乱数といえるかもしれません。
乱数検定というのがあって,上記の2つの条件を調べるのもひとつです。
ほかにもいろいろな検定方法があり,乱数は暗号技術と密接な関係があるために,現在でもいろいろ研究されています。興味があれば,「乱数検定」で検索するとたくさん出てきます。

まず,数字の出現頻度もある1つの確率分布にしたがっていることが第一の条件です。
つまり,1から100の間の整数の100万個の一様乱数と言った場合には,1の出現頻度がほぼ1万個,2も同じく1万個・・・100も同じく一万個であることです。
次に,どの数字も他の数字と関係がないことが必要です。これははっきり言うのが難しいのですが,たとえば直前の数字とその数字の間の相関が無い(つまり1あとはいつも2だったりしないこと)。先の例だと
1の後の数字を調べても1から100までの数字が同じ頻度で並...続きを読む

Qこの実行結果だしたいのですがどのようなプログラムになりますか?

この実行結果だしたいのですがどのようなプログラムになりますか?

Aベストアンサー

しかも、まだPCの使い方分かってないし・・・・・。

何で横向けでの写真投稿なんですか。
「相手が見づらい」って思わないんですか。
少なくとも「モノを教わろう」って人間の態度じゃないんですよ。

確かにプログラム書くのはメンド臭いし、やりたくないのも分かる。
しかし「貴方が面倒くさい」って思うモノは他人も(たとえプロのプログラマでも)「面倒くさい」んですよ。
その「面倒くさい」事を他人に頼むのなら、少なくとも「写真は縦でそのまま見れる」ようにすべきです。
こんな横向きで見づらい写真を投稿する、とか、フツーに考えると「ふざけるな」ですね。
相手の面倒をなるべく減らすように出来るだけの事をしなさい。
常識です。
今のトコ、あなたの考え方の基本は間違っています。

*写真の方向の直し方
1. PCにスマホから写真を転送する(USBで接続するもよし、メールで転送するもよし)
2. PC上に保存した写真をダブルクリックで立ち上げる
3. 回転ボタンがあるからそれで角度を変える
4. 保存する
5. それで投稿

・・・・・っつーかね、これも基本で、こないだ書いた通り「PCの使い方がそもそも分からない」・・・「分からない」っつーか「分からなさ過ぎてる」んで、まずはPCの使い方から学びなさい。
プログラミングどころじゃない、それ以前の話です。
取り敢えずPCのマニュアル読むなり、この辺

https://www.amazon.co.jp/gp/bestsellers/books/525594

の本を本屋で買いなさい。

/// ここから

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

#define BUF_SIZE 2048

int read(void);
int get_absolute_value(int number);

int main(void) {
 printf("絶対値 : %d\n", get_absolute_value(read()));
 return 0;
}

int read(void) {
 char buffer[BUF_SIZE];
 fputs("整数入力 --> ", stdout);
 fgets(buffer, BUF_SIZE, stdin);
 return atoi(buffer);
}

int get_absolute_value(int number) {
 return abs(number);
}

/// ここまで

あとね、また「stdio.hだけで」とか言うのもナシね。
(写真には)問題にそんな要求は書いてないし、ハッキリ言って、

「Cの標準ライブラリに添付されてある」

関数(stdlib内abs関数)使えば済むモノを、わざわざ「再実装してぇ!」、とか言う人もいませんよ。

あ、あと。
出来れば中学校の数学の本も買った方が良いですね。
この辺から買って読むべきでしょう。

https://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=カタカナ&url=search-alias%3Dstripbooks&field-keywords=中学校+数学&rh=n%3A465392%2Ck%3A中学校+数学

こんなのプログラミングの問題でもなくって、中学校1年生の数学の話ですよ。

しかも、まだPCの使い方分かってないし・・・・・。

何で横向けでの写真投稿なんですか。
「相手が見づらい」って思わないんですか。
少なくとも「モノを教わろう」って人間の態度じゃないんですよ。

確かにプログラム書くのはメンド臭いし、やりたくないのも分かる。
しかし「貴方が面倒くさい」って思うモノは他人も(たとえプロのプログラマでも)「面倒くさい」んですよ。
その「面倒くさい」事を他人に頼むのなら、少なくとも「写真は縦でそのまま見れる」ようにすべきです。
こんな横向きで見づらい写真を投...続きを読む

QC++の乱数に関して

C++の乱数に関する質問です。


最初に1~100の乱数を1ことり、
二番目に、最初に得られた値以外の1~100の乱数を1ことり、
三番目に、最初と二番目に得られた値以外の1~100の乱数を1ことり、
・・・・・・・
100番目に最後に残った乱数で選ばれていない値は1個となるので
1番目から99番目で得られた乱数を見れば、
100番目の乱数が予想できる。

この様な乱数はどの様にすれば得られるでしょうか。

Aベストアンサー

やり方はいくつかありますが

一番シンプルなのは
最初に1~100の乱数を1ことり、配列に格納
二番目に、1~100の乱数を1ことり、
 それが既に配列にあればもう一度取得しなおす
 配列になければ配列に格納
三番目に、1~100の乱数を1ことり
 それが既に配列にあればもう一度取得しなおす
 配列になければ配列に格納

他には

最初に1~100の数値を入れた配列を準備
取得するごとに消していく

他には

最初に1~100の乱数を1ことる
二番目に、1~99の乱数を1ことるが、最初にとったものより大きい場合は+1
三番目に、1~98の乱数を1ことるが、すでに取っているものと比べて1つより大きければ+1、2つより大きければ+2

QC++ : cout << (数字) で実行時エラーが発生する理由

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}



---------------------------------------------------------


エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。

このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。

この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。
コード全体はこの下に掲載します。

cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。




全コード
------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;

void rev_str(char *a);
void rev_str(const char *source, char *des);

int main()
{
char a[80], b[80];
strcpy(a, "hello, world!");
rev_str(a, b);
rev_str(a);
cout << a << "\n";
cout << b << "\n";

return 0;
}

void rev_str(char *a)
{
int length = 0;

cout << length;

while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}

void rev_str(const char *source, char *des)
{
char *a = (char*)malloc(sizeof(source));
strcpy(a, source);
rev_str(a);
strcpy(des, a);
free(a);
}

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for...続きを読む

Aベストアンサー

> void rev_str(const char *source, char *des)
> {
>  char *a = (char*)malloc(sizeof(source));
>  strcpy(a, source);
>  rev_str(a);
>  strcpy(des, a);
>  free(a);
> }
の中でmallocで確保されるサイズは sizeof(source)なので
char型のポインタサイズ ... 32Bit環境なら4バイトってことになります
その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます

NULL終端の文字列が対象なら
char *a = (char*)malloc( strlen( source ) );
といった具合に変更してみましょう

Qポケモン 乱数調整

ポケモンの乱数調整をやり始めようかな、なんて思ってます。 僕はLightユーザーで友人が言うには乱数調整はやりやすいそうです。しかしやり方が載ったサイトを見るととてもややこしそうで「こんなん俺にできるんか??」と少し不安になっています。

僕はそこまでパソコンに詳しくなく、どちらかというと不器用です。

こんな僕でも出来るでしょうか?
具体的には孵化乱数と、野生乱数、出来れば色乱数もやってみたいです!

Aベストアンサー

・パソコンに詳しくないことと乱数調整はほとんど関係ありません。お持ちのパソコンがツールに対応していない、などではない限り。

・ご友人はBWを前提に仰ってると思います。BWなら確かに比較的やさしいと思います。
ただ、ややこしそうだとお思いなのもわかります。でもBWならサイトを見ながら一つ一つ確実にやっていけばできると思います。
BW2も同じようなものですが、こちらはタイマーずれがひどいので最初はBWのほうがいいかと。

・いきなり孵化乱数や野生乱数ではなく、まずは固定シンボル乱数や配達員乱数からのほうがとっつきやすいでしょう。
全く初めてなら固定シンボルの乱数調整ができるようになってからがいいと思います。

・ハードは何でしょう。乱数調整する場合できれば初代DSかDSLiteがいいのです。ライト(Light)ユーザーとお書きですが、ハードの意味ではなく、ポケモン廃人ではないよの意味に受け取ったのですが。

・色乱数は裏IDが判明しなければできません。



ご友人が乱数調整なさっておられるのでしたらある程度は教われるのではないでしょうか?

Q処理の実行と平行した時間の計測。計測結果による切り替え判断になります

C++で次のようなソースを書こうと考えていますが、
全くに、具体的なやり方のイメージが出てこず、
アドバイスいただきたく思い、
質問させてもらうことにしました。

===========================
(A)

(B) ある検索処理が実行される

(C)

(D)

(E)
===========================

(B)がいくらか処理時間の要する内容なのですが、
(B)を実行している際に、
決められた一定の時間が経過した場合は、
進行中の(B)の処理を中断し、
(D)へ飛んでしまいたいと思っています。


(B)の処理が開始された段階で、
時間の計測も平行し実行され、
その経過時間が、
例えば10秒を超えてしまった段階で、
すぐに、(B)を中断し、
(D)に実行処理を移動させる感じです。

分からないだけに、
適切なキーワードが悪かったりするのか、
意図するページを検索することが出来ず、
質問させていただきます。

参考になるソースでも解説でも、
何でも結構ですので、
アドバイスいただけると、
大変ありがたい次第です。

開発環境はFedora9です。
どうぞ宜しくお願い致します。

C++で次のようなソースを書こうと考えていますが、
全くに、具体的なやり方のイメージが出てこず、
アドバイスいただきたく思い、
質問させてもらうことにしました。

===========================
(A)

(B) ある検索処理が実行される

(C)

(D)

(E)
===========================

(B)がいくらか処理時間の要する内容なのですが、
(B)を実行している際に、
決められた一定の時間が経過した場合は、
進行中の(B)の処理を中断し、
(D)へ飛んでしまいたいと思っています。


(B)の処...続きを読む

Aベストアンサー

Fedoraということはgccですね。

基本的な方法は2通り。
1. (B)内で、time(2)等利用して、時間を意識しつつループを行う。
2. シグナルを利用する

っていうことで、
おすすめは 1. 一般的には、alarm(2)が簡単ではないかなと。

あとは、マルチスレッドにして、select(2)と混ぜるなんて技もあるかもしれませんが、
いろいろあるので、まずはalarm()で、シグナルについて調べるところから
やるとよいと思います。

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man2/alarm.2.html


人気Q&Aランキング

おすすめ情報