ヒルベルト曲線とビットマップの座標関連付けプログラムについて質問

このQ&Aのポイント
  • ヒルベルト曲線を用いて画像をスキャンするプログラムとビットマップの画像を読み込むプログラムを用いてお互いの座標を関連付けてヒルベルト曲線の座標にビットマップの1画素ずつの値を代入したい
  • 前に質問した物はhttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1106704にあります。ヒルベルトは質問覧にビットマッピはNO2の補足にあります。
  • プログラムを書くと800字を超えてしまうのでそのようにしました。ヒルベルトは他に#include<stdio.h> int x,y; int n; void RUL(int n),DLU(int n),LDR(int n),URD(int n); main() { scanf("%d",&n); printf("#位相%dのヒルベルト曲線 ",n); x=0; y=0;printf("(%d %d) ",x,y); RUL(8); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("(%d %d)",x,y); RUL(n-1);y=y+1;printf("(%d %d)",x,y); RUL(n-1);x=x-1;printf("(%d %d)",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("(%d %d)",x,y); DLU(n-1);x=x-1;printf("(%d %d)",x,y); DLU(n-1);y=y+1;printf("(%d %d)",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("(%d %d)",x,y); LDR(n-1);y=y-1;printf("(%d %d)",x,y); LDR(n-1);x=x+1;printf("(%d %d)",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("(%d %d)",x,y); URD(n-1);x=x+1;printf("(%d %d)",x,y); URD(n-1);y=y-1;printf("(%d %d)",x,y); LDR(n-1); } があります。
回答を見る
  • ベストアンサー

プログラムC

前にも質問したのですがヒルベルト曲線を用いて画像をスキャンするプログラムとビットマップの画像を読み込むプログラムを用いてお互いの座標を関連付けてヒルベルト曲線の座標にビットマップの1画素ずつの値を代入したいのですがどうしてもうまくいかなく質問しました。 前に質問した物はhttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1106704 にあります。ヒルベルトは質問覧にビットマッピはNO2の補足にあります。プログラムを書くと800字を超えてしまうのでそのようにしました。 ヒルベルトは他に #include<stdio.h> int x,y; int n; void RUL(int n),DLU(int n),LDR(int n),URD(int n); main() { scanf("%d",&n); printf("#位相%dのヒルベルト曲線\n",n); x=0; y=0;printf("(%d %d) ",x,y); RUL(8); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("(%d %d)",x,y); RUL(n-1);y=y+1;printf("(%d %d)",x,y); RUL(n-1);x=x-1;printf("(%d %d)",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("(%d %d)",x,y); DLU(n-1);x=x-1;printf("(%d %d)",x,y); DLU(n-1);y=y+1;printf("(%d %d)",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("(%d %d)",x,y); LDR(n-1);y=y-1;printf("(%d %d)",x,y); LDR(n-1);x=x+1;printf("(%d %d)",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("(%d %d)",x,y); URD(n-1);x=x+1;printf("(%d %d)",x,y); URD(n-1);y=y-1;printf("(%d %d)",x,y); LDR(n-1); } があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

かなりてこずっているようですが、まずはプログラムの動きをきちんと理解しないと応用は厳しいと思います。 参考まで、BMPファイルを読み込んで、普通のデータとヒルベルト走査したデータを吐き出すサンプル(かなり手抜き)です。 画像データは、1024*1024のWindows標準BMPファイルで、24ビット深度のグレー画像(赤=青=緑)を想定しています。 出力ファイルは、1024*1024の8ビットグレーデータです。raw形式のファイルに対応したビューア(PhotoShopとか)で見れるはずです。 /* BMP画像のヒルベルト曲線走査 (c)2004 JaritenCat */ #include <stdio.h> #include <stdlib.h> #define N 10 /* ヒルベルト曲線の基数 2^N */ #define XSIZE (1<<N) #define YSIZE (1<<N) #define SIZE (XSIZE*YSIZE) #define IMAGEFILE "test.bmp" /* 画像サイズは2^N*2^N 24bpp R=G=B(GRAY SCALE) */ #define NORMALFILE "out1.raw" #define HILBERTFILE "out2.raw" unsigned char bitimage[SIZE]; /* 画像データ */ unsigned char hilimage[SIZE]; /* 画像データ */ int idx=0; /* hilimage用インデックス */ /* byte*4 → unsigned long 変換(リトルエンディアン) */ unsigned long ctol(unsigned char a, unsigned char b, unsigned char c, unsigned char d) { return (unsigned long)a|((unsigned long)b<<8)|((unsigned long)c<<16)|((unsigned long)d<<24); } /* byte*2 → unsigned short 変換(リトルエンディアン) */ unsigned short ctos(unsigned char a, unsigned char b) { return (unsigned short)a|((unsigned short)b<<8); } /* ヒルベルト走査(再帰) n:ブロックサイズ p:走査パターン x,y:基準点 */ void hilbert(int n, int p, int x, int y) { if (n>1) { hilbert(n/2, (p+4)%8, x+(p&1)*(n/2), y+((p>>1)&1)*(n/2)); hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+((p^(p>>2)^1)&1)*(n/2)); hilbert(n/2, p, x+(~p&1)*(n/2), y+(~(p>>1)&1)*(n/2)); hilbert(n/2, 7-p, x+(((p>>1)^(p>>2)^1)&1)*(n/2), y+((p^(p>>2))&1)*(n/2)); } else { /* ここでヒルベルト走査のidx番目の座標x,y が求まっている */ hilimage[idx]=bitimage[x+y*XSIZE]; idx++; } } /* メインルーチン */ int main(void) { FILE *fp; int x,y,c; unsigned char buf[54]; /* BMPファイル(Windows標準BMP 24bpp パレットなし)のヘッダ用 */ /* BMPファイルを開く */ if ((fp=fopen(IMAGEFILE,"rb"))==NULL) { printf(IMAGEFILE" open error\n"); return -1; } if (fread(buf,sizeof(unsigned char),54,fp) != 54) { printf("header read error\n"); fclose(fp); return -1; } if (ctos(buf[28],buf[29])!=24) { printf("bit count error\n"); fclose(fp); return -1; } if (ctol(buf[18],buf[19],buf[20],buf[21])!=XSIZE) { printf("width error\n"); fclose(fp); return -1; } if (ctol(buf[22],buf[23],buf[24],buf[25])!=YSIZE) { printf("height error\n"); fclose(fp); return -1; } /* ファイルから画像データ(bitimage)へ変換する */ for (y=0; y<YSIZE; y++) { for (x=0; x<XSIZE; x++) { if ((c=fgetc(fp))==EOF) {printf(IMAGEFILE" data read error\n"); fclose(fp); return -1; } bitimage[x+(YSIZE-1-y)*XSIZE]=c; /* グレースケールを想定しているので赤をデータとする */ fgetc(fp); fgetc(fp); /* 緑、青を読み飛ばす */ } } fclose(fp); /* 画像データ書き出し */ if ((fp=fopen(NORMALFILE,"wb"))==NULL) { printf(NORMALFILE" open error\n"); return -1; } if (fwrite(bitimage, sizeof(unsigned char), SIZE, fp) != SIZE) { printf(NORMALFILE" write error\n"); fclose(fp); return -1; } fclose(fp); /* ヒルベルト走査 */ hilbert(XSIZE,0,0,0); if (idx != SIZE) { printf("hilbert scan error\n"); return -1; } /* 走査データ書き出し */ if ((fp=fopen(HILBERTFILE,"wb"))==NULL) { printf(HILBERTFILE" open error\n"); return -1; } if (fwrite(hilimage, sizeof(unsigned char), SIZE, fp) != SIZE) { printf(HILBERTFILE" write error\n"); fclose(fp); return -1; } fclose(fp); return 0; }

gfgdhggddg
質問者

お礼

JaritenCatさんに聞きたいのですが上のプログラムをどのようにかえればいいのですか><?ヒルベルト走査したデータを吐き出したものとBMPの座標を関連ずけるには。。。 ポインタを使えばうまくいきますでしょうか?

gfgdhggddg
質問者

補足

ありがとうございます。はいかなりてこずっております・・・。もうお手上げ状態なのです。 REDHATを使っておりGIMPだとビューアでみれませんでした><。ファイルはできていますが。

その他の回答 (6)

回答No.7

画像の見方その2(pgmファイルにする方法) (1)header.txt というファイルを作ってください。内容は、 P5 1024 1024 255 です。(各行に、識別子、xサイズ、yサイズ、色サイズ) (2)画像データにヘッダを付けて新しいファイルを作ります。 例えば、 DOS窓なら、 copy /b header.txt +out2.raw out2.pgm Unixなら、 cat header.txt out2.raw > out2.pgm この out2.pgm がPGM形式の画像データです。 gimpでも対応しているはずです。

gfgdhggddg
質問者

お礼

ありがとうございます。試してみます。 質問したbmpとヒルベルトを関連付けて1次元配列で表せました★

回答No.6

>やはり画像の座標とヒルベルトスキャンの座標を関連付けでヒルベルトスキャンの順番のピクセルの値を1次元配列にしてそれを圧縮しないと駄目みたいです・・・。 ANo.2のプログラムでは、hilimageがその1次元配列ですが・・・これでは駄目ですか?(それをファイルに書き出したのがout2.rawです) BMP画像→ラスタスキャン(bitimage[])→ヒルベルトスキャン(hilimage[])の逆をしたいのであれば、hilbert関数の中の hilimage[idx]=bitimage[x+y*XSIZE]; idx++; を逆にした関数を新しく作って呼び出せばいいでしょう。 bitimage2[idx2]=hilimage[x+y*XSIZE]; idx2++; という風に。 これをBMPファイルにしたければ、ヘッダを付けてデータを3回ずつ書き出すだけです。(Y方向に注意) ちなみに、bzip2方式で圧縮したのは、ANo.3のout.tbzです。

gfgdhggddg
質問者

補足

out2.rawというのは1次元配列のファイルだったのですか ><。ファイルでなく1次元配列の中身をみたいのですがhilimageの1次元配列を・・・。 bitimage2[idx2]=hilimage[x+y*XSIZE]; idx2++; にかえたのですが hilbert scan errorとでてしまいます。 アドバイスお願い致します。

回答No.5

>どのようにしたら見れますか? WindowsでしたらフリーソフトのIrfanViewが対応しているようです。 http://www8.plala.or.jp/kusutaku/ 画像サイズを1024x1024、ヘッダサイズ0、8BPPで開いてください。 out1.rawは普通に見えるはずです。当たり前の事ですが、IrfanViewはヒルベルトスキャンには対応してませんのでout2.rawはぐちゃぐちゃに見えます。

gfgdhggddg
質問者

お礼

やはり画像の座標とヒルベルトスキャンの座標を関連付けでヒルベルトスキャンの順番のピクセルの値を1次元配列にしてそれを圧縮しないと駄目みたいです・・・。 画像がみれないので・・・。一度質問を締め切ってまた質問させていただきます。

gfgdhggddg
質問者

補足

そうですかあ><。out2.rawをbzip2にかけそれを添付メールなどして解凍しout2.rawを表示させたいのですが・・・。プログラムはどんな感じになりますでしょうか?

回答No.4

>rawだとプロパティーをみると種類が未知の種別で開けません。 当然です。ここで言っているrawファイルは、最近はやりのデジカメrawファイルではなく、ヘッダーなしの生データです。Adobe Photoshopが汎用フォーマット(*.RAW)と言っているものです。ヘッダがないのでプロパティを表示させようとしてもファイル種別を判別できるわけがありません。ファイルサイズを見れば分かると思いますが、1024*1024バイトとまったく同じです。 out1.raw は画像をラスタスキャンしたデータです。 画像の左上から右下に向かって、左→右を上→下の順に走査しています。 out2.raw は画像をヒルベルトスキャンしたデータです。 画像の左上から右上に向かって、ヒルベルト曲線の順に走査しています。

gfgdhggddg
質問者

補足

朝から回答ありがとうございます。どのようにしたら見れますか?拡張子を*.bmpとしたら未知の種別ではなくなったんですがみれませんでした。

回答No.3

ANo.2のコメントへの回答です。 >ヒルベルト走査したデータを吐き出したものとBMPの座標を関連ずけるには。。。 関連付ける必要がありますか?? out1.raw(bitimage[])は原画を普通にスキャンした生の画像データ(1024*1024=1048576バイト)ですし、out2.raw(hilimage[])はヒルベルトスキャンした画像データです。 両者のファイルを別の圧縮プログラムで読み込んで圧縮後のデータサイズを比較すればいいのでは? 本当にヒルベルトスキャンの座標列が必要であれば、前の質問で回答したとおりです。 ちょっと興味があったのでWindowsでよく使われるアーカイバを使って手持ちの画像を圧縮比較してみました。(圧縮ファイルにはヘッダや誤り符号などが入っているので、単純にデータサイズの比較にはなっていません) out1.raw  1,048,576  out2.raw 1,048,576 out1.gca   567,435  out2.gca  591,466 out1.bza   637,553  out2.bza  668,852 out1.tbz   637,569  out2.tbz  669,014 out1.rar   673,723  out2.rar  752,542 out1.cab   800,716  out2.cab  786,455 out1.lzh   804,140  out2.lzh  787,234 out1.yz1   763,410  out2.yz1  789,967 out1.zip   801,776  out2.zip  789,905 辞書式アルゴリズムを使ったやつはヒルベルトの方が若干サイズが小さくなっていますが、より高圧縮アルゴリズムだと逆にサイズが大きくなっている感じです。ちなみに、GCAがBlockSorting(BWT)+RangeEncoder(エントロピー符号化)を使っているらしいです。見事な圧縮率です。

gfgdhggddg
質問者

お礼

rawだとプロパティーをみると種類が未知の種別で開けません。

gfgdhggddg
質問者

補足

上の結果はNO2のプログラムの結果から出したものなのでしょうか? 僕がやろうとしていたものはヒルベルトの座標列[x,y]をピクセルデータimg[x][y][k]に代入したいんです。kはrgbの値です。 0[0,0] 1[0,1] 2[1,1] ・ ・ ・ をbuf[0]=img[0][0][k],buf=img[0][1][k],buf[2]=img[1][1][k]・・・というような1次元配列で表示させこれに適当な名前をつけこれを圧縮アルゴリズムにかけたいのです。 NO2のプログラムと同じ様な結果が出ますかね? JaritenCatさんはすごいですね★専門家みたいです!

回答No.1

プログラムはいいですから、何をしたいのかが、 わかりません。整理してもらえますか? そもそも、ヒルベルトってなんですか? ヒルベルトである必要ありますか? もう少し、問題を単純化して考える必要があると思います。要は、座標変換をしたいんですか? 全てを説明できるようになれば、おのずと解決方法が 見えてくるかもしれませんね。

gfgdhggddg
質問者

補足

ヒルベルトは下記を見てください。http://homepage1.nifty.com/mstak/Program/Java-12/Fractal/Hilbert.html したいことはBMP画像を2次元相関を保ったまま1次元配列に変換できるヒルベルトスキャンとBWT変換とエントロピー符号化を用いた圧縮方式を組み合わせどれくらい圧縮できるかを調べたいのです。それでヒルベルトスキャンの方がわからなくて質問しました。もう一つの方は大丈夫なのですが・・・。

関連するQ&A

  • 配列

    このプログラムを #include<stdio.h> int x,y; int n; void RUL(int n),DLU(int n),LDR(int n),URD(int n); main() { scanf("%d",&n); printf("#位相%dのヒルベルト曲線\n",n); x=0; y=0;printf("(%d %d) \n)",x,y); RUL(n); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("(%d %d)\n",x,y); RUL(n-1);y=y+1;printf("(%d %d)\n",x,y); RUL(n-1);x=x-1;printf("(%d %d)\n",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("(%d %d)\n",x,y); DLU(n-1);x=x-1;printf("(%d %d)\n",x,y); DLU(n-1);y=y+1;printf("(%d %d)\n",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("(%d %d)\n",x,y); LDR(n-1);y=y-1;printf("(%d %d)\n",x,y); LDR(n-1);x=x+1;printf("(%d %d)\n",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("(%d %d)\n",x,y); URD(n-1);x=x+1;printf("(%d %d)\n",x,y); URD(n-1);y=y-1;printf("(%d %d)\n",x,y); LDR(n-1); } 実行結果は (0 0) (0 1) ・ ・ ・ (0 254) (0 255) になります。これを2次元配列で表したのですがどのようにいじればいいでしょうか?おねがいします。

  • ヒルベルト曲線のプログラム(C言語)

    私は画像の勉強をしています。それで従来の水平スキャンではなく2次元相関をたもったまま1次元配列に変換できるヒルベルトスキャンとBWT変換とエントロピー符号化を用いて圧縮する方法を勉強しています。しかしヒルベルトのほうができなくて困っています。 プログラムの実行結果でヒルベルト曲線通る座標を示すプログラムを教えてください。だいたいは書けましたがうまくいきません。プログラムは #include<stdio.h> int x,y; main() { int n; void RUL(int n),DLU(int n),LDR(int n),URD(int,n); scanf("%d",&n); printf("#位相%dのヒルベルト曲線\n",n); x=0; y=0;printf("%d\n",x,y); RUL(n);printf("\n"); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("%d %d\n",x,y); RUL(n-1);y=y+1;printf("%d %d\n",x,y); RUL(n-1);x=x-1;printf("%d %d\n",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("%d %d\n",x,y); DLU(n-1);x=x-1;printf("%d %d\n",x,y); DLU(n-1);y=y+1;printf("%d %d\n",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("%d %d\n",x,y); LDR(n-1);y=y-1;printf("%d %d\n",x,y); LDR(n-1);x=x+1;printf("%d %d\n",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("%d %d\n",x,y); URD(n-1);x=x+1;printf("%d %d\n",x,y); URD(n-1);y=y-1;printf("%d %d\n",x,y); LDR(n-1); } です。それをBWT変換とエントロピー符号にかけ圧縮させその圧縮率を求めその後画像はちゃんと戻るかを調べるために復元のプログラムを書かないいけませんがそのプログラムがわかりません。教えてください。

  • プログラムの改良。

    うまく改良できなくて困っています。 このプログラムを #include <stdio.h> #include <stdlib.h> /* データ用変数 */ struct xy {  int x;  int y; } *hil; int idx; /* ヒルベルトスキャン */ void hilbert(int n, int p, int x, int y) {  if (n>1) {   hilbert(n/2, (p+4)%8, x+(p&1)*(n/2), y+((p>>1)&1)*(n/2));   hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2));   hilbert(n/2, p, x+(~p&1)*(n/2), y+(~(p>>1)&1)*(n/2));   hilbert(n/2, 7-p, x+(~((p>>1)^(p>>2))&1)*(n/2), y+((p^(p>>2))&1)*(n/2));  } else {   hil[idx].x=x; hil[idx].y=y; idx++;  } } int main(void) {  int i,n;  /* nの入力と領域確保 */  printf("n? "); scanf("%d",&n);  if((hil=(struct xy*)malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) {   printf("malloc error\n"); return -1;  }  /* ヒルベルトスキャン */  idx=0; hilbert((1<<n),4,0,0);  /* データ表示 */  for (i=0; i<idx; i++) {   printf("%d ([d %d]\n",i,hil[i].x,hil[i].y);  }  /* 領域開放 */  free(hil);  return 0; } 実行結果はn?8 0 [0 0] 1 [0 1] ・ ・ 65534 [0 254] 65535 [0 255] と表示されます。これを buf[0]=img[hil[0].x][hil[0].y][0] buf[1]=img[hil[0].x][hil[1].y][0] ・ ・ buf[65534]=img[hil[0].x][hil[254].y][0] buf[65535]=img[hil[0].x][hil[255].y][0] と表示させたいのですがうまくできません。どこを改良すればいいでしょうか?お願い致します。 buf[]の中身は0から256*256-1を表しています。

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • Cの九九を表示するプログラムについて

    九九の表示を変えたいんですけど #include <stdio.h> int main(void) { int x,y; for (x = 1;x <= 9;x++) { for (y = 1;y <= 9;y++) { printf(" %2d ", x * y); } printf("\n"); } return 0; } これを実行すると 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 . . 9 . . . . . . . 81 となるのですが、これを 1 * 1 1 * 2 1 * 3 . . . 1 * 9 1 * 2 . . 1 * 9 . . . . . 9 * 9 と表示させたいのですがどなたか知恵を貸していただきませんでしょうか?

  • c プログラム 

    以下のプログラムは,第n項までのe^xのマクローリン展開をさせるものです. これを修正して,理論値と近似値の誤差がある値(自分で入力)になったときに,計算を終了させるにはどうしたらよいでしょうか.御教授いただければ幸甚 です. ---------------------------------------- #include <stdio.h> #include <math.h> int main(void) { int n; double x=1.0,y=1.0,e=1.0,err; int i; double f=1.0,p=1.0; printf("x="); scanf("%lf",&x); printf("n="); scanf("%d",&n); printf("Mclaurin展開によるn項までのexp(x)の\n n 理論値 近似値 誤差\n"); for(i=1;i<=n;i++){ f*=(double)i; p*=x; y+=p/f;近似値 e=exp(x);理論値 err=e-y;誤差 printf("%2d %12.8e %12.8e %12.8e\n",i,e,y,err); } return 0; }

  • プログラムに詳しい方教えてください!

    #include<stdio.h> void fxl(int x,int y); int main(void) { int a,b,m,n; printf("整数aの値を入力\n"); scanf("%d",&b); printf("整数bの値を入力\n"); scanf("%d",&b); m=a; n=b; fxl(m,n); printf("a=%dとb=%dを加算した値は%d\n",ab,m); printf("a=%dからb=%dを減算した値は%d\n",ab,n); return 0; } void fxl(int x,int y) { int j,k; j=x; k=y; x=j+k; y=j-k; } このプログラムを作ってみたのはいいのですが、参照渡しを使って正常に足し算、引き算をするにはどうすればよいのでしょうか。

  • C言語の簡単なプログラム

    簡単な足し算のみの電卓をC言語で作っています。 /が入力されるまで足し算を繰り返すものです。 コンパイルをして、足し算を繰り返すところまでは上手くいったのですが、 /を入力してのループの抜け方がわかりません。 #include<stdio.h> int main(void) { int x=0,z; printf("数値を入力\n"); printf("終了は/を入力\n"); printf("\n結果 %d\n",x); while(1){ scanf("%d",&z); x=x+z; /* 足し算の計算 */ printf("結果 %d\n",x); /* 現在の計算結果を表示 */ } printf("終了 結果: %d\n",x); /* 計算の終了、合計値の表示 */ return 0; } while文のなかにifでいれればいいのでしょうか? その場合、 if(z=='/') break; でいいんでしょうか? if文以外のやり方がある場合も教えていただけたらと思います。 よろしくお願いします。

専門家に質問してみよう