goo blog サービス終了のお知らせ 

改め Objective Technician

はぐれ技術者のやりたい放題

あってはならないもの

2006-07-18 19:54:50 | 勉強
思い返せば小学校からずっと教科書は「新しい算数」とか「新しい化学」とか、何でも新しがる傾向がある。



それは別にいいとして、高校のときの古典の参考書に「新しい古典文法」なんてのがあった。



新しい古典文法なんてありえない。




大学生になっても、今使ってる電磁気学の教科書は「新しい電磁気学」である。

なんかバカにされてる気がする。


学部一年短縮を目指して

2006-07-17 18:49:52 | 勉強
いよいよ明日から怒涛のテスト週間が始まる。



ポケモンで言うと、いきなりセキエイ高原に来たみたいだ。

しかも四天王どころか、土日を挟んで9科目連続で勝ち抜かなきゃいかん。


とくに最後のオートマトンが強敵だ。


もちろんその間にレポートとか宿題とかもこなさなきゃならん。


フリーザがいない状況であと1ターンで倒せるカイリュウにワタルが回復の薬を使ったときぐらい厄介だ。


そして、さらに約一週間あけてラスボス(電磁気学と応用数学)が待ち構えている。


ポケモンで言うとミュウツーを捕まえるのにマスターボールがない状況だ。




この前、仙台駅のS-PALでポリゴンをゲットした。ちょっと体が丸っこいからデータ圧縮に成功したのだろう。





時折プログラムにはない動作を見せる。湿度が高くなると動きが鈍くなるみたいだ。

つゆメソ

2006-07-13 17:17:59 | 勉強
いいかげん雨降りすぎ。去年もこんなだったっけ?



外で走れなくて足にコケが生えそうになってたら、nack5で面白いこと聴いた。





テレビでもエアコンでも何でもいいからリモコンを用意して、信号が出るレンズみたいなとこをケータイのカメラ越しに見てリモコンのボタンを押すと、目に見えない赤外線がなんとカメラに写って見えるという。



実際にやって撮影してみた。





青白い光が見えた。



CMOSが人の目に見えない赤外線の領域までカバーしてるらしい。



これで電池残量を確認したり、リモコンの故障を調べたり、ヘビやメソになった気分を堪能したりするといい。




これ読んだ人今からみんなやるんだろうなw

あと15科目

2006-07-10 21:07:29 | 勉強
今日はプログラミング演習Aを300点満点でクリアした。


でも、ポケモンで言うとマサラタウンのオーキド博士のとこでライバルに勝ったぐらいで、あと15科目の敵を倒さなければならない。


明日はいきなり、先取り履修してる生命システム情報学が戦いを挑んでくる。


ポケモンで言うとニビシティでタケシと戦うあたりだ。

ヤツはおそらくsuffic trieとlongest common subsequenceを繰り出してくるからこちらはAho-Corasick automatonとdinamic programmingで備えていようと思う。



しかし、今日工学部の電気系講義棟でカタツムリを、アパートの前でカエルをモンスターボール2つだけでゲットした。

  


こいつら水系ポケモンがいればタケシの岩系ポケモンの弱点を突ける。


もう勝ったも同然だ。

化学Bの先生

2006-07-06 20:13:17 | 勉強
今日の化学熱力学の授業




「…あのCpひくCvがRっていう、なんとかって式……

…なんだっけ?


……まぁいいや。


それが……。」





!!?






もしかして今のギャグ!?





 
他に誰も反応してる様子はなかったし、先生も何もなかったかのようにしゃべり続けてる。




あまりに一瞬の出来事だった。




他に気付いた人はいないのか?




これは偶然か!?



それとも先生は狙って言ったのか?





どっちにしたって、ボケたらボケたでちゃんとつっこまなー!!




Cp-Cv=R
(定圧モル比熱-定積モル比熱=気体定数)

マイヤーの式

まぁいいや

マーイーヤ
マイヤー


セグメントエラー

2006-07-03 20:32:43 | 勉強
今日の朝の電気系二号館付近の光景





液化窒素タンクのシューという音とともに水蒸気が凝結してもくもくと…。





きっと、この隣接リストを使ったBellman-Fordアルゴリズムで誰かがヌルポインタに操作を加えたからプログラムがクラッシュしたんだろう。

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

#define F 10000

struct node{
  int code;
  char name[20];
  double rabel;
  double *distance;
  int *link;
  int stanum;
  int root;
  int step;
}*data;

int N;

int datascan(void);
void showdata(int start);
void Bellman(void);

int datascan(void)
{
  int i,j,buf1,buf2,start;
  char buffer[20];
  long loc;
  FILE *fp;
  double dis;

  if((fp=fopen("kanji.txt","r"))==NULL){
    printf("saitan.txt を開く際にエラーが発生しました。¥n");
    exit(1);
  }

  for(i=0,j=1;j>0;i++)
    fscanf(fp,"%d %20s",&j,buffer);

  N=i-1;
  loc=ftell(fp);

  if(fseek(fp,0,SEEK_SET)){
    printf("シークエラー¥n");
    exit(1);
  }

  data=(struct node *)malloc(sizeof(struct node)*N);
  if(!data){
    printf("メモリの確保に失敗しました。¥n");
    exit(1);
  }

  for(i=0;i<N;i++){
    fscanf(fp,"%d %20s",&data[i].code,&data[i].name);
    data[i].code--;
    data[i].rabel=F;
    data[i].stanum=0;
    data[i].step=F;
  }
  if(fseek(fp,loc,SEEK_SET)){
    printf("シークエラー¥n");
    exit(1);
  }


  for(;;){
    fscanf(fp,"%d %d %lf ",&buf1,&buf2,&dis);
    if(!dis)
      break;
    data[buf1-1].stanum++;
    data[buf2-1].stanum++;
  }
  for(i=0;i<N;i++){
    data[i].link=(int *)malloc(sizeof(int)*data[i].stanum);
    data[i].distance=(double *)malloc(sizeof(double)*data[i].stanum);
    if(!data[i].link || !data[i].distance){
      printf("メモリの確保に失敗しました。¥n");
      exit(1);
    }
    data[i].stanum=0;
  }
  fscanf(fp,"%d ",&start);

  if(fseek(fp,loc,SEEK_SET)){
    printf("シークエラー¥n");
    exit(1);
  }

  for(;;){
    fscanf(fp,"%d %d %lf ",&buf1,&buf2,&dis);
    if(!dis)
      break;
    data[buf1-1].link[data[buf1-1].stanum]=buf2-1;
    data[buf1-1].distance[data[buf1-1].stanum]=dis;
    data[buf1-1].stanum++;
    data[buf2-1].link[data[buf2-1].stanum]=buf1-1;
    data[buf2-1].distance[data[buf2-1].stanum]=dis;
    data[buf2-1].stanum++;
  }
  if(fclose(fp)){
    printf("ファイルを閉じる際にエラーが発生しました。¥n");
    exit(1);
  }
  return start;
}

void showdata(int start)
{
  char **buffer,name[20];
  int i,r,n,j,k;

  scanf("%d ",&j);

  for(k=0;k<j;k++){
    gets(name);
    for(i=0;i<N;i++){
      if(!strcmp(name,data[i].name)){
        n=i;
        r=n;
        break;
      }
    }
    if(i==N){
      printf("一致する駅名がありません。¥n");
      exit(1);
    }

    buffer=(char **)malloc(sizeof(char *)*(data[n].step+1));
    if(!buffer){
      printf("メモリの確保に失敗しました。¥n");
      exit(1);
    }
    for(i=0;i<data[n].step+1;i++){
      buffer[i]=(char *)malloc(20*sizeof(char));
        if(!buffer[i]){
          printf("メモリの確保に失敗しました。¥n");
          exit(1);
        }
    }

    printf("%sから%s:%.1lf km¥n",data[start].name,data[n].name,data[n].rabel/10);
    strcpy(buffer[0],data[n].name);
    for(i=1;i<data[n].step+1;i++){
      strcpy(buffer[i],data[data[r].root].name);
      r=data[data[r].root].code;
    }

    printf("path :");
    for(i=data[n].step+1;i;i--)
      printf("- %s ",buffer[i-1]);
    printf("¥n");

    for(i=0;i<data[n].step+1;i++)
      free(buffer[i]);
    free(buffer);
  }
}

void Bellman(void)
{
  int i,j,k;

  for(i=0;i<N-2;i++)
    for(j=0;j<N;j++)
      for(k=0;k<data[j].stanum;k++)
if(data[j].rabel+data[j].distance[k]<data[data[j].link[k]].rabel){
          data[data[j].link[k]].rabel=data[j].rabel+data[j].distance[k];
          data[data[j].link[k]].root=data[j].code;
          data[data[j].link[k]].step=data[j].step+1;
}
}

int main(void)
{
  int i,start;

  start=datascan()-1;

  data[start].rabel=0.0;
  data[start].step=0;

  Bellman();

  showdata(start);

  return 0;
}



合法的フライング

2006-06-15 20:41:46 | 勉強
プログラミング演習の次の課題に手をつけた。

dijkstra法での最短経路アルゴリズム。


隣接リストにさらにあんなものやこんなものを連結させた。

0から組み上げた完全にオリジナルのグラフデータ構造。


コンパイラによってはmalloc()関数がNULLポインタを返したのに気づかないでNULLポインタに操作を加えると,皿に乗ったギョウザの皮が一斉に開くことがある。

さらにfopen()関数が失敗すると、まれに寄せ鍋が離れていくことがある。


確保していないメモリにアクセスしようとしてセグメンテーションエラーが発生した場合プログラムがクラッシュして、世界中のアジが開きになる可能性があるので注意しなければいけない。

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

#define F 10000

struct node{
  int code;
  char name[20];
  int rabel;
  unsigned fix:1;
  int *distance;
  int *link;
  int stanum;
  int root;
  int step;
}*data;

int N;

int datascan(void);
void showdata(int start);
void dijkstra(void);

int datascan(void)
{
  int i,j,buf1,buf2,dis,start;
  char buffer[20];
  long loc;
  FILE *fp;

  if((fp=fopen("saitan.txt","r"))==NULL){
    printf("saitan.txt を開く際にエラー発生¥n");
    exit(1);
  }

  for(i=0,j=1;j>0;i++)
    fscanf(fp,"%d %20s",&j,buffer);
  
  N=i-1;
  loc=ftell(fp);

  if(fseek(fp,0,SEEK_SET)){
    printf("シークエラー¥n");
    exit(1);
  }

  data=(struct node *)malloc(sizeof(struct node)*N);
  if(!data){
    printf("メモリの確保に失敗しました。¥n");
    exit(1);
  }

  for(i=0;i<N;i++){
    fscanf(fp,"%d %20s",&data[i].code,&data[i].name);
    data[i].code--;
    data[i].rabel=F;
    data[i].fix=0;
    data[i].stanum=0;
    data[i].step=F;
  }
  if(fseek(fp,loc,SEEK_SET)){
    printf("シークエラー¥n");
    exit(1);
  }


  for(;;){
    fscanf(fp,"%d %d %d ",&buf1,&buf2,&dis);
    if(!dis)
      break;
    data[buf1-1].stanum++;
    data[buf2-1].stanum++;
  }
  for(i=0;i<N;i++){
    data[i].link=(int *)malloc(sizeof(int)*data[i].stanum);
    data[i].distance=(int *)malloc(sizeof(int)*data[i].stanum);
    if(!data[i].link || !data[i].distance){
      printf("メモリの確保に失敗しました。¥n");
      exit(1);
    }
    data[i].stanum=0;
  }
  fscanf(fp,"%d ",&start);

  if(fseek(fp,loc,SEEK_SET)){
    printf("シークエラー¥n");
    exit(1);
  }

  for(;;){
    fscanf(fp,"%d %d %d ",&buf1,&buf2,&dis);
    if(!dis)
      break;
    data[buf1-1].link[data[buf1-1].stanum]=buf2-1;
    data[buf1-1].distance[data[buf1-1].stanum]=dis;
    data[buf1-1].stanum++;
    data[buf2-1].link[data[buf2-1].stanum]=buf1-1;
    data[buf2-1].distance[data[buf2-1].stanum]=dis;
    data[buf2-1].stanum++;
  }
  if(fclose(fp)){
    printf("ファイルを閉じる際にエラー発生¥n");
    exit(1);
  }
  return start;
}

void showdata(int start)
{
  char **buffer,name[20];
  int i,r,n,j,k;

  scanf("%d ",&j);

  for(k=0;k<j;k++){
    gets(name);
    for(i=0;i<N;i++){
      if(!strcmp(name,data[i].name)){
        n=i;
        r=n;
        break;
      }
    }
    if(i==N){
      printf("一致する駅名がありません。¥n");
      exit(1);
    }

    buffer=(char **)malloc(sizeof(char *)*data[n].step+1);
    if(!buffer){
      printf("メモリの確保に失敗しました。¥n");
      exit(1);
    }
    for(i=0;i<data[n].step+1;i++){
      buffer[i]=(char *)malloc(20*sizeof(char));
        if(!buffer[i]){
          printf("メモリの確保に失敗しました。¥n");
          exit(1);
        }
    }

    printf("%sから%s:%d km¥n",data[start].name,data[n].name,data[n].rabel);
    strcpy(buffer[0],data[n].name);
    for(i=1;i<data[n].step+1;i++){
      strcpy(buffer[i],data[data[r].root].name);
      r=data[data[r].root].code;
    }

    printf("path :");
    for(i=data[n].step+1;i;i--)
      printf("- %s ",buffer[i-1]);
    printf("¥n");

    for(i=0;i<data[n].step+1;i++)
      free(buffer[i]);
    free(buffer);
  }
}

void dijkstra(void)
{
  int i,min=0;

  for(;;min=0){
    while(data[min].fix){
      min++;
      if(min==N)
        return ;
    }

    for(i=min+1;i<N;i++)
      if(!data[i].fix && data[min].rabel>data[i].rabel)
        min=i;
    data[min].fix++;
    for(i=0;i<data[min].stanum;i++){
      if(data[data[min].link[i]].fix && data[data[min].link[i]].step+1>data[min].step)
        data[min].step=data[data[min].link[i]].step+1;
      if(data[data[min].link[i]].fix && data[data[min].link[i]].rabel+data[min].distance[i]==data[min].rabel)
        data[min].root=data[min].link[i];
    }

    for(i=0;i<data[min].stanum;i++)
      if(data[data[min].link[i]].rabel>data[min].rabel+data[min].distance[i])
        data[data[min].link[i]].rabel=data[min].rabel+data[min].distance[i];
  }
}

int main(void)
{
  int i,start;

  start=datascan()-1;

  data[start].rabel=0;
  data[start].step=0;

  dijkstra();

  showdata(start);

  return 0;
}


大学入試における現代文否定論

2006-06-06 20:44:00 | 勉強
先週の週末に、進研ゼミの模試プレ受験のバイトをした。

ベネッセが作った問題を高校生が解く前に解いてみて、難易度や問題のミスなどをチェックするお仕事。


やったのは化学、物理、国語。

化学と物理は楽だったけど、予想通り国語がまったくダメ。なんだあの意味不明な文章は。


というか、前々から思ってたけど、大学入試の国語の現代文は悪文そのものだ。

一方で分かりやすい文章を書けと教育されて、一方で悪文を読まされるのはどう考えても矛盾している。

「傍線部Aを分かりやすく説明せよ」と問題にされてしまうほど分かりにくい文章を書く筆者が悪い。

そんな悪文を出題する出題者も悪い。


なんでそんなに現代文を嫌うかというと、分かりやすい表現があるのにムダに難解な文章を書いて、それで高度な文章だと思わせているように思えるからだ。読者が難解な文章に頭を悩ませているのを見て、筆者は「オレは頭が良いんだ。」と言っているようにしか考えられない。


そんな文章、「以前の僕はまさに貧弱な男の見本でした文章」と名付けてやる。


耐えられない

2006-06-02 21:09:19 | 勉強
線形回路論演習


のTA。

「この式にアレを代入してあげると…」

「両辺をナニで約分してあげると…」

「コレをルートで囲ってあげると…」



数式に対して「あげる」って言うなー!


さかさまに言うなー!!

うるさい

2006-05-29 20:43:40 | 勉強
プログラミング演習で、Enterキーをこれでもかというほど大きな音を立てて打つ人。


「自分は着々と進んでるぜ」アピールだろうか。


気持ちは分からなくもない。自分も中学生のときそうだったから。

でも、大学生にもなってそんなことするのはやめれ。




今日はヒープソートプログラムを組んだ。

使いたい方はご自由にどうぞ。

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

struct records{
  int code;
  int score;
};

void heapsort(int n,struct records *array);
void showdata(struct records *array,int n);
void swap(struct records *a,struct records *b);
void makeheap(int n,struct records *array);

int x=0;

int main(void)
{
  int i,n;
  struct records *array;

  scanf("%d ",&n);

  array=(struct records *)malloc(n*sizeof(struct records));
  if(!array){
    printf("もぉー。たっくんのいじわるぅ。もったいぶらないでぇー。¥n");
    exit(1);
  }

  for(i=0;i<n;i++)
    scanf("%d %d",&array[i].code,&array[i].score);

  /*showdata(array,n);*/

  heapsort(n,array);

  printf("要素数:%d  比較回数:%d¥n",n,x);

  showdata(array,n);

  return 0;
}

void heapsort(int n,struct records *array)
{
  for(;n;n--){
    makeheap(n,array);
    swap(&array[0],&array[n-1]);
  }
}

void showdata(struct records *array,int n)
{
  int i;

  for(i=n-1;i+1;i--){
    if(i)
      if(array[i].score==array[i-1].score && array[i].code>array[i-1].code)
        swap(&array[i],&array[i-1]);
    printf("%dn%dnn",array[i].code,array[i].score);
  }
  printf("¥n");
}

void swap(struct records *a,struct records *b)
{
  struct records buffer;

  buffer=*a;
  *a=*b;
  *b=buffer;
}

void makeheap(int n,struct records *array)
{
  int a=n/2,max;

  while(a){
    max=a;

    if(2*a<=n && array[max-1].score<array[2*a-1].score){
      max=2*a;
      x++;
    }
    if(2*a+1<=n && array[max-1].score<array[2*a].score){
      max=2*a+1;
      x++;
    }

    if(max==a)
        a--;
    else
      if(max==2*a){
        swap(&array[a-1],&array[2*a-1]);
        a*=2;
      }
      else
        if(max==2*a+1){
          swap(&array[a-1],&array[2*a]);
          a=2*a+1;
        }
  }
}