また、あの一文字だけの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のソースみたく書き下したものです
↓ここらへんのどこかにリンクがあったり
2009/07/05
登録:
コメントの投稿 (Atom)
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;
}
コメントを投稿