2009/07/05

一文字プログラミングについて

また、あの一文字だけのCプログラムの話題です

ここでは普段良く使いそうな文のことを

int a;
scanf("%d",&a);


int a;int i;char buf[256];
for(i=0;;i++){read(0,&buf[i],1);if(buf[i]==0x0A)break;}a=atoi(buf);

とでもなります

int a;
printf("%d",a);


//itoaに必要
char *strrev(char *s){char *ret = s;char *t = s;char c;while( *t != '\ 0' )t++;t--;while(t > s) {c = *s;*s = *t;*t = c;s++;t--;}return ret;}void itoa(int value, char *buff){char *p;int mod;if( 0 > value ) {*buff++ = '-';value = -value;}p = buff;do{mod = value % 10 + 48;*p++ = (char)mod;value /= 10;}while(value);*p = '\ 0'; strrev(buff); }
//ここまで

int a;int i;char buf[256];
itoa(a,buf);
for(i=0;buf[i] != '\ 0';i++){write(1,&buf[i],1);}

とでもなります

char str[256];
printf("%s",str);は

void print_string(const char* str){int i;for(i=0; str[i] != '\ 0';i++){write(1,&str[i],1);}}

という風な関数にでもなります

char str[256];
scanf("%s",str);は

char* get_str(void){int i;char *str;for(i=0;;i++){read(0,&str[i],1);if(str[i]==0x0A)break;}return str;}

という感じの関数になります

これを利用して

数を入力して素数かどうかを判定するプログラムが作れます

載せようと思いましたが

なぜか文字が変わる部分があるので

載せられませんでした

追記

と思ったら

コメント欄では普通に表示出来たので

コメント欄にいれときいました

ひとつめのコメントについて

ファイル名はprime.c 中身はA一文字

二つ目のコメントは

コンパイラオプションを

Cのソースみたく書き下したものです

               ↓ここらへんのどこかにリンクがあったり

2 件のコメント:

さすらいのオタク さんのコメント...

gcc -DA="char *strrev(char *s){char *ret = s;char *t = s;char c;while( *t != '\0' )t++;t--;while(t > s) {c = *s;*s = *t;*t = c;s++;t--;}return ret;}void itoa(int value, char *buff){char *p;int mod;if( 0 > value ) {*buff++ = '-';value = -value;}p = buff;do{mod = value % 10 + 48;*p++ = (char)mod;value /= 10;}while(value);*p = '\0'; strrev(buff); } int check_prime(int n){int i;if(n < 2) return 0;else if(n == 2) return 1; if(n % 2 == 0) return 0; for(i = 3; i * i <= n; i += 2) if(n % i == 0) return 0; return 1;}void print_string(const char* str){ int i; for(i=0; str[i] != '\0';i++){write(1,&str[i],1);}}int main(void){char buf[256];char is[4]={' ','i','s','\0'};char not[5]={' ','n','o','t','\0'};char prime[18]={' ','a',' ','p','r','i','m','e',' ','n','u','m','b','e','r','.',0x0A,'\0'};char pr[7]={'E','n','t','e','r','>','\0'};int a;int i;int result;print_string(pr);for(i=0;;i++){read(0,&buf[i],1);if(buf[i]==0x0A)break;}a=atoi(buf);result=check_prime(a);itoa(a,buf);for(i=0;buf[i] != '\0';i++){write(1,&buf[i],1);}print_string(is);if(!result){print_string(not);}print_string(prime);return 0;}" prime.c

さすらいのオタク さんのコメント...

char *strrev(char *s){
char *ret = s;
char *t = s;
char c;
while( *t != '\0' )
t++;
t--;
while(t > s) {
c = *s;
*s = *t;
*t = c;
s++;
t--;}
return ret;
}

void itoa(int value, char *buff){
char *p;
int mod;
if( 0 > value ) {
*buff++ = '-';
value = -value;
}
p = buff;
do{
mod = value % 10 + 48;
*p++ = (char)mod;
value /= 10;
}while(value);

*p = '\0';
strrev(buff);
}

int check_prime(int n){
int i;
if(n < 2) return 0;
else if(n == 2) return 1;
if(n % 2 == 0) return 0;
for(i = 3; i * i <= n; i += 2)
if(n % i == 0) return 0;

return 1;
}

void print_string(const char* str){
int i;
for(i=0; str[i] != '\0';i++){
write(1,&str[i],1);
}
}

int main(void){
char buf[256];
char is[4]={' ','i','s','\0'};
char not[5]={' ','n','o','t','\0'};
char prime[18]={' ','a',' ','p','r','i','m','e',' ','n','u','m','b','e','r','.',0x0A,'\0'};
char pr[7]={'E','n','t','e','r','>','\0'};
int a;
int i;
int result;

print_string(pr);
for(i=0;;i++){
read(0,&buf[i],1);
if(buf[i]==0x0A)break;
}
a=atoi(buf);

result=check_prime(a);

itoa(a,buf);
for(i=0;buf[i] != '\0';i++){
write(1,&buf[i],1);
}

print_string(is);
if(!result){print_string(not);}
print_string(prime);

return 0;
}