• 締切済み

8パズル

C++のプログラミングの勉強をしています。 ネットなどを利用して勉強してるところなんですが、わからないところがあります。 8パズルの探索プログラムなんですがネットで見つけたものは初期値が最初から入ってるものでした。 自分で入力して実行したいのですがそれがうまくいきません。 読み込んでるつもりなのですがメモリに記憶されてないみたいです。 変数がメイン文の中にない場合の入力がわかってないからできないのだと思います。 どなたか下のプログラムを最初に自分で値を入力する方法を教えていただけないでしょうか?? #include <stdio.h> #include <string.h> #include <time.h> #define TRUE 1 #define FALSE 0 #define GOAL 2 #define SIZE 9 /* 状態数 (9! / 2) */ #define MAX_STATE 181440 /* 隣接リスト */ const char adjacent[SIZE][5] = { 1, 3,-1,-1,-1, 0, 4, 2,-1,-1, 1, 5,-1,-1,-1, 0, 4, 6,-1,-1, 1, 3, 5, 7,-1, 2, 4, 8,-1,-1, 3, 7,-1,-1,-1, 4, 6, 8,-1,-1, 5, 7,-1,-1,-1, }; /* キュー */ char state[MAX_STATE + 1][SIZE]; /* +1 はワーク領域 */ char space_postion[MAX_STATE]; int prev_state[MAX_STATE]; /* 同一局面チェックテーブル */ char check_table[MAX_STATE * 2]; /* 初期状態 */ char init_state[SIZE] = { 8, 6, 7, 2, 5, 4, 3, 0, 1 }; char final_state[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 0 }; /* 結果を出力 */ void print_answer( int n ) { int i, j; if( n != 0 ) print_answer( prev_state[n] ); for( i = 0; i < 3; i++ ){ for( j = 0; j < 3; j++ ){ printf("%d ", state[n][i * 3 + j] ); } printf("\n"); } printf("\n"); } /* 番号に変換 */ int change_number( char *board ) { char work[SIZE]; static int fact_table[SIZE] = { 40320, 5040, 720, 120, 24, 6, 2, 1, 0, }; int j, k, value = 0; memcpy( work, board, SIZE ); for( j = 0; j < SIZE - 1; j++ ){ value += fact_table[j] * work[j]; for( k = j + 1; k < SIZE; k++ ){ if( work[j] < work[k] ) work[k]--; } } return value; } /* 探索 */ void search( void ) { int front = 0, rear = 1; /* 初期化 */ memcpy( state[0], init_state, SIZE ); space_postion[0] = 7; prev_state[0] = -1; check_table[ change_number( init_state ) ] = TRUE; check_table[ change_number( final_state ) ] = GOAL; /* キューにデータがある間繰り返す */ while( front < rear ){ int s = space_postion[front]; int i, k, n; for( i = 0; (n = adjacent[s][i]) != -1; i++ ){ /* 状態をコピー */ memcpy( state[rear], state[front], SIZE ); /* 移動 */ state[rear][s] = state[rear][n]; state[rear][n] = 0; space_postion[rear] = n; prev_state[rear] = front; k = change_number( state[rear] ); if( check_table[k] == GOAL ){ /* 発見 */ print_answer( rear ); printf("状態数 %d 個\n", rear ); return; } else if( !check_table[k] ){ /* キューに登録 */ check_table[k] = TRUE; rear++; } } front++; } } int main() { int start, end; /* * 静的変数が 0 に初期化される場合は不用だが * 初期化することは悪いことではない。 */ memset( check_table, 0 , MAX_STATE * 2 ); start = clock(); search(); end = clock(); printf("時間 %d \n", end - start ); return 0; }

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス >ネットなどを利用して勉強してるところなんですが、わからないところがあります。 >8パズルの探索プログラムなんですがネットで見つけたものは初期値が最初から入ってるものでした。  ↑  参考にしているサイトのURLを載せて欲しいですね。 >読み込んでるつもりなのですがメモリに記憶されてないみたいです。  ↑  これはどんな感じで読み込んで、どう確認しましたか?  ソースを見ると adjacent、init_state の2つを初期化しないといけない気がします。  回答者 No.1 さんも init_state については触れていますが、adjacent の配列情報も  必要な気がしますけど?ここの配列情報は初期化しましたか? ・コメントによると『隣接リスト』となっていますから init_state と一緒に adjacent の  情報も必要だと思います。まずは参考にしているというサイトのURLを教えて下さい。  そうしないと0~8、-1の意味が分かりません。 ・以上。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

> 入力するためのコードはいろいろ自分なりにやったつもりです。 まさにその箇所を見せてくださると、もしも正しくない箇所があれば 指摘できるかもしれないのですけれど。 「いろいろやってみた」だけですと、結局今どういう状況で うまくいっていないかが伝わらないのです。

tachikoma0
質問者

補足

メイン文の中に scanf("%s",&init_state); を入れたり、上のほうでchar init_stateを定義してるところで同じくscanfで読み込んでみましたができませんでした。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

> 自分で入力して実行したいのですがそれがうまくいきません。 init_state[]にご自分で入力したい、ということでしょうか? > 読み込んでるつもりなのですがメモリに記憶されてないみたいです。 その、読み込んでいるつもりのコードを提示してみる、 というお考えはありますか?

tachikoma0
質問者

補足

はいinit_state[]に自分で入力したいというとです。 入力するためのコードはいろいろ自分なりにやったつもりです。 メイン文にscanf文を書いて読み込もうとしたり、init_state[]を定義している文の次の行にscanfを書いたりということはやりました。 メイン文で定義した変数しか暑かったことが無いのでこのようなプログラムはわからないのです。

関連するQ&A

  • for 文における処理の改善(C言語プログラム)

    はじめまして。panicdjです。 いまCでプログラムを組んでいます。 環境はVC++ver6.0 Win32 Console Applicationです。 以下のプログラムを見てください。 #define X_MAX 10 #define Y_MAX 20 #define Z_MAX 5 int main(int argc , char ** argv) { int i, j, k; int aa[10][20][5]; for (i = 0; i < X_MAX; i ++) { for (j = 0; j < Y_MAX; j ++) { for (k = 0; k < Z_MAX; k ++) { aa[i][j][k] = 10.0; } } return 0; } 過去のスレッドでポインタ型によるアクセスを すれば、処理が高速になるとかかれていました。 自分は,for文による繰り返す処理ではなく, その「ポインタ型によるアクセス」を実装したいのです。 こんな私にアドバイスお願い致します。

  • 3次元配列でのポインタ

    唐突ですみません。 サイズが640*480の画像を180枚読み込むプログラムをポインタを使って作成しようと考えています。 以下で示すプログラムは画像を読み込むための作成したものですが、エラーが出てしまい実行することができません。 間違えている箇所があればご指摘お願いします。 また、そのほかに効率の良いやり方などがありましたらご教授願います。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define xsize 640 #define ysize 480 #define round 180 #include "Input.h" void Input_task(unsigned char ***In); void main() {   static unsigned char ***In;   int i,j;   In=(unsigned char***)malloc(sizeof(unsigned char)*round);   for(i=0;i<round;i++)   {     In[i]=(unsigned char**)malloc(sizeof(unsigned char)*ysize);     for(j=0;j<ysize;j++)     {       In[i][j]=(unsigned char*)malloc(sizeof(unsigned char)*xsize);     }   }   Input_task(In); } Input.hの中身 void Input_task(unsigned char ***In) {   char filename[30];   int i,j,k;   FILE *fp;   for(i=0;i<round;i++)   {     sprintf(filename,"b20_%04d.raw",i);     fp=fopen(filename,"rb");    for(j=0;j<ysize;j++)     {       for(k=0;k<xsize;k++)       {         *(*(*(In+i)+j)+k)=(unsigned char)getc(fp);       }     }    fclose(fp);   } }

  • C言語 エンキューの問題について

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_QUEUE_LENGTH 11 // キューに用いる配列の⻑さ #define N 50 //乱数の範囲 typedef struct queue { int array[MAX_QUEUE_LENGTH]; int front; int rear; } Queue; Queue *init_queue() { printf("initialize queue\n"); Queue *queue = malloc(sizeof(Queue)); queue->front = 0; queue->rear = 0; return queue; } void print_test(char *line) { printf("-------------\n"); printf("test: %s\n", line); } void print_front_and_rear_index(Queue *queue) { // キューの front と rear を表示する関数 printf("front:%2d, rear:%2d\n", queue->front, queue->rear); } void print_queue(Queue *queue) { // キューの要素を front から rear まで表示する関数 } void enqueue(Queue *queue, int value) { // エンキューする関数 } void enqueue_test_items(Queue *queue, int n) { for (int i = 0; i < n; i++) { int score = rand() % N; enqueue(queue, score); } } void test_enqueue(Queue *queue) { print_test("print empty queue"); print_queue(queue); print_test("enqueue 10 items"); enqueue_test_items(queue, 10); print_test("print queue"); print_queue(queue); print_test("enqueue a item to full queue"); enqueue(queue, -1); } int main(void) { srand((unsigned)time(NULL)); // 乱数の初期化 Queue *queue = init_queue(); // キューの初期化 test_enqueue(queue); } 以下の雛形に従い,リングバッファによるキューに対して,エンキューする関数 enqueue を実装せよ. 関数 print_front_and_rear_index は,キューの front と rear を表示するための関数である. 問題に対する解答には不要であるがデバッグのために用意した. という問題なのですが関数print_queueは出来ましたが関数queueの中身がわかりませんので良ければ解答をお願いします。 自分が書いた関数print_queueは下に置いておきます 実行結果は数字以外は画像の通りになります。 void print_queue(Queue *queue) { if (queue->front == queue->rear) { printf("queue is empty\n"); } else { for (int i = queue->front; i % MAX_QUEUE_LENGTH != queue->rear; i++) { printf("queue[%2d]: %2d\n", i % MAX_QUEUE_LENGTH, } } }

  • プログラムのことで

    次のプログラムの変数の説明と処理の流れを素人でも理解できるように説明してもらえないでしょうか。 #include <stdio.h> #define MAX 128 int str_comp(char nx[], char ny[]){ int i, j, k=0; for(i=0; i<=MAX; i++){ if( nx[i]=='\0' ){ return 0; } else if( nx[i]==ny[0] ){ for( j=0; nx[i]==ny[j]; j++ ){ i++; } if( ny[j]=='\0' ){ return 1; } } } } int main(void) { char namex[MAX}; char namey[MAX}; int n; int i; printf("文字列x(64文字まで)? "); scanf("%s",namex); printf("文字列y(64文字まで)? "); scanf("%s",namey); n=str_comp(namex,namey); if(n==1){ printf("'%s'に'%s'は含まれます\n",namex,namey); } else if(n==0){ printf("'%s'に'%s'は含まれません\n",namex,namey); } return 0; } 実効結果 文字列x(64文字まで)? Katatsumuri  文字列y(64文字まで)? ta 'Katatsumuri'に'ta'は含まれます. エラーは出ないはずです。 よろしくお願いします。

  • ソースコードを簡潔に直したいのですが…

    有限積分法(参考 http://www.akita-nct.jp/yamamoto/study/thesis/2005/thesis_namekawa.pdf) を用いて、格子点 ( i, j, k )の磁場成分 Bx, By, Bz をその周辺を囲む電場成分 Ex, Ey, Ez で逐次計算するコードは次のようになります。 for ( i = 0; i < i_max; i++ ) {   for ( j = 0; j < j_max; j++ ) {     for ( k = 0; k < k_max; k++ ) {       Bx [ i ][ j ][ k ] = Ey [ i + 1 ][ j ][ k ] - Ey [ i + 1 ][ j ][ k + 1 ] + Ez [ i + 1 ][ j + 1 ][ k ] - Ez [ i + 1 ][ j ][ k ];       By [ i ][ j ][ k ] = Ez [ i ][ j + 1 ][ k ] - Ez [ i + 1 ][ j + 1 ][ k ] + Ex [ i ][ j + 1 ][ k + 1 ] - Ex [ i ][ j + 1 ][ k ];       Bz [ i ][ j ][ k ] = Ex [ i ][ j ][ k + 1 ] - Ex [ i ][ j + 1 ][ k + 1 ] + Ey [ i + 1 ][ j ][ k + 1 ] - Ey [ i ][ j ][ k + 1 ];     }   } } 電場成分の係数行列 C ( 0, 1, -1 のいずれかをもつ ) を求める必要が生じた、すなわち CCC  E  B CCC * E = B CCC  E  B のような行列計算に変更するため、次のように書き直しましたが係数行列 C を求める部分を簡潔にできませんでした。 for ( i = 0; i < i_max; i++ ) {   for ( j = 0; j < j_max; j++ ) {     for ( k = 0; k < k_max; k++ ) {       for ( x = 0; x < 3; x++ ) {         row = index ( x, i, j, k, i_max, j_max, k_max );         y = ( x + 1 ) % 3;         z = ( x + 2 ) % 3;         if ( x == 0 ) {           C[ row ][ index ( y, i + 1, j,   k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i + 1, j,   k + 1, i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i + 1, j + 1, k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i + 1, j,   k,   i_max, j_max, k_max )] = -1;         }         if ( x == 1 ) {           C[ row ][ index ( y, i,   j + 1, k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i + 1, j + 1, k,   i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i,   j + 1, k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i,   j + 1, k,   i_max, j_max, k_max )] = -1;         }         if ( x == 2 ) {           C[ row ][ index ( y, i,   j,   k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i,   j + 1, k + 1, i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i + 1, j,   k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i,   j,   k + 1, i_max, j_max, k_max )] = -1;         }       }     }   } } int index ( const int d, const int i, const int j, const int k, const int i_max, const int j_max, const int k_max ) {   return ( ( d * i_max + i ) * j_max + j ) * k_max + k; } void Solver ( const int i_max, const int j_max, const int k_max) {   int row, col,     cell_num = i_max * j_max * k_max;   for ( row = 0; row < cell_num; row++ ) {     for ( col = 0; col < cell_num; col++ ) {       B [ row ] += C [ row ][ col ] * E [ col ];     }   } } 添え字計算が多く、非常に複雑なソースコードですが、規則性があるので、 皆様の力をお借りして簡潔に表現したいです。 よろしくお願いします。

  • 式を変更して画像を作りたいです

    以下のプログラムはカラー画像を作成し、MAX_REPEAT回コピーした後、PPMファイルとして出力するものです。 画像作成部分の式を変更し、画像を作ろうと思いますが、アイディアがあれば参考にしたいので教えてください。 簡単でけっこうですから是非お願いします。 gcc -Wall -O2 -DCIP ファイル名でコンパイルします。 PPMファイルはdisplay tmp.ppmで表示します。 convert tmp.ppm tmp.jpgでjpg形式に変換できます。 #include <stdio.h> #include <stdlib.h> #include <math.h> //mathライブラリを利用する場合はコンパイル時に -lm #define MAX_REPEAT 1 //コピー繰り返し回数 #define SIZE 500 //画像サイズ(行=列) #ifdef CSQ #define DIM1 3 #define DIM2 SIZE #define DIM3 SIZE #endif #ifdef CIP #define DIM1 SIZE #define DIM2 SIZE #define DIM3 3 #endif typedef unsigned char UCHAR; void write_ppm_csq(UCHAR [][DIM2][DIM3],char *,int ,int); void write_ppm_cip(UCHAR [][DIM2][DIM3],char *,int ,int); void error1(char *); /* 画像のコピー */ void copy3dimg(UCHAR res[][DIM2][DIM3],UCHAR org[][DIM2][DIM3],int dim1,int dim2,int dim3) { int i,j,k; for(i=0;i<dim1;i++) for(j=0;j<dim2;j++) for(k=0;k<dim3;k++) res[i][j][k]=org[i][j][k]; } int main(void) { int repeat; UCHAR org[DIM1][DIM2][DIM3]; /* 作成画像 */ UCHAR res[DIM1][DIM2][DIM3]; /* コピー先画像 */ /* 画像の作成 */ { int i,j,k; for(i=0;i<DIM1;i++) for(j=0;j<DIM2;j++) for(k=0;k<DIM3;k++) org[i][j][k]=(UCHAR)((i*j+10*j+k*k)%256); } /* 画像のコピー */ for(repeat=0;repeat<MAX_REPEAT;repeat++) copy3dimg(res,org,DIM1,DIM2,DIM3); /* ファイルへの出力 */ #ifdef CSQ write_ppm_csq(res,"./tmp.ppm",DIM3,DIM2); #endif #ifdef CIP write_ppm_cip(res,"./tmp.ppm",DIM2,DIM1); #endif return 0; } /* ファイルへの出力(CSQ) */ void write_ppm_csq(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; int m, n; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ for(m=0;m<height;m++) for(n=0;n<width;n++) { fwrite(&data_buf[0][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[1][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[2][m][n], sizeof(UCHAR), 1, fp); } fclose(fp) ; } /* ファイルへの出力(CIP) */ void write_ppm_cip(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ fwrite(&data_buf[0][0][0], sizeof(UCHAR), width*height*3, fp); fclose(fp) ; } /* エラー処理 */ void error1(char *message) { printf("%s\n",message); exit(1); }

  • 動的メモリの確保の仕方を教えて下さい。

    プログラミングの初心者なのですが、現在256x256x100のバイナリファイルを読み込もうとしているのですが、下のように書くとエラーになってしまいます。動的メモリの確保を行えば、上手くいくと思うのですが。。どなたか教えて頂けないでしょうか?どうぞよろしくお願いします。 const short int SIZE=256; const short int SLICE=100; signed short int matrix[SLICE][SIZE][SIZE]; for(int i=0; i<SLICE; i++){ for(int j=0;j <SIZE; j++){ for(int k=0;k<SIZE; k++){ fin.read((char*) &matrix[i][j][k],sizeof(signed short int)); cout<< matrix[i][j][k]<<endl; } } }

  • 文字列を比較

    文字列を比較して 一つでも一致したらファイルに書き込まず抜ける 一つも一致しなかった場合一度書き込んで抜けるという操作を 下記のコードで実現したいんですけど、 "cPid[n] = cStoRegiAdd; for(j = 0;j < MAX;j++){ if(cPid[n] != cRegiTab[j]){ iflag = 1; } } if(iflag == 1){ fprintf(fh,"#define %s 0\n",cStoRegiAdd); }" の部分で何かおかしいとこはありますか?? もしあれば教えていただきたいんですけど?? #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 1024 char *cRegiTab[MAX]; // 文字列登録表 int n = 0; int main() { rightsidehfunction(); leftsidehfunction(); } /* 左辺の値をとって.hファイルに書き込む関数 */ int leftsidehfunction() { FILE *ft; FILE *fh; char buf[MAX]; char buf1[MAX]; char *cPid[MAX]; char *cWorkRegiAdd; char *cStoRegiAdd; int istr = 0; int k; char *p; char *q; int s; int i; int j; int iflag = 0; ft = fopen("test.txt","r"); fh = fopen("test.h","a+"); if (fh == NULL || ft == NULL) { printf("ファイルを開けません。\n"); return 1; } /* ファイルを1行ずつ読み込む処理 */ while (fgets(buf, sizeof buf, ft) != NULL){ cWorkRegiAdd = strtok(buf, "="); for(k = 0;k < n;k++){ if(*cPid[k] != *cWorkRegiAdd)continue; if(strcmp(cPid[k],cWorkRegiAdd) == 0)break; } if(k < n) continue; cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1); strcpy(cStoRegiAdd,cWorkRegiAdd); cPid[n] = cStoRegiAdd; for(j = 0;j < MAX;j++){ if(cPid[n] != cRegiTab[j]){ iflag = 1; } } if(iflag == 1){ fprintf(fh,"#define %s 0\n",cStoRegiAdd); } n++; } fclose(fh); fclose(ft); return 0; } /* 右辺の値をとって.hファイルに書き込む関数 */ int rightsidehfunction() { FILE *ft; // 入力ファイルポインタ FILE *fh; // 出力ファイルポインタ int c; //読み込み文字 char buf[MAX]; //バッファ領域 char buf1[MAX]; char cPid[MAX]; // 採取したPID char *cWorkRegiAdd; // 採取文字列作業域アドレス char *cStoRegiAdd; // 文字列格納域アドレス int iflag = 0; // 0/1; 右/左のクオート int ichs = 0; // chrの文字数 int istr = 0; // strの文字数 int k; // ntrの探索index int iOid; //OID char *p; ft = fopen("test.txt", "r"); fh = fopen("test.h", "w"); if (fh == NULL || ft == NULL) { printf("ファイルを開けません。\n"); return 1; } //ファイルを1文字ずつ読み込む while ((c = fgetc(ft)) != EOF) { switch (c) { case '"': iflag = 1 - iflag; /*右のクオート*/ if (iflag == 0) { cPid[ichs] = '\0'; cWorkRegiAdd = cPid; for(k = 0;k < istr;k++){ if(*cRegiTab[k] != *cWorkRegiAdd) continue; if(strcmp(cRegiTab[k],cWorkRegiAdd) == 0) break; } if(k == istr){ cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1); strcpy(cStoRegiAdd,cWorkRegiAdd); cRegiTab[istr] = cStoRegiAdd; istr++; fprintf(fh, "#define %s 0\n", cStoRegiAdd); } ichs = 0; } break; case '\n': if (iflag == 1) { cPid[ichs] = '\0'; iflag = 0; } ichs = 0; break; default: if (iflag == 1) { cPid[ichs] = c; if (ichs < MAX - 1){ ichs++; } } break; } } /* ファイルの最後が改行じゃなかった場合 */ if (ichs>0) { cPid[ichs]='\0'; } fclose(ft); fclose(fh); return 0; }

  • C言語 エンキューの問題について

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_QUEUE_LENGTH 11 // キューに用いる配列の⻑さ #define N 50 //乱数の範囲 typedef struct queue { int array[MAX_QUEUE_LENGTH]; int front; int rear; } Queue; Queue *init_queue() { printf("initialize queue\n"); Queue *queue = malloc(sizeof(Queue)); queue->front = 0; queue->rear = 0; return queue; } void print_test(char *line) { printf("-------------\n"); printf("test: %s\n", line); } void print_front_and_rear_index(Queue *queue) { // キューの front と rear を表示する関数 printf("front:%2d, rear:%2d\n", queue->front, queue->rear); } void print_queue(Queue *queue) { // キューの要素を front から rear まで表示する関数 } void enqueue(Queue *queue, int value) { // エンキューする関数 } void enqueue_test_items(Queue *queue, int n) { for (int i = 0; i < n; i++) { int score = rand() % N; enqueue(queue, score); } } void test_enqueue(Queue *queue) { print_test("print empty queue"); print_queue(queue); print_test("enqueue 10 items"); enqueue_test_items(queue, 10); print_test("print queue"); print_queue(queue); print_test("enqueue a item to full queue"); enqueue(queue, -1); } int main(void) { srand((unsigned)time(NULL)); // 乱数の初期化 Queue *queue = init_queue(); // キューの初期化 test_enqueue(queue); } 以下の雛形に従い,リングバッファによるキューに対して,エンキューする関数 enqueue を実装せよ. 関数 print_front_and_rear_index は,キューの front と rear を表示するための関数である. 問題に対する解答には不要であるがデバッグのために用意した. という問題なのですが上手くいかずに添付されている写真の実行結果通りになりません。なのでよければ解答をお願いします

  • 2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

    ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう?? とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。 #define BYTESIZE 200 #define MAX 200 main() { int i,j,intval=0; for(i=2;i<=MAX/2;i++) { if(intval&(1<<(i-1)){} else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1)); }/*素数を0、それ以外を1に for(i=2;i<=MAX/2;i++) for(j=2;j<=(MAX-i)/2;j++) if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j); }/*三つ子の素数を調べ出力

専門家に質問してみよう