電球を取り換えるだけで家族を見守る

行列内の行の交換,列の交換を行うプログラムを作成しています.
http://www.math.meiji.ac.jp/~mk/lecture/ouyousuu …
のページにある方法で行交換はすることができたのですが,列交換をする方法がわかりません.
上のサイトのやり方を改造して,どうにか列交換をすることはできないのでしょうか?
分かる方おられましたら回答ください.
よろしくお願いします.

A 回答 (1件)

要素を1つ1つ交換するしかないと思います。


行の方は参照時に行管理用のポインタを通してアクセスしているので、ポインタを入れ替えるだけですみますが、
列の方はそのような構成になっていないので要素ごとに処理する必要があります。
行列の実装方法を変えれば列の交換もスムーズにできるようにはなりますが、
そのようにしてしまうと、現在のような2次元配列ライクな記法はできなくなりますし、
要素にアクセスする際の無駄が増えますので、用途を限定しない場合にはやめた方が良いでしょう。

それから、エラー処理が少し甘いですね。
new_matrix()内のabody=malloc()の部分で失敗した場合、行の管理用に確保したメモリ(a=malloc())が解放されませんので。
この可能性を無視する、というのなら、せめて要求メモリサイズの大きいabodyの方を先に確保する方が良いでしょう。
    • good
    • 1
この回答へのお礼

要素を一つ一つ交換する方法で,列交換をすることにしました.
かなり大きな行列を用いるため,少し不安が残りますが…。
回答ありがとうございました.

お礼日時:2002/04/04 15:51

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Q整数型配列と2次元文字型配列の入れ替え方

以下のプログラムを実行結果のように作りたいのですがexchange_numberの中身の書き方(配列の入れ替え方)が分らないので教えて下さい。

#include<stdio.h>
#define M 10
#define N 5
void sort_score(int score_cpy[M]);
int linear_search(int score_cpy[M],int key);
void exchange_number(int order[M],char number[M][N]);
int no;
int main(void)
{
int i,number[M][N],score[M],score_cpy[M],order[M];
printf("人数を入力して下さい:");
scanf("%d",no);
("学生番号と平均点を入力して下さい。");
for(i=0;i<M;i++){
printf("学生番号:");
scanf("%s",&number[i][N]);
printf("得点:");
scanf("%d",&score[i]);
}
for(i=0;i<=M;i++)
score_cpy[i]=score[i];

sort_score(score_cpy);
for(i=0;i<M;i++){
order[i]=linear_search(score_cpy,score[i]);
}
exchange_number(order,number);
printf("\n\n得点の高い順に並び替えて表示します\n\n");
for(i=0;i<no;i++)
printf("学生番号 :%s %d点\n",number[i],score_cpy[i]);
return 0;
}

void sort_score(int score_cpy[M])
{
int i,j,score;
for(j=0;j<no-1;j++){
for(i=no-1;i>0;i--){
if(score_cpy[i-1]<score_cpy[i]){
score=score_cpy[i-1];
score_cpy[i-1]=score_cpy[i];
score_cpy[i]=score;
}
}
}
}

int linear_search(int score_cpy[M],int key)
{
int i;
for(i=0;i<no;i++){
if(score_cpy[i]==key){
return i;
}
}
return -1;
}

void exchange_number(int order[M],char number[M][N])
{?}

ちなみに実行結果は以下の通りです。

人数を入力して下さい:10
学生番号と平均点を入力して下さい。
学生番号:y3051 得点:85
学生番号:y3052 得点:65
学生番号:y3053 得点:75
学生番号:y3054 得点:63
学生番号:y3055 得点:95
学生番号:y3056 得点:68
学生番号:y3057 得点:80
学生番号:y3058 得点:90
学生番号:y3059 得点:83
学生番号:y3060 得点:70
得点の高い順に並び替えて表示します
学生番号:y3055 95 点
学生番号:y3058 90 点
学生番号:y3051 85 点
学生番号:y3059 83 点
学生番号:y3057 80 点
学生番号:y3053 75 点
学生番号:y3060 70 点
学生番号:y3056 68 点
学生番号:y3052 65 点
学生番号:y3054 63 点

プログラム中で間違えがありましたら指摘して頂けると幸いです。それで良いお待ちしております。

以下のプログラムを実行結果のように作りたいのですがexchange_numberの中身の書き方(配列の入れ替え方)が分らないので教えて下さい。

#include<stdio.h>
#define M 10
#define N 5
void sort_score(int score_cpy[M]);
int linear_search(int score_cpy[M],int key);
void exchange_number(int order[M],char number[M][N]);
int no;
int main(void)
{
int i,number[M][N],score[M],score_cpy[M],order[M];
printf("人数を入力して下さい:");
scanf("%d",no);
("学生番号と平均点を入力...続きを読む

Aベストアンサー

 いやいや、ひねくれた例題ですね。間違い箇所が多く見られ、実際にまだコンパイルはされていないようですよね。レポートは明日までとのことですので参考に...。
 ここでの一番の問題は、なぜ「void exchange_number(int order[M],char number[M][N]);」関数を作らなければいけないかの疑問です。結果は、ソート降順に行われることから、次の for() ループでは
 order[i]=linear_search(score_cpy,score[i]);
の学生番号順にソート順番が何番であるかを求めるのではなく、
 order[i]=linear_search(score,score_cpy[i]);
のソート結果に対して何番の学生番号が該当するのかのプログラム内容とならなければなりません。事例ではわざとかく乱させて、ご要望の関数を作らないとさも答えが出ないような内容になっています。例題は考えられています。
 回答は、平均点が重なってもきちんと表示されるように「 signed char flag[M];」を追加してみました。したがって、要望の関数は不要です。とりあえず、動くかどうか試してみてください。



#include<stdio.h>
#define M 10
#define N 8// 余裕を持たせましょう。

void sort_score(int score_cpy[]);
int linear_search(int key, int score[], signed char flag[]);

int no;

int main(void) {
int i,score[M],score_cpy[M],order[M];
char number[M][N];
signed char flag[M];

printf("人数を入力して下さい:");
scanf("%d",&no);
("学生番号と平均点を入力して下さい。");
for(i=0;i<no;i++) {
printf("学生番号:");
scanf("%s",number[i]);
printf("得点:");
scanf("%d",&score[i]);
}

for(i=0;i<no;i++) {
score_cpy[i]=score[i];
flag[i] = 0;
}
sort_score(score_cpy);
for(i=0;i<no;i++)
order[i]=linear_search(score_cpy[i], score, flag);
printf("\n\n得点の高い順に並び替えて表示します\n\n");
for(i=0;i<no;i++)
printf("学生番号 :%s %d点\n", number[order[i]],score_cpy[i]);

return 0;
}


void sort_score(int score_cpy[]) {
int i,j,score;
for(j=0;j<no-1;j++) {
for(i=no-1;i>j;i--) {
if(score_cpy[i-1]<score_cpy[i]) {
score=score_cpy[i-1];
score_cpy[i-1]=score_cpy[i];
score_cpy[i]=score;
}
}
}
}


int linear_search(int key,int score[], signed char flag[]) {
int i;
for(i=0;i<no;i++) {
if(key == score[i] && flag[i] == 0) {
flag[i] = -1;// 重複を回避する
break;
}
}
return i;
}

 いやいや、ひねくれた例題ですね。間違い箇所が多く見られ、実際にまだコンパイルはされていないようですよね。レポートは明日までとのことですので参考に...。
 ここでの一番の問題は、なぜ「void exchange_number(int order[M],char number[M][N]);」関数を作らなければいけないかの疑問です。結果は、ソート降順に行われることから、次の for() ループでは
 order[i]=linear_search(score_cpy,score[i]);
の学生番号順にソート順番が何番であるかを求めるのではなく、
 order[i]=linear_search(sco...続きを読む

QC# 行列の入替

今,マトリックスを作成しこのマトリックスの配列を行列入替ようとしています.

ネットで調べた結果下記の方法が見つかりましたが,使用方法が良く解りません.

http://msdn.microsoft.com/ja-jp/library/bb199546(v=xnagamestudio.40)

現状,元のマトリックスはcsv.matrix 入替後のマトリックスはNewmatrixという名前のマトリックスに

格納したいと考えております.

どの様にすれば良いか本当にご教授お願いたします.

Aベストアンサー

プログラムの先頭に
using Microsoft.Xna.Framework;
を追加しておいて、
Matrix.Transpose(csv.matrix, Newmatrix);
とすればよいのではありませんか。

Q数字の入った配列をファイルへ出力。

今、hist[256]というint型の配列に数字が入っているとします。
これを、テキストファイルに出力して、

0
242
5654
232
3123
756



こんな感じで、ファイルに出力したいです。

文字としての出力になるのでhist[256]配列を、int型からchar型に変換しないとダメでしょうか?
また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね?
もっと大きい数字も入っているので何とかする方法も教えて下さい。

初歩的な質問で申し訳ありませんが、よろしくお願いします。

Aベストアンサー

fprintf()関数を使えば簡単です。
簡単に言えば、printf()関数のファイル出力版です。
画面ではなく、ファイルに文字列を出力します。

サンプル
------------------------
FILE *fp;
int i;
if((fp = fopen("data.txt", "w")) != NULL){
 for(i = 0; i < 256; i++){
  if(fprintf(fp, "%d\n", hist[i]) < 0){
   //書き込みエラー
   break;
  }
 }
 fclose(fp);
}else{
 //ファイルオープンエラー
}
------------------------

%d で int型の整数を文字として表示、
\n で改行です。printf()関数と同じですね。

#サンプルはインデントに全角スペースを使っています。

-----------------------------------------------------------
>int型からchar型に変換しないとダメでしょうか?
>また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね?

ちょっと勘違いしているようなので、説明しますが・・・

C言語の文字列は、文字の配列です。
char型は1文字を表わします。
文字列は、char型の配列になります。

例えば、整数の 123 を文字列で表現する場合、
文字数は3文字で、終端にヌル文字('\0')が入りますので、
4文字の配列になります。

unsigned char c[] = {'1','2','3','\0'};

一つ一つは文字コード(0~255)ですので、char型で問題ありません。

fprintf()関数を使えば簡単です。
簡単に言えば、printf()関数のファイル出力版です。
画面ではなく、ファイルに文字列を出力します。

サンプル
------------------------
FILE *fp;
int i;
if((fp = fopen("data.txt", "w")) != NULL){
 for(i = 0; i < 256; i++){
  if(fprintf(fp, "%d\n", hist[i]) < 0){
   //書き込みエラー
   break;
  }
 }
 fclose(fp);
}else{
 //ファイルオープンエラー
}
------------------------

%d で int型の整数を文字として表示、
\n で...続きを読む

Q転置行列アルゴリズム

こんにちは。プログラミングを学んでいる学生です。
N*Nのint型の配列を転置するCプログラムでなるべく性能の良いものを書け、という課題が出て、それと同時にシンプルな(性能が悪いと思われる)サンプルが配布されてました。
ですが、それを超えるようなアルゴリズムがどうしても思いつきません。
何かアドバイスいただけたらうれしいです。

配布メソッド:
#define N 64 //Nは64,128,512,...,2048をはかる
typedef int matrix_t[N][N];
void naive_rotate(matrix_t src, matrix_t dst){
  int i,j;
  for(i=0;i<N;i++)
  for(j=0;j<N;j++)
     dst[N-1-j][i]=src[i][j];
return;
}

メソッドの7行目をdst[j][i]にしたらあまり変化ありませんでした。
また、i==Jのときcontinueするようにしたら、逆に遅くなってしまいました。

こんにちは。プログラミングを学んでいる学生です。
N*Nのint型の配列を転置するCプログラムでなるべく性能の良いものを書け、という課題が出て、それと同時にシンプルな(性能が悪いと思われる)サンプルが配布されてました。
ですが、それを超えるようなアルゴリズムがどうしても思いつきません。
何かアドバイスいただけたらうれしいです。

配布メソッド:
#define N 64 //Nは64,128,512,...,2048をはかる
typedef int matrix_t[N][N];
void naive_rotate(matrix_t src, matrix_t dst){
  int i,j;
...続きを読む

Aベストアンサー

 
 "ANo.1"訂正。
void func(int a[][N], int b[][N], int n)
{
int i, j;

for(i = 0; i < n / 2; i ++){
for(j = i; j < n - i - 1; j ++){
b[i][j] = a[j][n - i - 1];
b[j + 1][i] = a[i][n - j - 2];
b[n - i - 1][j + 1] = a[j + 1][i];
b[j][n - i - 1] = a[n - i - 1][n - j - 1];
}
}
if(n % 2) b[n / 2][n / 2] = a[n / 2][n / 2];
}

Qガウスの消去法、後退代入について

ガウスの消去法で、n変数n式の連立一次方程式を解くプログラムを
作っています。
ですが、前進消去およびピボット選択ははおそらくできたのですが
後退代入が悪いのか、答えが出ません。
もしかしたら前進消去部分も悪いのかもしれませんが;;

いろいろ調べたのですが
どうしたら直るのかわからなくなってしまいました。
どのようにして直せばいいのか教えてください。

プログラムは以下です。


#include<stdio.h>
#include<math.h>
#define SIZE 100/*上限MAXのマクロ定義*/
#define EPS (1.0e-5)

int main()
{
/*変数宣言*/
int n; /*連立方程式の式数*/
int i; /*1つ目のループカウンタ*/
int j; /*2つ目のループカウンタ*/
int k;/*3つ目のループカウンタ*/
int pivot; /*pivot選択を行う際に使用する変数*/
double max; /*pivot選択用の絶対値が最大の値*/
double matrix_a[SIZE][SIZE]; /*変数xijの係数aij*/
double matrix_b[SIZE]; /*式iの定数項bi*/
double a_hozon;/*matrix_aの値を一時保存する変数*/
double b_hozon;/*matrix_bの値を一時保存する変数*/
double r_hozon;/*前進消去法をする時使用する値を一時保存する変数*/
int l;
int m;

/*入力処理*/
/*未知数nの入力*/
printf("n変数n式の連立一次方程式を解きます。\n");
printf("式数n(1~100)を入力してください。 n=?\n");
scanf("%d",&n);
/*未知数nのチェック*/
if(n>SIZE||n<1)
{
printf("\n\nn=%dはプログラムの利用可能範囲外です。\n",n);
return -1;
}

printf("%d変数%d式の一次方程式を入力して下さい。\n",n,n);
printf("入力は、式毎に係数、定数項の順に行ってください。\n\n");

printf("連立一次方程式の拡大係数行列を表示します。\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%lf",&matrix_a[i][j]);

}
scanf("%lf",&matrix_b[i]);

}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%6.2f",matrix_a[i][j]);
}
printf("|%6.2f\n",matrix_b[i]);
}

printf("計算します。\n");

/*pivot選択*/
for(k=0; k<n; k++)
{
max=0.0;
pivot=0;
for(i=k; i<n; i++)
{
if(fabs(matrix_a[i][k])>max)
{
max=fabs(matrix_a[i][k]);
pivot=i;
}
}
if(matrix_a[pivot][k]==0.0)
{
printf("正則性なし\n");
}
if(pivot!=k)
{
for(j=0; j<n; j++)
{
a_hozon = matrix_a[k][j];
matrix_a[k][j] = matrix_a[pivot][j];
matrix_a[pivot][j] = a_hozon;
}
b_hozon = matrix_b[k];
matrix_b[k] = matrix_b[pivot];
matrix_b[pivot] = b_hozon;
}

}

/*入れ換え後の行列を表示*/
for(l=0; l<n; l++)
{
for(m=0; m<n; m++)
{
printf("%6.2f",matrix_a[l][m]);
}
printf("|%6.2f\n",matrix_b[l]);
}




/*消去法*/

for(k=0; k<n; k++)
{
for(i=k+1; i<n-1; i++)
{
r_hozon = matrix_a[i][k]/matrix_a[k][k];
for(j=k; j<n; j++)
{
matrix_a[i][j] = matrix_a[i][j]-r_hozon*matrix_a[k][j];
}
matrix_b[i] = matrix_b[i]-r_hozon*matrix_b[k];
}
}

/*後退代入*/

for(i=n-1; i>=0; i--)
{
matrix_b[i]=0.0;
for(j=i+1; j<n; j++)
{
matrix_b[i]=matrix_b[i]-matrix_a[i][j]*matrix_b[j];
}
}
/*
for(i=n-1; i>0; i--)
{
temp = 0.0;
for(j=i+1; j<n; j++)
{

xn = b[n]/a[n][n];
xn-1 = (-a[n-1][n]*x[n]+b[n-1])/a[n-1][n-1];
xn-2 = (-a[n-2][n-1]*x[n-2]+a[n-2][n]*x[n]+b[n-2])/a[n-2][n-2];

xn-j = (-a[i][n-j]*x[i+1]+b[i])/a[i][i];

temp = matrix_a[][]

temp=temp+matrix_a[i][j]*matrix_a[j][n];
matrix_a[i][n]=matrix_a[i][n]-temp;
matrix_a[i][n]=matrix_a[i][n]/matrix_a[i][i];
}

}
*/

/*不定、不能の判別*/
if(matrix_a[k][k]<EPS)
{
printf("解は一意に求まらない。\n");
return -1;
}


/*出力処理*/
printf("連立一次方程式の解を表示します。\n");
for(i=0; i<n; i++)
{
printf("x%d = %6.2f\n",i,matrix_b[i]);
}

return 0;
}

ガウスの消去法で、n変数n式の連立一次方程式を解くプログラムを
作っています。
ですが、前進消去およびピボット選択ははおそらくできたのですが
後退代入が悪いのか、答えが出ません。
もしかしたら前進消去部分も悪いのかもしれませんが;;

いろいろ調べたのですが
どうしたら直るのかわからなくなってしまいました。
どのようにして直せばいいのか教えてください。

プログラムは以下です。


#include<stdio.h>
#include<math.h>
#define SIZE 100/*上限MAXのマクロ定義*/
#define EPS (1....続きを読む

Aベストアンサー

/*後退代入*/
の4行後の
matrix_b[i]=0.0;
を取り除かなければいけないのではありませんか。

QC言語の2次元配列における行・列指定

C言語初心者ですがよろしくお願いします。

C言語では、例えばint型の3行4列の2次元配列を表現するときに、
int array[3][4];
とするようですが、
必ず1つ目の[ ]で行番号を、2つ目の[ ]で列番号を表さなければならないものなのでしょうか。
もし慣習的にそうしているものなら、
行と列を指定する[ ]を入れ替えてプログラムを作成しても問題ないのでしょうか?

というのも、メモリ上の割り当てが、
array[0][0]
array[0][1]
array[0][2]
array[0][3]
array[1][0]
array[1][1]
array[1][2]
...
...
...
array[2][2]
array[2][3]
のようになるなら、
その配列をfwrite関数でバイナリデータに書きこんで、再度、列方向に読み込みたい時に、
あらかじめ書きこむ前のデータをarray[列][行]の形で扱っていった方が便利ではないかと思ったのですが、なにか初歩的な勘違いしてたりしますでしょうか?


ご教授お願いします。

Aベストアンサー

もちろん「数学的には非常識」であっても, そうする十分な理由があればそれを押し通せばいいということになります. たとえば, メモリ上での配置は質問文に書かれているようになっているので,
「行と列を逆にした方が (キャッシュなどの関係で) 効率的にアクセスできる」
ということであればそれも 1つの見解でしょう. 本当に効率的かどうかは知りませんが.

Qエクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む

QC言語のプログラムが実行できません。

C言語のプログラムが実行できません。

コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。

これは何のエラーなんでしょうか?
基本的な事かもしれませんが、分かる方宜しくお願い致します。

Aベストアンサー

僕も何度も出したなぁ。

ひとくちにSegmentation faultといっても、それこそさまざまな要因があるので、
これだけで原因を突き止めるのは非常に難しいです。

コンパイルはあくまで文法としてみているだけであり、
処理の流れ、メモリ確保など、プログラムそのものを見ているわけではありません。
このエラーが出るのは文法などよりもっと上位の原因なのです。
たとえばですが。
長さ10の配列があったとして、11番目以降を参照したりすると、
そういうのが出たような気がします。

ですから、変数があれば、その内容をprintf文で逐一出していき、
変な値が入っていないとか、少しずつ直していくしかないと思います。

QC言語で簡単なゲームを作る方法

僕はC言語を学び始めた程度ですが、一番簡単に作れるゲームとその作り方(ソース)を教えて下さい。お願いします。

Aベストアンサー

★じゃんけんゲームのソースです。

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

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP_KATI : TYP_MAKE);
  case JKN_CHOKI:  return ((computer == JKN_PA) ? TYP_KATI : TYP_MAKE);
  case JKN_PA:  return ((computer == JKN_GOO) ? TYP_KATI : TYP_MAKE);
  default:   return -1;
 }
}

// じゃんけんゲーム
int main( void )
{
 // ゲーム変数
 int count;  // 勝負回数
 int kati = 0; // 勝ちカウンタ
 int make = 0; // 負けカウンタ
 // 一時変数
 int human;  // キー入力の一時変数(人間用)
 int computer; // 乱数発生の一時変数(コンピュータ用)
 
 // (6)じゃんけん勝負を10回行う
 printf( "★じゃんけんゲーム(10回勝負)\n\n" );
 for ( count = 1 ; count <= 10 ; count++ ){
  // (1)人間:3つの状態を入力
  printf( "%2d回目…[1]グー [2]チョキ [3]パー を入力して下さい:", count );
  do {
   // (2)キー入力
   switch ( getche() ){
    case '1': human = JKN_GOO; break;
    case '2': human = JKN_CHOKI; break;
    case '3': human = JKN_PA; break;
    default: human = -1; break;
   }
  } while ( human == -1 );
  
  // (3)コンピュータ:3つの状態を乱数で決める
  computer = (rand() % 3);
  // (4)人間vsコンピュータの勝負
  switch ( check(human,computer) ){
   case TYP_KATI:
    kati++;
    printf( "⇒勝ち。\n" );
    break;
   case TYP_MAKE:
    make++;
    printf( "⇒負け。\n" );
    break;
   case TYP_AIKO:
    printf( "⇒引き分け。\n" );
    break;
   default:
    printf( "⇒エラー。\n" );
    break;
  }
 }
 // (7)結果表示
 printf( "\n★じゃんけんゲームの結果\n" );
 printf( "人間    :%d 回勝ち\n", kati );
 printf( "コンピュータ:%d 回勝ち\n", make );
 printf( "※引き分け回数は %d 回でした。\n", (10 - kati - make) );
 return 0;
}

注意:全角空白をタブ文字に変換して下さい。

★じゃんけんゲームのソースです。

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

// じゃんけん定数
#define JKN_GOO  (0)
#define JKN_CHOKI (1)
#define JKN_PA  (2)

// 勝敗の定数
#define TYP_KATI (0)
#define TYP_MAKE (1)
#define TYP_AIKO (2)

// じゃんけんの判定関数
int check( int human, int computer )
{
 if ( human == computer ){
  return TYP_AIKO;
 }
 switch ( human ){
  case JKN_GOO:  return ((computer == JKN_CHOKI) ? TYP...続きを読む

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。


人気Q&Aランキング

おすすめ情報