7o8 の回答履歴
- 2次元配列で2項目についてソートのやりかたについて
こんにちは. VS2005 C++ MFC ダイアログベースでソフトを作成しています. CString型の配列 Array[100000][3] を定義し, CSVファイルから読み込んだ値を格納しています. 1列目 X座標 2列目 Y座標 3列目 結果 ファイルから読み込んだデータは以下のように y優先でxとyの値で昇順に並んでいます. _____[0] [1] [2] [0] 200 100 OK [1] 201 100 OK [2] 202 100 OK [3] 200 101 NG [4] 201 101 OK [5] 202 101 OK [6] 201 102 NG [7] 202 102 OK … これを以下のように x優先でxとyの値で昇順に並び変えたいのですが どのようにすればよいでしょうか? _____[0] [1] [2] [0] 200 100 OK [1] 200 101 NG [2] 201 100 OK [3] 201 101 OK [4] 201 102 NG [5] 202 100 OK [6] 202 101 OK [7] 202 102 OK かつ,100000行もあるのでスピードが速い方法だと助かります. 具体的なコードもお願いいたします.
- C++で10進数→2進数に
C++で10進数を2進数に変換するプログラムを 順番通りに表示できるようにする っていうのを配列を使って作るんですが 下はあまり関係ないですが、こんな感じのが参考になるかなと思ったんですが、どうすればいいんですか #include <iostream> using namespace std; int main() { int i,goukei=0; int kokugo[5]; float heikin; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績を入力してください\n"; cin >> kokugo[i]; goukei = goukei + kokugo[i]; } heikin = (float)goukei/5.0; cout << "平均点は" << heikin << "点です\n"; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績は" << kokugo[i]; cout << "点で、平均との差は" << heikin-(float)kokugo[i] << "です\n"; } return 0; }
- ベストアンサー
- C・C++・C#
- noname#127615
- 回答数4
- 処理速度を早くしたい!
このサイトは初めてなので、至らない点があればお許しを。 画像処理ソフト(そこそこ本格的なもの)を開発したら、 処理速度が遅すぎる!(>.<)★←解決したい内容 (プラットフォームは64bit-QuadコアPCで、OSはvista) (Visual Studio 2005 C++で開発) この原因はたぶん、 1)なんと実メモリ占有が、5.6GBも(実装8GB) (残りメモリが数10MBしか余裕がないようだ) 2)HDDへのアクセスが1分間に300~1100回発生している つまり残りメモリが少ないので、ページングしているからか? または処理プログラムをDLLにしたから、HDDに頻繁にアクセス? そこで、★質問A) 何にメモリをとられているか、分かるツールはないか? そしてこの配列にこれだけ、とかを、大きい順に見れるような… さらに、★質問B) もしDLLにしたのが問題であるなら、 DLLを実メモリに一旦展開したら、ずっと常駐して、 HDDへのアクセスが不要になるようなビルド方法があるらしい? ついでに、★質問C) 高速化のため一部並列threadプログラムでコーディングしたが、 使い難いので一部openMPを使ったが、逆に極端に遅くなった。 もちろん競合しないようにしたつもりだけど、 そもそもthreadPGとopenMPは共存できないの? ちなみに私くしめ、現役PGから退いて数年以上です。 最新の開発環境、その他用語など、知らない点も多し。 だから質問内容のピントがズレてるかもしれない (>.<) その点を同情して、このオジサンPGにやさしく教えてね♪ /E
- 2次元配列で2項目についてソートのやりかたについて
こんにちは. VS2005 C++ MFC ダイアログベースでソフトを作成しています. CString型の配列 Array[100000][3] を定義し, CSVファイルから読み込んだ値を格納しています. 1列目 X座標 2列目 Y座標 3列目 結果 ファイルから読み込んだデータは以下のように y優先でxとyの値で昇順に並んでいます. _____[0] [1] [2] [0] 200 100 OK [1] 201 100 OK [2] 202 100 OK [3] 200 101 NG [4] 201 101 OK [5] 202 101 OK [6] 201 102 NG [7] 202 102 OK … これを以下のように x優先でxとyの値で昇順に並び変えたいのですが どのようにすればよいでしょうか? _____[0] [1] [2] [0] 200 100 OK [1] 200 101 NG [2] 201 100 OK [3] 201 101 OK [4] 201 102 NG [5] 202 100 OK [6] 202 101 OK [7] 202 102 OK かつ,100000行もあるのでスピードが速い方法だと助かります. 具体的なコードもお願いいたします.
- スタックを用いて整数配列を入れ替えるプログラムがわかりません…!
C言語プログラミングの超初心者です。 「スタックを用いて0~9の10個の整数配列を5個ずつ並び替えるプログラムをつくる」(0123456789→4321098765) という課題に取り組んでいるのですが、 お恥ずかしいのですがスタック・プッシュ・ポップの関係を何とか理解した程度で、どのようにプログラミングを組めばよいのかわかりません…! 上記の課題の前提として、「0~100までの整数の並び順を逆にする」(0 1 2…100→100 99 98…0)が与えられていました。途中で分からなくなってしまっため、恥ずかしながら途中までなのですが、記述させていただきます。こちらのプログラムが参考になるようであれば、使っていただければ幸いです。 #include<stdio.h> #include<stlib.h> #define STACKLENGTH 100 #define LENGTH 10 int stack[STACKLENGTH]; int stack_p = 0; void print(void); void Print(char*,int*a,int); int main(int arg,char** argv){ int a[LENGTH]; int ii; for (ii=0; ii<LENGTH, ii++){ a[ii]= rand()%101; } Print("入れ替え前",a,LENGTH); for(ii=0; ii<LENGTH; ii++){ push(a[ii]); } for (ii=0; ii){ a[ii]=Pop(); } Print("入れ替え後",a,LENGTH ); } お手数をおかけします。とても困っており、ぜひご指導をお願いいたします…!
- パズルのプログラム
例えば三ケタの123とし、大きい順に並べて321小さい順に並べて123とします.そして321-123=198となりまた大小で並べて981-198と計算していきます。そして何回かすると同じ数がずっと出てくるのですが、それを何回行うかを求めるプログラムを教えて欲しいです。なお三ケタの100~999までとし、使う言語をc言語としてください。
- 締切済み
- C・C++・C#
- takuya0305
- 回答数4
- コードの最適化について質問です。以下の2つのコードにおいて、最適化が可能なポイントを教えていただけませんか?
*gccコンパイラを通します。 ///code1/// void filter_optimized(int width, int height, int numcol, int rw, int gw, int bw) { int x, y, z; for (z=0; z<numcol; z++) for (x=0; x<height; x++) for (y=0; y<width; y++) if (z==0) c[x][y][z] = bw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else if(z==1) c[x][y][z] = gw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else c[x][y][z] = rw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); return; } ///code2/// void edge_optimized(int width, int height, int numcol) { int x, y, z; int tmp; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) b[x][y][z] = (a[x][y][0]+a[x][y][1]+a[x][y][2])/3; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) { tmp = computeGx(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp > 255) tmp = 255; c[x][y][z] = tmp; tmp = computeGy(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp + c[x][y][z] > 255) c[x][y][z] = 255; else c[x][y][z] += tmp; c[x][y][z] = 255 - c[x][y][z]; if ((x==0)||(y==0)||(x==height-1)||(y==width-1)) c[x][y][z] = 255; } return; }
- ベストアンサー
- C・C++・C#
- voltaire00
- 回答数8
- ばばぬきプログラムについて
下記のようなプログラムで4人のコンピュータにババヌキをさせるプログラムを組んでる最中なんです。 decklistまでは表示できてもshufflelistではコンパイルは通っても実行するとデバックが起きてしまって困っています。while文をなくすとちゃんと返り値を持って表示はできるんですがwhile分で繰り返したとたんデバックが起きるんですがその理由がわかりません。どうして無理でしょうか?ご教授願います。 decklistは整列されリストに保存した山札の関数。 shufflelistはランダムで保存していく関数。 personの関数はdecklistのほうで試したところコンパイルは通るんですがこちらもデバックが起きてしまいます。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define N 53 //デッキのカードの構造体 struct card{ int t; struct card *next; }*deck; //カードを配った後のそれぞれのプレイヤーの情報(仮 struct player{ int card; struct player *nextcard; struct player *nextturn; }; //関数定義 struct card *talloc(void); struct player *lalloc(void); struct card *decklist(void); struct card *shufflelist(void); struct player *person(struct player *P); void displist(void); int main(void){ struct player *A,*B,*C,*D; struct player *p; p=person(A); while(p!=NULL){ printf("%d ",p->card); p=p->nextcard; } return 0; } //card構造体のセルの確保 struct card *talloc(void){ return (struct card *)malloc(sizeof(struct card)); } //player構造体のセルの確保 struct player *lalloc(void){ return (struct player *)malloc(sizeof(struct player)); } //カードを切る前の整列された山札の関数 struct card *decklist(void){ int i,add=1,count=0; struct card *p; deck=NULL; for(i=0;i<53;i++){ if(count==4){ add+=1; count=0; } p=talloc(); p->t=add; p->next=p; count++; p->next=deck; deck=p; } return deck; } //山札をシャッフルした後の山札の関数 struct card *shufflelist(void){ int i,a,count=0,r; struct card *d,*p,*q,*shuffle; p=decklist(); shuffle=NULL; while(p!=NULL){ srand(time(NULL)); r=(int)rand()%(N-count); for(i=0;i<r;i++){ p=p->next; } q=talloc(); q->t=p->t; d=p->next; p->next=d->next; q->next=shuffle; shuffle=q; count++; p->next=p; } return shuffle; } //プレイヤーへカードを配るための関数 struct player *person(struct player *PERSON){ struct player *a; struct card *library; int i; PERSON=NULL; library=decklist(); a=lalloc(); while(a!=NULL){ a->card=library->t; for(i=0;i<4;i++){ library=library->next; } a->nextcard=a; a=PERSON; } a->nextcard=NULL; while(a!=NULL){ printf("%d ",a->card); } return PERSON; }
- メモリアクセス時間の計測方法
今あるソースを書いていますが、計算時間が多くを占めるのか、メモリアクセスが多くを占めるのかを調べたいです。その方法としてアセンブラで記述し、load/store命令、あるいはadd等計算命令をそれぞれ計って足し合わせる、という方法が考えられますが、大きなソースコードだと大変なので、定量的に算出したいと思っています。 例えば、以下のようなコードの //----- ~ //----- の部分に対しては、計算に対してメモリアクセスがほとんどを占めるため、計算時間はほぼ0であると考えることで、メモリアクセスの時間を概略計測することはできると思います。しかし、レジスタにデータを置いてひたすら計算してからメモリに戻す、という場合には同手法は使えないと思いますが、そのような場合にはどうやって計測すれば良いでしょうか? #include <stdio.h> #define NUM_ITER (1000) float a[NUM_ITER], b[NUM_ITER], c[NUM_ITER]; int i; //----------------------- for(i=0; i<NUM_ITER; i++){ c[i] = a[i] + b[i]; } //----------------------- int j; for(j=0; j<NUM_ITER; j++){ printf("%f\n", c[i]); }
- 二次元配列のポインタについて教えて下さい
今日はCの配列のポインタについて質問いたします、宜しくお願いします。 1次元の配列からは、 =================================== int *p , a={1,2,3}; p = &a; printf("%d\n" , p[1] ) ; printf("%d\n" , *p[1] ) ; ===================================== でaの値がとれますが、 二次元の配列では下のような書き方ではエラーになります。 何故でしょうか、どう書いてやればいいのでしょう。 =============================================== printf("%d\n" , pbb[1][1] ) ; printf("%d\n" , *pbb[1][1] ) ; =============================================== 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- htgotk_001
- 回答数7
- メモリアクセス時間の計測方法
今あるソースを書いていますが、計算時間が多くを占めるのか、メモリアクセスが多くを占めるのかを調べたいです。その方法としてアセンブラで記述し、load/store命令、あるいはadd等計算命令をそれぞれ計って足し合わせる、という方法が考えられますが、大きなソースコードだと大変なので、定量的に算出したいと思っています。 例えば、以下のようなコードの //----- ~ //----- の部分に対しては、計算に対してメモリアクセスがほとんどを占めるため、計算時間はほぼ0であると考えることで、メモリアクセスの時間を概略計測することはできると思います。しかし、レジスタにデータを置いてひたすら計算してからメモリに戻す、という場合には同手法は使えないと思いますが、そのような場合にはどうやって計測すれば良いでしょうか? #include <stdio.h> #define NUM_ITER (1000) float a[NUM_ITER], b[NUM_ITER], c[NUM_ITER]; int i; //----------------------- for(i=0; i<NUM_ITER; i++){ c[i] = a[i] + b[i]; } //----------------------- int j; for(j=0; j<NUM_ITER; j++){ printf("%f\n", c[i]); }
- ばばぬきプログラムについて
下記のようなプログラムで4人のコンピュータにババヌキをさせるプログラムを組んでる最中なんです。 decklistまでは表示できてもshufflelistではコンパイルは通っても実行するとデバックが起きてしまって困っています。while文をなくすとちゃんと返り値を持って表示はできるんですがwhile分で繰り返したとたんデバックが起きるんですがその理由がわかりません。どうして無理でしょうか?ご教授願います。 decklistは整列されリストに保存した山札の関数。 shufflelistはランダムで保存していく関数。 personの関数はdecklistのほうで試したところコンパイルは通るんですがこちらもデバックが起きてしまいます。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define N 53 //デッキのカードの構造体 struct card{ int t; struct card *next; }*deck; //カードを配った後のそれぞれのプレイヤーの情報(仮 struct player{ int card; struct player *nextcard; struct player *nextturn; }; //関数定義 struct card *talloc(void); struct player *lalloc(void); struct card *decklist(void); struct card *shufflelist(void); struct player *person(struct player *P); void displist(void); int main(void){ struct player *A,*B,*C,*D; struct player *p; p=person(A); while(p!=NULL){ printf("%d ",p->card); p=p->nextcard; } return 0; } //card構造体のセルの確保 struct card *talloc(void){ return (struct card *)malloc(sizeof(struct card)); } //player構造体のセルの確保 struct player *lalloc(void){ return (struct player *)malloc(sizeof(struct player)); } //カードを切る前の整列された山札の関数 struct card *decklist(void){ int i,add=1,count=0; struct card *p; deck=NULL; for(i=0;i<53;i++){ if(count==4){ add+=1; count=0; } p=talloc(); p->t=add; p->next=p; count++; p->next=deck; deck=p; } return deck; } //山札をシャッフルした後の山札の関数 struct card *shufflelist(void){ int i,a,count=0,r; struct card *d,*p,*q,*shuffle; p=decklist(); shuffle=NULL; while(p!=NULL){ srand(time(NULL)); r=(int)rand()%(N-count); for(i=0;i<r;i++){ p=p->next; } q=talloc(); q->t=p->t; d=p->next; p->next=d->next; q->next=shuffle; shuffle=q; count++; p->next=p; } return shuffle; } //プレイヤーへカードを配るための関数 struct player *person(struct player *PERSON){ struct player *a; struct card *library; int i; PERSON=NULL; library=decklist(); a=lalloc(); while(a!=NULL){ a->card=library->t; for(i=0;i<4;i++){ library=library->next; } a->nextcard=a; a=PERSON; } a->nextcard=NULL; while(a!=NULL){ printf("%d ",a->card); } return PERSON; }
- ばばぬきプログラムについて
下記のようなプログラムで4人のコンピュータにババヌキをさせるプログラムを組んでる最中なんです。 decklistまでは表示できてもshufflelistではコンパイルは通っても実行するとデバックが起きてしまって困っています。while文をなくすとちゃんと返り値を持って表示はできるんですがwhile分で繰り返したとたんデバックが起きるんですがその理由がわかりません。どうして無理でしょうか?ご教授願います。 decklistは整列されリストに保存した山札の関数。 shufflelistはランダムで保存していく関数。 personの関数はdecklistのほうで試したところコンパイルは通るんですがこちらもデバックが起きてしまいます。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define N 53 //デッキのカードの構造体 struct card{ int t; struct card *next; }*deck; //カードを配った後のそれぞれのプレイヤーの情報(仮 struct player{ int card; struct player *nextcard; struct player *nextturn; }; //関数定義 struct card *talloc(void); struct player *lalloc(void); struct card *decklist(void); struct card *shufflelist(void); struct player *person(struct player *P); void displist(void); int main(void){ struct player *A,*B,*C,*D; struct player *p; p=person(A); while(p!=NULL){ printf("%d ",p->card); p=p->nextcard; } return 0; } //card構造体のセルの確保 struct card *talloc(void){ return (struct card *)malloc(sizeof(struct card)); } //player構造体のセルの確保 struct player *lalloc(void){ return (struct player *)malloc(sizeof(struct player)); } //カードを切る前の整列された山札の関数 struct card *decklist(void){ int i,add=1,count=0; struct card *p; deck=NULL; for(i=0;i<53;i++){ if(count==4){ add+=1; count=0; } p=talloc(); p->t=add; p->next=p; count++; p->next=deck; deck=p; } return deck; } //山札をシャッフルした後の山札の関数 struct card *shufflelist(void){ int i,a,count=0,r; struct card *d,*p,*q,*shuffle; p=decklist(); shuffle=NULL; while(p!=NULL){ srand(time(NULL)); r=(int)rand()%(N-count); for(i=0;i<r;i++){ p=p->next; } q=talloc(); q->t=p->t; d=p->next; p->next=d->next; q->next=shuffle; shuffle=q; count++; p->next=p; } return shuffle; } //プレイヤーへカードを配るための関数 struct player *person(struct player *PERSON){ struct player *a; struct card *library; int i; PERSON=NULL; library=decklist(); a=lalloc(); while(a!=NULL){ a->card=library->t; for(i=0;i<4;i++){ library=library->next; } a->nextcard=a; a=PERSON; } a->nextcard=NULL; while(a!=NULL){ printf("%d ",a->card); } return PERSON; }
- ばばぬきプログラムについて
下記のようなプログラムで4人のコンピュータにババヌキをさせるプログラムを組んでる最中なんです。 decklistまでは表示できてもshufflelistではコンパイルは通っても実行するとデバックが起きてしまって困っています。while文をなくすとちゃんと返り値を持って表示はできるんですがwhile分で繰り返したとたんデバックが起きるんですがその理由がわかりません。どうして無理でしょうか?ご教授願います。 decklistは整列されリストに保存した山札の関数。 shufflelistはランダムで保存していく関数。 personの関数はdecklistのほうで試したところコンパイルは通るんですがこちらもデバックが起きてしまいます。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define N 53 //デッキのカードの構造体 struct card{ int t; struct card *next; }*deck; //カードを配った後のそれぞれのプレイヤーの情報(仮 struct player{ int card; struct player *nextcard; struct player *nextturn; }; //関数定義 struct card *talloc(void); struct player *lalloc(void); struct card *decklist(void); struct card *shufflelist(void); struct player *person(struct player *P); void displist(void); int main(void){ struct player *A,*B,*C,*D; struct player *p; p=person(A); while(p!=NULL){ printf("%d ",p->card); p=p->nextcard; } return 0; } //card構造体のセルの確保 struct card *talloc(void){ return (struct card *)malloc(sizeof(struct card)); } //player構造体のセルの確保 struct player *lalloc(void){ return (struct player *)malloc(sizeof(struct player)); } //カードを切る前の整列された山札の関数 struct card *decklist(void){ int i,add=1,count=0; struct card *p; deck=NULL; for(i=0;i<53;i++){ if(count==4){ add+=1; count=0; } p=talloc(); p->t=add; p->next=p; count++; p->next=deck; deck=p; } return deck; } //山札をシャッフルした後の山札の関数 struct card *shufflelist(void){ int i,a,count=0,r; struct card *d,*p,*q,*shuffle; p=decklist(); shuffle=NULL; while(p!=NULL){ srand(time(NULL)); r=(int)rand()%(N-count); for(i=0;i<r;i++){ p=p->next; } q=talloc(); q->t=p->t; d=p->next; p->next=d->next; q->next=shuffle; shuffle=q; count++; p->next=p; } return shuffle; } //プレイヤーへカードを配るための関数 struct player *person(struct player *PERSON){ struct player *a; struct card *library; int i; PERSON=NULL; library=decklist(); a=lalloc(); while(a!=NULL){ a->card=library->t; for(i=0;i<4;i++){ library=library->next; } a->nextcard=a; a=PERSON; } a->nextcard=NULL; while(a!=NULL){ printf("%d ",a->card); } return PERSON; }
- gccインラインアセンブラのおすすめ学習サイト
大学院生です。 研究でアセンブラレベルでコードをいじる必要が出てきたので、 手始めにインラインアセンブラ(gcc)を勉強したいと思ったのですが、 サンプルコードを動かしてみると早速エラーが出てコンパイルが通らなかったりと、これがいいというサイトや本が見つかりません。 プログラマの型でインラインアセンブラ(gcc)を学習する上でおすすめのサイト、あるいは本などの教材の情報を持っている方がいらっしゃったらよろしくお願いします。 なお、情報系の大学院生ですが、事情により学部から院生の間に数年ブランクがあって、アセンブラを学習したのはかなり前で、復習を兼ねたいというのもあります。従って、全くの初心者ではありません。 以上、よろしくお願いします。
- メモリアクセス時間の計測方法
今あるソースを書いていますが、計算時間が多くを占めるのか、メモリアクセスが多くを占めるのかを調べたいです。その方法としてアセンブラで記述し、load/store命令、あるいはadd等計算命令をそれぞれ計って足し合わせる、という方法が考えられますが、大きなソースコードだと大変なので、定量的に算出したいと思っています。 例えば、以下のようなコードの //----- ~ //----- の部分に対しては、計算に対してメモリアクセスがほとんどを占めるため、計算時間はほぼ0であると考えることで、メモリアクセスの時間を概略計測することはできると思います。しかし、レジスタにデータを置いてひたすら計算してからメモリに戻す、という場合には同手法は使えないと思いますが、そのような場合にはどうやって計測すれば良いでしょうか? #include <stdio.h> #define NUM_ITER (1000) float a[NUM_ITER], b[NUM_ITER], c[NUM_ITER]; int i; //----------------------- for(i=0; i<NUM_ITER; i++){ c[i] = a[i] + b[i]; } //----------------------- int j; for(j=0; j<NUM_ITER; j++){ printf("%f\n", c[i]); }
- ばばぬきプログラムについて
下記のようなプログラムで4人のコンピュータにババヌキをさせるプログラムを組んでる最中なんです。 decklistまでは表示できてもshufflelistではコンパイルは通っても実行するとデバックが起きてしまって困っています。while文をなくすとちゃんと返り値を持って表示はできるんですがwhile分で繰り返したとたんデバックが起きるんですがその理由がわかりません。どうして無理でしょうか?ご教授願います。 decklistは整列されリストに保存した山札の関数。 shufflelistはランダムで保存していく関数。 personの関数はdecklistのほうで試したところコンパイルは通るんですがこちらもデバックが起きてしまいます。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define N 53 //デッキのカードの構造体 struct card{ int t; struct card *next; }*deck; //カードを配った後のそれぞれのプレイヤーの情報(仮 struct player{ int card; struct player *nextcard; struct player *nextturn; }; //関数定義 struct card *talloc(void); struct player *lalloc(void); struct card *decklist(void); struct card *shufflelist(void); struct player *person(struct player *P); void displist(void); int main(void){ struct player *A,*B,*C,*D; struct player *p; p=person(A); while(p!=NULL){ printf("%d ",p->card); p=p->nextcard; } return 0; } //card構造体のセルの確保 struct card *talloc(void){ return (struct card *)malloc(sizeof(struct card)); } //player構造体のセルの確保 struct player *lalloc(void){ return (struct player *)malloc(sizeof(struct player)); } //カードを切る前の整列された山札の関数 struct card *decklist(void){ int i,add=1,count=0; struct card *p; deck=NULL; for(i=0;i<53;i++){ if(count==4){ add+=1; count=0; } p=talloc(); p->t=add; p->next=p; count++; p->next=deck; deck=p; } return deck; } //山札をシャッフルした後の山札の関数 struct card *shufflelist(void){ int i,a,count=0,r; struct card *d,*p,*q,*shuffle; p=decklist(); shuffle=NULL; while(p!=NULL){ srand(time(NULL)); r=(int)rand()%(N-count); for(i=0;i<r;i++){ p=p->next; } q=talloc(); q->t=p->t; d=p->next; p->next=d->next; q->next=shuffle; shuffle=q; count++; p->next=p; } return shuffle; } //プレイヤーへカードを配るための関数 struct player *person(struct player *PERSON){ struct player *a; struct card *library; int i; PERSON=NULL; library=decklist(); a=lalloc(); while(a!=NULL){ a->card=library->t; for(i=0;i<4;i++){ library=library->next; } a->nextcard=a; a=PERSON; } a->nextcard=NULL; while(a!=NULL){ printf("%d ",a->card); } return PERSON; }
- 次のプログラミングのヒントをお願いします。
データを読み込み、中国地方の県のデータを打ち出すプログラムを作成しなさい。 ただし、中国地方かどうかを判定する部分は関数を使います。 ■県データの1行からなる構造体を受け取る関数とする(該当すればYを戻り値として返すようにする。) ■判定をする際の県名の比較は、関数側に県名の二次元配列を持ち、標準関数strcmpを使う。string.hのincludeを忘れない ■strcmp(文字列1、文字列2)は文字列が一致すれば0を返す。 【実行例】 ./p2-6-2 < pref.txt Tottori 613 3507 Shimane 761 6707 Okayama 1951 7112 Hiroshima 2879 8477 Yamaguchi 1528 6110 宜しくお願いします。どういった感じに書き込めばよいのかわかりません…
- 締切済み
- C・C++・C#
- archerry09
- 回答数3
- メモリアクセス時間の計測方法
今あるソースを書いていますが、計算時間が多くを占めるのか、メモリアクセスが多くを占めるのかを調べたいです。その方法としてアセンブラで記述し、load/store命令、あるいはadd等計算命令をそれぞれ計って足し合わせる、という方法が考えられますが、大きなソースコードだと大変なので、定量的に算出したいと思っています。 例えば、以下のようなコードの //----- ~ //----- の部分に対しては、計算に対してメモリアクセスがほとんどを占めるため、計算時間はほぼ0であると考えることで、メモリアクセスの時間を概略計測することはできると思います。しかし、レジスタにデータを置いてひたすら計算してからメモリに戻す、という場合には同手法は使えないと思いますが、そのような場合にはどうやって計測すれば良いでしょうか? #include <stdio.h> #define NUM_ITER (1000) float a[NUM_ITER], b[NUM_ITER], c[NUM_ITER]; int i; //----------------------- for(i=0; i<NUM_ITER; i++){ c[i] = a[i] + b[i]; } //----------------------- int j; for(j=0; j<NUM_ITER; j++){ printf("%f\n", c[i]); }
- オセロを作成 助言お願いします・・・
C言語を初めてもうすぐ1ヶ月ぐらいたつんですけど今ある知識の そうまとめとしてオセロを作成しています。 同じオセロでもソースを2つ作ろうと考えています。 まずは関数を使わないで作るオセロ もうひとつは関数を使うオセロです。 関数を使わないほうのオセロで困っています。今1ターンごとに白い 石を置いたり黒い石を置いたりするばしょをつくっていて 変数を1週ごとに1ずつ増やしていき奇数なら黒い石偶数なら白い石 みたいにしようと考え次のようなソースコードを書きました。 ----------------------ソースコード-------------------------- #include<stdio.h> int bord[8][8]; int x,y; int i,j,l,a; int player; int main (void) { //ボードの初期化 for(i=0;i<8;i++){ for(j=0;j<8;j++){ bord[i][j]=0; } } bord[3][3]=1; bord[4][4]=1; bord[3][4]=2; bord[4][3]=2; //bordの表示 player=0; for(;;){ //何度も表示 printf("01234567\n"); for(i=0;i<8;i++){ //繰り返す(1) for(j=0;j<8;j++){ //繰り返す(2) if(bord[i][j] == 0){ //bord[i][j]は初期化により0なので printf("*"); } else if(bord[i][j] == 1){ printf("●"); } else{ printf("○"); } } printf("\n"); } if(player%2==0){ bord[i][j]=1; } else if(player%2==1){ bord[i][j]==0; } printf("y座標を入力してください。(縦軸)"); scanf_s("%d", &y); printf("x座標を入力してください。(横軸)"); scanf_s("%d", &x); //ひっくりかえす //エラー処理// if(bord[y][x]!=0) { printf("\n"); printf("置かれてるよ!\n"); } //ひっくり返す// if(x>=0 && x<8 && y>=0 && y<8 && bord[y][x]==0){ if(bord[y][x] == 0){ bord[y][x]=1; } if(bord[y][x]==1) { bord[y][x]=2; } } //エラー処理// if(x<0 || x>=8 || y<0 || y>=8 ) { printf("許容範囲外です。\n"); } player++; } //無限loop終了地点 return 0; } -------------------------ソース終了-------------------------- 汚いソースで申し訳ありません。これを実行すると いつでも白の石しか置けないのです・・・ なのでヒントでもいいのでどうすればいいのか教えてください! あともしよければはさまれたら石の色を変える部分も教えてくださると助かります。 ちなみに偶数かどうかの判定の部分は 「if(player%2==0){ bord[i][j]=1; } else if(player%2==1){ bord[i][j]==0; } 」 というところです。 ※質問などありましたらどうぞいってください。 ご回答お待ちしております。
- 1
- 2