超音波流体屋のプログラム備忘録

C_and_C++

最終更新:

usapfrog

- view
管理者のみ編集可

ファイル読み書き

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void){
  6. FILE *f;
  7. if ((f = fopen("hoge.dat", "r/w[b]")) == NULL){
  8. printf("file open error!!\n"); exit(EXIT_FAILURE);
  9. }
  10.  
  11. //サイズとか
  12. fseek(f, 0, SEEK_END);
  13. long dsize = ftell(f);
  14. rewind(f);
  15.  
  16. //読み
  17. fread(array, sizeof(int), num, f);
  18. double x;
  19. while( fscanf(f, "%lf", &x) != EOF ) printf("%e\n", x);
  20.  
  21. //書き
  22. fprintf(f, "array : %d", array[0] );
  23. fwrite(array, sizeof(int), num, f);
  24.  
  25. fclose(f);
  26. return 0;
  27. }
  28.  


乱数

  • シードを入れるのを忘れない。
  • rand()はRAND_MAXまでの整数を吐く。
  • 精度が欲しかったらメルセンヌ・ツイスタを実装すること。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void){
  5. srand((unsigned) time(NULL));
  6. int randint = rand();
  7.  
  8. int randlim = 10;
  9. int rand10 = rand() % randlim;
  10.  
  11. double randdouble = rand()*1.0/RAND_MAX;
  12. double whitenoise = (rand() - RAND_MAX/2.0)/RAND_MAX;
  13.  
  14. return 0;
  15. }
  16.  

Hashの考え方

  • 文字列や飛び飛びの整数IDに対してO(1)でアクセスしたい
  • 少数の場合はmapが使いこなせれば便利。
  • 基本的には山ほど配列を準備しといて、文字列を配列番号に変換すれば良い
  • ただ文字列のサイズは1byte*文字列長なので、4文字を超えるとintに収まらないし準備する配列が多すぎる
  • そこはうまいこと剰余を利用して準備分を減らす。
  • 被りがでるはずなのでそこの細工は線形探索とする。(それでも全探索よりずっと速い)

飛び飛びの番号(非負)なら
  1. #define BUFFER 65536
  2. #define N 100
  3.  
  4. int main(void){
  5. int ids[BUFFER], id_num = 0;
  6. double value[N];
  7. //add
  8. int id=10;
  9. ids[id] = 0;
  10. value[ ids[id] ] = 42.0;
  11. id_num++;
  12. }
  13.  
文字列ならこの辺をうまく使って。
  1. #define BUFFER 65536
  2. #define HASHCONST 17 //素数が良いとされる
  3. int hash(char *s){
  4. int i;
  5. long h;
  6. int len = strlen(s);
  7. for (i = 0; i < L; i++) h = h * HASHCONST + s[i];
  8. return h % BUFFER;
  9. }
  10.  

ポインタ

*i++はアドレスの方が動くので注意。 中の数をインクリメントしたい場合は *i = *i + 1とするか、 (*i)++とするんだろうね。

vector, map 他

目安箱バナー