Hatena::ブログ(Diary)

arupaka-_-arupakaの日記

2010-12-09

アニールネットワーク

アニールネットワーク

#include<stdio.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<sstream>
#include<fstream>
#include<iostream>
#include<string.h>
#include<stdlib.h>

int main(){

        using namespace std;
        FILE *fp;

        std::string index;
        std::string str;
        std::string str2;
        std::map<std::string,int> outdegree;
        std::map<std::string,int> indegree;
        std::map<std::pair<int,int>,int> aij;
        std::pair<int,int> k12;
        std::map<int,int> out_num;
        std::map<int,int> in_num;
        std::set<std::string> nodelist;
        std::vector<string> in1;
        std::vector<string> out1;
        int retuno=0;
        int nodeno;
        //std::ifstream ifs("Gou125b.net");

        std::ifstream ifs("random.net");


        while(ifs && getline(ifs,str)){


                str=strtok(const_cast<char*>(str.c_str())," ");

                str2=(strtok(NULL," "));

                outdegree[str]=outdegree[str]+1;

                indegree[str2]=indegree[str2]+1;

                nodelist.insert(str);
                nodelist.insert(str2);
                out1.push_back(str)     ;
                in1.push_back(str2);
                retuno++;
                //cout << retuno<<endl;
        }

        nodeno=nodelist.size();


        std::ostringstream os;
        //printf("%d %d",nodeno,retuno);
        int i;
        for(i=0;i<retuno;i++){
                (k12).first=outdegree[out1[i]];
                (k12).second=indegree[in1[i]]   ;
                aij[k12]=aij[k12]       +1;
                //out_num[outdegree[out1[i]]]=out_num[outdegree[out1[i]]]+1;
                //in_num[indegree[in1[i]]]=in_num[indegree[in1[i]]]+1;

        }

        set<string>::iterator it2=nodelist.begin();

        while(it2!=nodelist.end()){


                out_num[outdegree[*it2]]=out_num[outdegree[*it2]]+1;
                in_num[indegree[*it2]]=in_num[indegree[*it2]]+1;
                ++it2;
        }


        map<pair<int,int>,int>::iterator it=aij.begin();

        while(it!=aij.end()){
        //str=it->first;
                cout << (it->first).first <<" "<<(it->first).second<<" "<<it->se
cond<<" "<<(double)(it->second)/(double)out_num[(it->first).first]/(double)in_nu
m[(it->first).second]<<" "<<out_num[(it->first).first]<<" "<<in_num[(it->first).
second]<<endl;
                ++it;

        }

        //map<string,int>::iterator it2=indegree.begin();
        /*
        while(it2!=indegree.end()){
                cout << it2->first <<" "<<it2->second << endl;
                ++it2;
        }
        */
}

2010-12-05

C++でネットワークの次数を求める

C++ネットワークの次数を求める

test.net

1 3

2 3

4 5

2 1


#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
#include<fstream>
#include<vector>
#include<set>

int main(){
        using namespace std;
        FILE *fp;
        std::string index;
        std::string value;
        std::string str;
        string str2;
        std::vector<string> in1;
        std::vector<string> out1;

        //new str(1000);


        std::map<std::string,int> indegree;
        std::map<std::string,int> outdegree;
        std::set<std::string> nodelist;
        std::ifstream ifs("test.net");

        while(ifs && getline(ifs,str)){


                str=strtok(const_cast<char*>(str.c_str())," ");

                str2=(strtok(NULL," "));
                //data[str]=data[str]+str2;
                /*
                if(data.find(str)!=data.end()){
                        data[(str)]=str2+data[(str)];
                }else{

                        data[(str)]=str2;

                }
                */
                in1.push_back(str);
                out1.push_back(str2);
                nodelist.insert(str);
                nodelist.insert(str2);


        }

        set<string>::iterator it1=nodelist.begin();
        while(it1 != nodelist.end()){

                indegree[*it1]=0;
                outdegree[*it1]=0;
                ++it1;

        }
        int i;

        for(i=0;i<in1.size();i++){

                indegree[in1[i]]++;
                outdegree[out1[i]]++;
        }


        it1=nodelist.begin();
        while(it1!=nodelist.end()){

                cout << (*it1) <<" "<<indegree[*it1]<<" "<<outdegree[*it1]<<endl
;
                ++it1;
        }


        return 0;
}

C++でスペース区切りのデータを連想配列に詰め込む

test.dat

1 2

1 3

1 5

3 5

2 4



 #include<stdio.h>
 #include<iostream>
 #include<map>
 #include<string>
 #include<fstream>


 int main(){
         using namespace std;
         FILE *fp;
         std::string index;
         std::string value;
         std::string str;
         char* str2;
         std::map<std::string,std::string> data;
         std::ifstream ifs("test.dat");

         while(ifs && getline(ifs,str)){


                 str=strtok(const_cast<char*>(str.c_str())," ");

                 str2=strtok(NULL," ");
                 data[str]=str2;

         }
         map<string,string>::iterator it=data.begin();
         while(it!=data.end()){

                 cout << (*it).first <<" "<< (*it).second << endl;
                 ++it;
         }

         return 0;
 }


2列目の和を求める。

#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
#include<fstream>


int main(){
        using namespace std;
        FILE *fp;
        std::string index;
        std::string value;
        std::string str;
        int str2;
        std::map<std::string,int> data;
        std::ifstream ifs("test.dat");

        while(ifs && getline(ifs,str)){


                str=strtok(const_cast<char*>(str.c_str())," ");

                str2=atoi(strtok(NULL," "));
                data[str]=data[str]+str2;
                /*
                if(data.find(str)!=data.end()){
                        data[(str)]=str2+data[(str)];
                }else{

                        data[(str)]=str2;

                }
                */


        }
        map<string,int>::iterator it=data.begin();
        while(it!=data.end()){

                cout << (*it).first <<" "<< (*it).second << endl;
                ++it;
        }

        return 0;
}

c言語でカンマ区切りの文章を読む

c言語でカンマ区切りの文章を読む

http://simd.jugem.jp/?eid=49

http://networkprogramming.blog18.fc2.com/blog-entry-89.html

strtok関数で空白で分ける。

strtok関数は、

strtok(文字列,区切り文字)の仕様。



一回目はstrok(文字列, 区切り文字)で呼ぶ。

二回目はstrok(NULL,区切り文字)で呼ぶ。

区切るものがなくなったらNULLを返す。


連続するカンマは扱えないので注意。


 #include<stdio.h>
 #include<iostream>
 #include<fstream>
 #include<string>

 int main(){

         using namespace std;

         //char str[]="a b c d e";

         char str[]="a b c d e";
         char *token;

         for(token=strtok(str," ");token!=NULL;token=strtok(NULL," ")){
                 printf("%s\n",token);
         }

 }

C++言語で連想配列風。

C++言語で連想配列風。

map型を使って楽する。


 #include <stdio.h>
 #include <string>
 #include <map>
 #include <iostream>

 int main(){
         using namespace std;
         std::map<std::string,std::string> data;
         data["a"]="AA";
         data["b"]="BB";
         data["d"]="CC";
         data["e"]="EE";

         cout << data["d"] <<"\n";

         return 0;
 }

2010-09-10

 構造体と構造体ポインタ

構造体でのキューの例。


(1)構造体の定義

(2)構造体宣言

(3)構造体ポインタ宣言

(4)アドレスを渡す。

(5)使うという順番。

struct node{
   double value;
      struct node *next;
};

int main(){
     struct node fist;
     struct node *nodeA
     nodeA=&fist;
     nodeA->value=12.1;
     nodeA->next=nodeA;

     printf("%lf\n",(nodeA->next)->value);
   printf("%lf\n",(&fist)->value);
   printf("%lf\n",(fist).value);
     return 0;
}


12.1

12.1

12.1

(1)ポイントは、メンバへのアクセスは、構造体ポインタでは、アロー演算子(->) を使うこと。普通の構造体では.を使う。


(2)構造体宣言の後、構造体ポインタを宣言して、着目する構造体のアドレスを渡してやる。

2010-06-16

 gdb の使い方

gdb はgnuのデバックのためのソフト。

例えば、セグメンテーションフォールトの位置が簡単に調べられる。


基本編

(1)特殊なオプション-gをつけてコンパイル。

gcc -O2 -g sample.c -o test.out

(2)gdbを実行

gdb test.out

(3)gdbの中でrunと打ち込む。

(gdb) run

これでセグメンテーションフォールトの場所が簡単にわかる。


print 変数

で変数の値を表示できる。