ほかんじょ
http://w.atwiki.jp/chuo713/
ほかんじょ
ja
2010-07-14T18:35:53+09:00
1279100153
-
メニュー
https://w.atwiki.jp/chuo713/pages/2.html
メニュー
-[[トップページ]]
-[[プラグイン]]
-[[メニュー]]
-[[メニュー2]]
-[[2007前期課題(久保田)]]
--[[課題02]]
--[[課題03]]
--[[課題04]]
--[[課題05]]
--[[課題06]]
--[[課題07]]
2007後期提出課題(久保田)
-[[課題1月18〆切]] by isa
-[[かめさん]]
-[[趣味のもの]]
--[[3D]]
--[[3D-isa]]
--[[DFT-isa]]
--[[DFT]]
2010前期システムプログラム(久保田)
--[[システムプログラム01-ver00]]
--[[システムプログラム01-ver01]]
--[[システムプログラム02-ver00_client]]
--[[システムプログラム02-ver00_server]]
--[[システムプログラム02-ver01_client]]
--[[システムプログラム02-ver01_server]]
--[[システムプログラム02-ver02_client]]
--[[システムプログラム02-ver02_server]]
くぼたん
--[[個人特定問題]]
--[[システム工学(ファジーなんちゃら)-20100629]]
-[[特別企画 「年越し」]]
----
-[[@ウィキ ガイド>http://atwiki.jp/guide/]]
-[[@wiki 便利ツール >http://atwiki.jp/tools/]]
-[[@wiki>http://atwiki.jp]]
// リンクを張るには "[" 2つで文字列を括ります。
// ">" の左側に文字、右側にURLを記述するとリンクになります
**更新履歴
#recent(10)
2010-07-14T18:35:53+09:00
1279100153
-
システムプログラム02-ver02_server
https://w.atwiki.jp/chuo713/pages/46.html
/* ポート番号9000を使用する */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define NSTRS 1 /* 文字列の個数 */
#define STRMAX 60 /* 文字列長さ */
char *strs[NSTRS];
char *root;
extern int errno;
int main(int ac, char *av[]){
char c;
FILE *fp;
int fromlen;
char hostname[64];
struct hostent *hp;
register int i,s,ns;
struct sockaddr_in sin, fsin;
printf(">> server run\n");
gethostname(hostname,sizeof(hostname));
if((hp=gethostbyname(hostname))==NULL){
fprintf(stderr,"%s: unknown host.\n", hostname);
exit(1);
}
fprintf(stderr,">> hosting : %s\n", hostname);
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror("clisent: socket");
exit(1);
}
sin.sin_family=AF_INET;
sin.sin_port=htons(9000);
sin.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(s,(struct sockaddr*)&sin,sizeof(sin))<0){
perror("server: bind");
exit(1);
}
if(listen(s,5)<0){
perror("server:listen");
exit(1);
}
if((ns=accept(s,(struct sockaddr*)&fsin, &fromlen)) <0){
perror("server:accept");
exit(1);
}
fp=fdopen(ns,"r");
/* クライアントから文字列をstrs[i]に表示 変換 格納 */
printf(">> text from client\n");
for(i=0;i<NSTRS;i++){
strs[i]=malloc(STRMAX);
root=strs[i];
while((c=fgetc(fp))!=EOF){
printf("%c",c);
if(('A'<=c)&&(c<='Z')){c=c+32;}
else if(('a'<=c)&&(c<='z')){c=c-32;}
*strs[i]=c;
if(c=='\n'){break;}
strs[i]++;
}
strs[i]=root;
}
/* 文字列をクライアントに送る*/
printf(">> send to client\n");
for(i=0;i<NSTRS;i++){
printf(strs[i]);
send(ns,strs[i],strlen(strs[i]),0);
}
close(s);
exit(0);
}
2010-07-14T18:35:09+09:00
1279100109
-
システムプログラム02-ver02_client
https://w.atwiki.jp/chuo713/pages/45.html
/* ポート番号9000を使用する */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define NSTRS 1 /* 文字列の個数 */
#define STRMAX 60 /* 文字列長さ */
char *strs[NSTRS];
extern int errono;
void input_strs(){
int i;
char e[]="\n";
for(i=0;i<NSTRS;i++){
printf("str[%d]:",i);
strs[i]=malloc(STRMAX);
gets(strs[i]);
strcat(strs[i],e);
}
}
int main(int ac, char *av[]){
char c;
FILE *fp;
char hostname[64];
register int i,s;
struct hostent *hp;
struct sockaddr_in sin;
printf(">> client run\n");
/* まずホストネームを取得 */
printf("__connect server name ? :");
gets(hostname);
if((hp=gethostbyname(hostname))==NULL){
fprintf(stderr,"%s: unknown host.\n", hostname);
exit(1);
}
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror("clisent: socket");
exit(1);
}
sin.sin_family=AF_INET;
sin.sin_port=htons(9000);
bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
if(connect(s, (struct sockaddr*)&sin, sizeof(sin))<0){
perror("client: connect");
exit(1);
}
/* 送る文字列を作成する */
input_strs();
/* こちらから文字列をサーバーに送る */
for(i=0;i<NSTRS;i++)
send(s,strs[i],strlen(strs[i]),0);
fp=fdopen(s,"r");
/* サーバーから文字列を読み取り、それを表示する */
printf(">> text from server\n");
for(i=0;i<NSTRS;i++){
while((c=fgetc(fp))!=EOF){
putchar(c);
if(c=='\n')
break;
}
}
/*
*ここで、通信を切断するために、close()を用いる
*/
close(s);
exit(0);
}
2010-07-14T18:33:39+09:00
1279100019
-
システムプログラム02-ver01_server
https://w.atwiki.jp/chuo713/pages/44.html
/*
* ポート番号9000を使用する
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define NSTRS 3 /* 文字列の個数 */
#define STRMAX 10
char *strs[NSTRS];
char *tmp;
char *root;
extern int errno;
int main(int ac, char *av[]){
char c;
FILE *fp;
FILE *tfp;
int fromlen;
char hostname[64];
struct hostent *hp;
register int i,s,ns;
struct sockaddr_in sin, fsin;
printf(">> server run\n");
/*
* 何はともあれ、ホストネームを取得
*/
gethostname(hostname,sizeof(hostname));
/*
* ホストネームのネットワーク番号を取得
*/
if((hp=gethostbyname(hostname))==NULL){
fprintf(stderr,"%s: unknown host.\n", hostname);
exit(1);
}
fprintf(stderr,">> hosting : %s\n", hostname);
/*
* ソケットを取得、このソケットはインターネットドメインで、ストリーム型
*/
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror("clisent: socket");
exit(1);
}
/* アドレス構造体を作成する。ここではポート番号 9000を
* 使用する
*/
sin.sin_family=AF_INET;
sin.sin_port=htons(9000);
/*
* bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
* の代わりに、以下の INADDR_ANY を用いる
*/
sin.sin_addr.s_addr=htonl(INADDR_ANY);
/*
* アドレスとソケットを対応づける
*/
if(bind(s,(struct sockaddr*)&sin,sizeof(sin))<0){
perror("server: bind");
exit(1);
}
/*
* ソケットを通じて、サービス要求があるかどうか待機する
*/
if(listen(s,5)<0){
perror("server:listen");
exit(1);
}
/*
* サービス要求があれば、それを受理して、接続を確立する。
* 通信路を確立すると、ファイルディスクリプタ ns は
* クライアント側と繋がったものになる。
* fsinにはクライアント側のアドレスが格納される。
*/
if((ns=accept(s,(struct sockaddr*)&fsin, &fromlen)) <0){
perror("server:accept");
exit(1);
}
/*
* ソケット経由で、ファイルを読み出すファイルポインタ
*/
fp=fdopen(ns,"r");
/*
* クライアントから文字列をstrs[i]に読み出す
*/
printf(">> text from client\n");
for(i=0;i<NSTRS;i++){
strs[i]=malloc(STRMAX);
fgets(strs[i],STRMAX,fp);
printf("%s",strs[i]);
}
/*
* 変換を行う
*/
for(i=0;i<NSTRS;i++){
tmp=malloc(STRMAX);
strcpy(tmp,strs[i]);
strs[i]=malloc(STRMAX);
root=strs[i];
while(*tmp!='\n'){
if(('A'<=*tmp)&&(*tmp<='Z')){*tmp=*tmp+32;}
else if(('a'<=*tmp)&&(*tmp<='z')){*tmp=*tmp-32;}
*strs[i]=*tmp;
strs[i]++;tmp++;
}
*strs[i]='\n';
strs[i]=root;
}
/*
* 文字列をクライアントに送る
*/
printf(">> send to client\n");
for(i=0;i<NSTRS;i++){
printf(strs[i]);
send(ns,strs[i],strlen(strs[i]),0);
}
/*
* ここで単に close() を呼び出して、接続を切る
*/
close(s);
exit(0);
}
2010-07-13T21:00:12+09:00
1279022412
-
システムプログラム02-ver01_client
https://w.atwiki.jp/chuo713/pages/43.html
/* pp.215-217 */
/* connects to the local host at port 1234 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define NSTRS 3 /* 文字列の個数 */
#define STRMAX 10
/*
* サーバに送る文字列を作成する
*/
char *strs[NSTRS];
extern int errono;
void input_strs(){
int i;
char e[]="\n";
for(i=0;i<NSTRS;i++){
printf("str[%d]:",i);
strs[i]=malloc(STRMAX);
gets(strs[i]);
strcat(strs[i],e);
}
}
int main(int ac, char *av[]){
char c;
FILE *fp;
char hostname[64];
register int i,s;
struct hostent *hp;
struct sockaddr_in sin;
printf(">> client run\n");
/*
* まずホストネームを取得
*/
printf("__connect server name ? :");
gets(hostname);
input_strs();
/* gethostname(hostname,sizeof(hostname));
*/
/*
* つぎに、ホストのネットワークアドレスを取得
*/
if((hp=gethostbyname(hostname))==NULL){
fprintf(stderr,"%s: unknown host.\n", hostname);
exit(1);
}
/*
* 通信用ソケットを取得、このソケットはインターネット
* ドメインで、ストリーム型(接続型)である
*/
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror("clisent: socket");
exit(1);
}
/*
* 接続先のネットワークアドレス情報を作成する
* ここではポート番号として、9000を使用する
* 整数値はネットワークバイトオーダーに直すことに注意
* データはbcopyを用いて、構造体に格納する
*/
sin.sin_family=AF_INET;
sin.sin_port=htons(9000);
bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
/*
* 上記アドレスに接続を試みる。この接続が成功するためには
* それまでにサーバー側で上記アドレスを取得し、listen()
* システムコールを呼び出していなければならない
*/
if(connect(s, (struct sockaddr*)&sin, sizeof(sin))<0){
perror("client: connect");
exit(1);
}
/*
* こちらから文字列をサーバーに送る
*/
for(i=0;i<NSTRS;i++)
send(s,strs[i],strlen(strs[i]),0);
/*
* ソケットからデータを読み出すためのファイルポインタ
*/
fp=fdopen(s,"r");
/*
*サーバーから文字列を読み取り、それをプリントする。
*/
printf(">> text from server\n");
for(i=0;i<NSTRS;i++){
strs[i]=malloc(STRMAX);
fgets(strs[i],STRMAX,fp);
printf("%s",strs[i]);
}
/*
*ここで、通信を切断するために、close()を用いる
*/
close(s);
exit(0);
}
2010-07-13T20:59:29+09:00
1279022369
-
システムプログラム02-ver00_server
https://w.atwiki.jp/chuo713/pages/42.html
/*
* ポート番号9000を使用する
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define NSTRS 3 /* 文字列の個数 */
/*
* クライアントに送る文字列
*/
char *strs[NSTRS] = {
"This is the first string from the server.\n",
"This is the second string from the server.\n",
"This is the third string from the server.\n"
};
extern int errno;
int main(int ac, char *av[]){
char c;
FILE *fp;
int fromlen;
char hostname[64];
struct hostent *hp;
register int i,s,ns;
struct sockaddr_in sin, fsin;
/*
* 何はともあれ、ホストネームを取得
*/
gethostname(hostname,sizeof(hostname));
/*
* ホストネームのネットワーク番号を取得
*/
if((hp=gethostbyname(hostname))==NULL){
fprintf(stderr,"%s: unknown host.\n", hostname);
exit(1);
}
/*
* ソケットを取得、このソケットはインターネットドメインで、ストリーム型
*/
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror("clisent: socket");
exit(1);
}
/* アドレス構造体を作成する。ここではポート番号 9000を
* 使用する
*/
sin.sin_family=AF_INET;
sin.sin_port=htons(9000);
/*
* bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
* の代わりに、以下の INADDR_ANY を用いる
*/
sin.sin_addr.s_addr=htonl(INADDR_ANY);
/*
* アドレスとソケットを対応づける
*/
if(bind(s,(struct sockaddr*)&sin,sizeof(sin))<0){
perror("server: bind");
exit(1);
}
/*
* ソケットを通じて、サービス要求があるかどうか待機する
*/
if(listen(s,5)<0){
perror("server:listen");
exit(1);
}
/*
* サービス要求があれば、それを受理して、接続を確立する。
* 通信路を確立すると、ファイルディスクリプタ ns は
* クライアント側と繋がったものになる。
* fsinにはクライアント側のアドレスが格納される。
*/
if((ns=accept(s,(struct sockaddr*)&fsin, &fromlen)) <0){
perror("server:accept");
exit(1);
}
/*
* ソケット経由で、ファイルを読み出すファイルポインタ
*/
fp=fdopen(ns,"r");
/*
* まず文字列をクライアントに送る
*/
for(i=0;i<NSTRS;i++)
send(ns,strs[i],strlen(strs[i]),0);
/*
* そして、クライアントから文字列を読み出す
*/
for(i=0;i<NSTRS;i++){
while((c=fgetc(fp))!=EOF){
putchar(c);
if(c=='\n')
break;
}
}
/*
* ここで単に close() を呼び出して、接続を切る
*/
close(s);
exit(0);
}
2010-07-13T20:58:17+09:00
1279022297
-
システムプログラム02-ver00_client
https://w.atwiki.jp/chuo713/pages/41.html
/* pp.215-217 */
/* connects to the local host at port 1234 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define NSTRS 3 /* 文字列の個数 */
/*
* サーバに送る文字列
*/
char *strs[NSTRS] = {
"This is the first string from the client.\n",
"This is the second string from the client.\n",
"This is the third string from the client.\n"
};
extern int errno;
int main(int ac, char *av[]){
char c;
FILE *fp;
char hostname[64];
register int i,s;
struct hostent *hp;
struct sockaddr_in sin;
/*
* まずホストネームを取得
*/
gethostname(hostname,sizeof(hostname));
/*
* つぎに、ホストのネットワークアドレスを取得
*/
if((hp=gethostbyname(hostname))==NULL){
fprintf(stderr,"%s: unknown host.\n", hostname);
exit(1);
}
/*
* 通信用ソケットを取得、このソケットはインターネット
* ドメインで、ストリーム型(接続型)である
*/
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror("clisent: socket");
exit(1);
}
/*
* 接続先のネットワークアドレス情報を作成する
* ここではポート番号として、9000を使用する
* 整数値はネットワークバイトオーダーに直すことに注意
* データはbcopyを用いて、構造体に格納する
*/
sin.sin_family=AF_INET;
sin.sin_port=htons(9000);
bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
/*
* 上記アドレスに接続を試みる。この接続が成功するためには
* それまでにサーバー側で上記アドレスを取得し、listen()
* システムコールを呼び出していなければならない
*/
if(connect(s, (struct sockaddr*)&sin, sizeof(sin))<0){
perror("client: connect");
exit(1);
}
/*
* ソケットからデータを読み出すためのファイルポインタ
*/
fp=fdopen(s,"r");
/*
* 最初にサーバーから文字列を読み取り、それをプリントする。
*/
for(i=0;i<NSTRS;i++){
while((c=fgetc(fp))!=EOF){
putchar(c);
if(c=='\n')
break;
}
}
/*
* こんどはこちらから文字列をサーバーに送る
*/
for(i=0;i<NSTRS;i++)
send(s,strs[i],strlen(strs[i]),0);
/*
*ここで、通信を切断するために、close()を用いる
*/
close(s);
exit(0);
}
2010-07-13T20:57:02+09:00
1279022222
-
システム工学(ファジーなんちゃら)-20100629
https://w.atwiki.jp/chuo713/pages/40.html
<p>#include <stdio.h><br />
#include <stdlib.h></p>
<p>double f(double c){<br />
if((0<=c)&&(c<=50)){<br />
return 1.0/50*c;}<br />
else if(50<c){<br />
return 1.0;}<br />
return -1.0;<br />
}<br />
double g(double c){<br />
if((0<=c)&&(c<=20)){<br />
return 1.0;}<br />
else if((20<c)&&(c<=40)){<br />
return -1.0/20*c+2.0;}<br />
else if(40<c){<br />
return 0.0;}<br />
return -1.0;<br />
}<br />
double p(double x){<br />
if((0<=x)&&(x<=20)){<br />
return 0.0;}<br />
else if((20<x)&&(x<=40)){<br />
return 1.0/20*x-1.0;}<br />
else if((40<x)&&(x<=60)){<br />
return -1.0/20*x+3.0;}<br />
else if(60<x){<br />
return 0.0;}<br />
return -1.0;<br />
}<br />
double q(double x){<br />
if((0<=x)&&(x<=40)){<br />
return 0.0;}<br />
else if((40<x)&&(x<=60)){<br />
return 1.0/20*x-2.0;}<br />
else if((60<x)&&(x<=80)){<br />
return -1.0/20*x+4.0;}<br />
else if(80<x){<br />
return 0.0;}<br />
return -1.0;<br />
}<br />
double min(double a,double b){<br />
if(a<=b){return a;}<br />
else if(b<a){return b;}<br />
return -1;<br />
}<br />
double max(double a,double b){<br />
if(a<=b){return b;}<br />
else if(b<a){return a;}<br />
return -1;<br />
}<br />
double s(double c,double x){<br />
return max(min(f(c),p(x)),min(g(c),q(x)));<br />
}<br />
double ans(double w,double st,double en,double c){<br />
double i=st,s1=0.0,s2=0.0;<br />
while(i<=en){<br />
s1=s1+s(c,i);<br />
i=i+w;<br />
}<br />
i=st;<br />
while(i<=en){<br />
s2=s2+(i*s(c,i));<br />
i=i+w;<br />
}<br />
return s2/s1;<br />
}<br />
int main(void) {<br />
double c,w;<br />
printf("c=");<br />
scanf("%lf", &c);<br />
printf("w=");<br />
scanf("%lf", &w);<br />
printf("ans=%lf", ans(w,0,100,c));<br />
return 0;<br />
}</p>
<p>/********************************************/</p>
<p>c=30<br />
w=10<br />
ans=49.615385</p>
<p>c=43<br />
w=10<br />
ans=40.000000</p>
<p>/********************************************/</p>
2010-06-29T05:02:32+09:00
1277755352
-
個人特定問題
https://w.atwiki.jp/chuo713/pages/39.html
<p>#include <stdio.h><br /><br />
#define M 11<br />
#define N 16<br /><br />
int data[M][N];<br /><br />
void input(){<br />
int i,j;char c;<br />
for(i=0;i<M;i++){<br />
for(j=0;j<N;j++){<br />
c=getchar();<br />
/* printf("input=%d\n",c);*/<br />
if(c!=10){data[i][j]=c-48;}<br />
if(c==10){j--;}<br />
}<br />
}<br />
}<br /><br />
void q_abi(int use[M],int see[N],double abi[M]){<br />
int i,j,n;<br />
for(i=0;i<M;i++){<br />
abi[i]=0;n=0;<br />
for(j=0;j<N;j++){<br />
if((use[i]==1)&&(see[j]==1)){<br />
/*
printf("data[%d][%d]=%d,abi[%d]=%lf\n",i,j,data[i][j],i,abi[i]);<br />
*/ n++;<br />
abi[i]=abi[i]+data[i][j];<br />
}<br />
}<br />
/* printf("abi[%d]=%.2lf n=%d abi/n=%lf |p|=%lf\n",
i,abi[i],n,abi[i]/n,(abi[i]/n-0.5)*(abi[i]/n-0.5));<br />
*/<br />
if(n>0){<br />
abi[i]=(abi[i]/n-0.5)*(abi[i]/n-0.5);}<br />
if(n==0){abi[i]=1;} <br />
/* printf("== abi[%d]=%.4lf\n",i,abi[i]);<br />
*/ }<br />
}<br /><br />
void crear(int use[M],int see[N],double abi[M]){<br />
int i;<br />
for(i=0;i<M;i++){use[i]=1;}<br />
for(i=0;i<N;i++){see[i]=1;}<br />
for(i=0;i<M;i++){abi[i]=0.0;}<br />
}<br /><br />
int cho_abi(int use[M],int see[N],double abi[M]){<br />
int i,n;double tmp=1;<br />
for(i=0;i<M;i++){<br />
if(abi[i]<tmp){<br />
tmp=abi[i];<br />
n=i;<br />
}<br />
}<br />
printf("cho q=%d\n",n);<br />
return n;<br />
}<br /><br />
void kaiseki(int n,int use[M],int see[N],double abi[M]){<br />
int seetmp[N];<br />
int mem,x,i;<br />
q_abi(use,see,abi);<br />
x=cho_abi(use,see,abi);<br />
use[x]=0;<br /><br />
printf("use[%d]=0\n",x);<br /><br />
mem=0;<br />
for(i=0;i<N;i++){<br />
mem=mem+see[i];<br />
}<br />
printf("mem=%d\n", mem);<br />
<br />
if(mem>2){<br />
/*x問題=0のメンバを抽出*/<br />
for(i=0;i<N;i++){<br />
seetmp[i]=0;<br />
if((data[x][i]==1)&&(see[i]==1)){<br />
seetmp[i]=1;<br />
}<br />
}<br />
kaiseki(n+1,use,seetmp,abi);<br />
<br />
/*x問題=1のメンバを抽出*/<br />
for(i=0;i<N;i++){<br />
seetmp[i]=0;<br />
if((data[x][i]==0)&&(see[i]==1)){<br />
seetmp[i]=1;<br />
}<br />
}<br />
kaiseki(n+1,use,seetmp,abi);<br />
}<br /><br />
if(mem==2){<br />
printf("ans=%d\n",n);<br />
}<br />
}<br /><br />
int main(){<br />
int use[M];int see[N];double abi[M];<br />
crear(use,see,abi);<br />
input();<br /><br />
kaiseki(1,use,see,abi);<br /><br />
return;<br />
}</p>
2010-06-09T16:28:29+09:00
1276068509
-
システムプログラム01-ver01
https://w.atwiki.jp/chuo713/pages/38.html
<p>#include <stdio.h><br />
#include <stdlib.h><br />
#include <ctype.h><br />
#include <string.h><br /><br />
#define LIST 00<br />
#define SYMBOL 01<br /><br />
typedef struct ptr{<br />
int tag;<br />
union{<br />
struct cell{<br />
struct ptr*car;<br />
struct ptr*cdr;<br />
}cell;<br />
struct symbol{<br />
char *pname;<br />
struct ptr*plist;<br />
}symbol;<br />
long int intv;<br />
}atr;<br />
}*Ptr;<br /><br />
Ptr oblist=NULL;<br />
Ptr true_pointer;<br />
Ptr nil_pointer;<br />
Ptr dot_pointer;<br />
Ptr rpar_pointer;<br />
Ptr quote_pointer;<br />
char* pname(Ptr x) {return x->atr.symbol.pname;}<br /><br />
Ptr symbolp(Ptr x)<br />
{ if((x->tag)==SYMBOL)return true_pointer;<br />
else return nil_pointer;<br />
}<br /><br />
Ptr CAR(Ptr x) {return x->atr.cell.car;}<br />
Ptr CDR(Ptr x) {return x->atr.cell.cdr;}<br />
Ptr print_expr(Ptr x)<br />
{ if(symbolp(x)==true_pointer){<br />
fprintf(stdout, "%s",pname(x));}<br />
else if(CAR(x)==quote_pointer){<br />
fprintf(stdout, "\'");<br />
x=CDR(x);<br />
print_expr(CAR(x));<br />
x=CDR(x);<br />
while(symbolp(x)==nil_pointer){<br />
fprintf(stdout," ");<br />
print_expr(CAR(x));<br />
x=CDR(x);}<br />
if(x==nil_pointer){}<br />
else{}}<br />
else{<br />
fprintf(stdout, "(");<br />
print_expr(CAR(x));<br />
x=CDR(x);<br />
while(symbolp(x)==nil_pointer){<br />
fprintf(stdout," ");<br />
print_expr(CAR(x));<br />
x=CDR(x);}<br />
if(x==nil_pointer){<br />
fprintf(stdout,")");<br />
}else{<br />
fprintf(stdout," . %s)",pname(x));}}<br />
return nil_pointer;}<br />
Ptr new_ptr()<br />
{ Ptr p;<br />
p=(Ptr)malloc(sizeof(struct ptr));<br />
if(p==NULL)exit(1);<br />
return p;}<br /><br />
char *copy_string(char*s)<br />
{ char*p;<br />
p=malloc(strlen(s)+1);<br />
strcpy(p,s);<br />
return p;}<br /><br />
Ptr new_symbol(char *pname)<br />
{ Ptr x;<br />
x=new_ptr();<br />
x->tag=SYMBOL;<br />
x->atr.symbol.pname=copy_string(pname);<br />
x->atr.symbol.plist=nil_pointer;<br />
return x;}<br /><br />
Ptr cons(Ptr x, Ptr y)<br />
{ Ptr z;<br />
z=new_ptr();<br />
z->tag=LIST;<br />
z->atr.cell.car=x;<br />
z->atr.cell.cdr=y;<br />
return z;}<br /><br />
Ptr intern(char* s)<br />
{ Ptr p=oblist;<br />
Ptr id;<br />
while(p!=NULL&&p!=nil_pointer){<br />
if(strcmp(s,pname(CAR(p)))==0){<br />
return CAR(p);}<br />
p=CDR(p);}<br />
oblist=cons(id=new_symbol(s),oblist);<br />
return id;}<br /><br />
char buf[100];<br /><br />
Ptr read_atom(int ch)<br />
{ int i=0;<br />
buf[i++]=ch;<br />
while(isalnum(ch=getchar()))buf[i++]=ch;<br />
ungetc(ch,stdin);<br />
buf[i]=0;<br />
return intern(buf);}<br /><br />
Ptr read_expr();<br /><br />
Ptr read_expr_list()<br />
{ Ptr p;<br />
p=read_expr();<br />
if(p==rpar_pointer)return nil_pointer;<br />
if(p==dot_pointer){p=read_expr();read_expr();return p;}<br />
return cons(p, read_expr_list());}<br /><br />
Ptr read_expr()<br />
{ int ch;<br />
while(isspace(ch=getchar()));<br />
if(ch!=EOF){<br />
if(isalnum(ch)) return read_atom(ch);<br />
switch(ch){<br />
case '(':return read_expr_list();<br />
case '.':return dot_pointer;<br />
case ')':return rpar_pointer;<br />
case '\'':return
cons(quote_pointer,cons(read_expr(),nil_pointer));<br />
default:fprintf(stderr,"unknown input");<br />
return nil_pointer;}}<br />
else{<br />
exit(0);}}<br /><br />
void main()<br />
{ Ptr x,y,z,w;<br />
nil_pointer=intern("nil");<br />
nil_pointer->atr.symbol.plist=nil_pointer;<br />
oblist->atr.cell.cdr=nil_pointer;<br />
true_pointer=intern("t");<br />
printf("%p %p\n", nil_pointer, true_pointer);<br />
dot_pointer=intern(".");<br />
rpar_pointer=intern(")");<br />
quote_pointer=intern("quote");<br />
x=new_symbol("X");<br />
y=new_symbol("Y");<br />
z=cons(y,nil_pointer);<br />
w=cons(x,y);<br />
z=cons(w,z);<br />
z=cons(x,z);<br />
print_expr(z);<br />
printf("\n");<br /><br />
z=read_expr();<br />
printf("z=%p\n",z);<br />
print_expr(z);<br />
printf("\n");}</p>
2010-05-10T15:24:31+09:00
1273472671