[C言語]整数比の直角三角形

直角三角形はピタゴラスの定理が成り立つ
a^2 + b^2 = c^2

#include 

int main(){

	int a, a2, b, b2, c;

	printf("整数比の直角三角形を探索");

	for(a=1; a<= 100; a++){
		a2 = a*a;
		for(b=a; b<=100; b++){
			b2 = b*b;
			for(c=b+1; c<=100;c++){
				if(a2+b2 == c*c){
					printf("%d:%d:%d\n",a, b, c);
				}
			}
		}
	}

	return 0;
}

$ ./main
整数比の直角三角形を探索3:4:5
5:12:13
6:8:10
7:24:25
8:15:17
9:12:15
9:40:41
10:24:26
11:60:61
12:16:20
12:35:37
13:84:85
14:48:50
15:20:25
15:36:39
16:30:34
16:63:65
18:24:30
18:80:82
20:21:29
20:48:52
21:28:35
21:72:75
24:32:40
24:45:51
24:70:74
25:60:65
27:36:45
28:45:53
28:96:100
30:40:50
30:72:78
32:60:68
33:44:55
33:56:65
35:84:91
36:48:60
36:77:85
39:52:65
39:80:89
40:42:58
40:75:85
42:56:70
45:60:75
48:55:73
48:64:80
51:68:85
54:72:90
57:76:95
60:63:87
60:80:100
65:72:97

こんなにあるのか

[C言語]簡易電卓

#include 
#include 

int main(){

	char c[128],c1[128],op;
	int x=0, y=0, z=0,i=0, j;

	printf("計算式:\n");
	gets(c);

	for(j=0; c[i]>='0' && c[i]<='9'; i++){
		c1[j]=c[i];
		j++;
	}
	c1[j] = '\0'; x=atoi(c1);  // \0はNULL

	op = c[i]; i++;

	for(j=0; c[i]>='0' && c[i]<='9'; i++){ // iは第1項とoperandの次の配列から
		c1[j]=c[i];
		j++;
	}
	c1[j] = '\0'; y=atoi(c1);

	switch(op){
		case '+': z=x+y; break;
		case '-': z=x-y; break;
		case '*': z=x*y; break;
		case '/': z=x/y; break;
		case '%': z=x%y; break;
		default: printf("\a");
	}
	printf("answer: %d\n", z);

	return 0;
}

$ ./main
計算式:
22+3
answer: 25

forループを二回回しているが、2回目のiは第1項とoperandの次の配列からのiとなる
一見あれ?っと思った。

[C言語]無限ループ

#include <stdio.h>

int main(){

	char muki="L";
	int kn;

	while(1){
		system("cls");
		if(muki == 'L'){
			printf("                     \n");
            printf(" ***                 \n");
            printf("    *                \n");
            printf("     *********       \n");
            printf("      ******         \n");
            printf("       *  *          \n");
            printf("      *    *         \n");
            printf("_y_y_y*y_y_y*y_y_y_y_\n");
		} else if(muki == 'R'){
			printf("                     \n");
            printf("              ***    \n");
            printf("             *       \n");
            printf("    *********        \n");
            printf("      ******         \n");
            printf("       *  *          \n");
            printf("      *    *         \n");
            printf("_y_y_y*y_y_y*y_y_y_y_\n");
		}

		printf("\n");
		printf("<-で左向き、->で右向き、Escキーで終了\n");

		scanf("%d", &kn);
		if(kn == 27) break;  // Escキー
		if(kn!= 0) continue;

		if(kn == 77) muki="R";
		if(kn == 75) muki="L";
	}

	return 0;
}

<-で左向き、->で右向き、Escキーで終了
sh: 1: cls: not found

<-で左向き、->で右向き、Escキーで終了
sh: 1: cls: not found

<-で左向き、->で右向き、Escキーで終了
sh: 1: cls: not found

<-で左向き、->で右向き、Escキーで終了
sh: 1: cls: not found

<-で左向き、->で右向き、Escキーで終了
sh: 1: cls: not found

<-で左向き、->で右向き、Escキーで終了
sh: 1: cls: not found

<-で左向き、->で右向き、Escキーで終了

コンピュータが悲鳴を上げました。
scanf(“%d”, &kn);だと、32764となる
$ ./main
^[[C
32764

あ、キーコード取得はgetchar()だ。scanf()とこんがらがる。

#include 

int main(){

	int kn;

	kn = getchar();
	printf("%d", kn);

	return 0;
}

$ ./main
a
$ ./main
^[[C
27

[C言語]配列のアスキー

#include 
#include 
#include 
#include 

char buf[25][80];

void Gen_line(int,int,int,int);

int main(){

	int x1=5, y1=0;
	int x2=25, y2=0;
	int x3=30, y3=10;
	int y;

	memset(&buf[0][0],' ',25*80); 

	Gen_line(x1,y1,x2,y2);
	Gen_line(x2,y2,x3,y3);
	Gen_line(x3,y3,x1,y1);

	for(y=24; y > =0; y--){
		printf("%.80s",&buf[y][0]);
	}
	fflush(stdout);

	return 0;
}

void Gen_line(int xS, int yS, int xE, int yE){
	double dx, dy, a = 0, b=0;
	int x,y;

	buf[yS][xS]='*';
	buf[yE][xE]='*';

	if(xS==xE){
		if(yS > yE){
			y = yS; yS = yE; yE=y;}
			for(y=yS+1; y xE){
				x=xS; xS=xE;xE=x;y=yS;yS=yE;yE=y;
			}
			dx=xE-xS; dy=yE-yS;
			a=dy/dx; b=yS-a*xS;

			for(x = xS+1; x < xE; x++){
				y=a*x + b + 0.5;
				buf[y][x]= '*';
			}
		}
	}

$ ./main
** ** *** * ** *** * ** *** * ** *** * ** *********************

三角形になってる? 意味がわからん

[C言語]2進数から10進数への変換

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

int main(){

	char c[128];
	int i, n;

	printf("2進数に10進数に変換します\n");
	printf("2進数:\n");fflush(stdout);

	gets(c);
	// scanf("%d",&n);
	i=0; n=0;

	while(1){
		if(c[i]=='1') n = n+1;

		i=i+1;
		if(c[i]=='\0') break;
		n=n*2;
	}
	printf("10進数=%d\n", n);

	return 0;
}

$ ./main
2進数に10進数に変換します
2進数:
11111
10進数=31

[C言語]10進数から2進数への変換

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

int main(){

	char c[128];
	int n,m,i;

	printf("10進数を2進数に変換します\n");
	printf("10進数:\n");

	scanf("%d",&n);

	for(i=0; n>0; i++){
		m = n %2;
		n = n/2;
		c[i]= m + '0';
	}
	printf("答え\n");
	for(i--;i>=0;i--){
		printf("%c",c[i]);
	}
	printf("\n");

	return 0;
}

$ ./main
10進数を2進数に変換します
10進数:
9
答え
1001

[C言語]キー入力と数字の増減

#include <stdio.h>

int main(){

	int n = 0, j = 0;

	printf("キーを押すと数字が増減\n");
	printf("+:増, -:減, Esc:終了\n\n");
	while(1){
		printf("\r%06d",n);fflush(stdout);

		scanf("%d",&j);

		if(j==43){n++;continue;}
		if(j==45){n--;continue;}
		if(j==27)break;
	}
	printf("\n");
	

	return 0;
}

$ ./main
キーを押すと数字が増減
+:増, -:減, Esc:終了

0000001
0000002
000000a
000000d
000000+
000000;
000000^[
000000^C

あれ? 上手くいってない

[C言語]おみくじ

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

int main(){

	char c[128];
	int a, b;
	system("cls");
	printf("おみくじ\n");

	srand((unsigned int)time(NULL));

	while(1){
		gets(c); a=atoi(c);
		if(a==0) break;

		b = rand()%10+1;
		printf(">>>\n");

		switch((a+b)%10){
			case 0: printf("大吉"); break;
			case 1: printf("吉"); break;
			case 2: printf("吉"); break;
			case 3: printf("吉"); break;
			case 4: printf("吉"); break;
			case 5: printf("吉"); break;
			case 6: printf("凶"); break;
			case 7: printf("凶"); break;
			case 8: printf("凶"); break;
			case 9: printf("大凶"); break;
		}
		printf("\n");
	}
	

	return 0;
}

$ ./main
sh: 1: cls: not found
おみくじ
1
>>>

入力値とランダム関数を加算するってのが面白い。

[C言語]サイコロ

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

int main(){

	int n;

	printf("サイコロを振ります。\n");

	srand((unsigned int)time(NULL));

	n = rand()%6 + 1;

	if(n==1){
		printf("+-------+\n");
		printf("|       |\n");
		printf("|   ●   |\n");
		printf("|       |\n");
		printf("+-------+\n");
	} else if(n == 2){
		printf("+-------+\n");
		printf("| ●     |\n");
		printf("|       |\n");
		printf("|     ● |\n");
		printf("+-------+\n");
	} else if(n == 3){
		printf("+-------+\n");
		printf("| ●     |\n");
		printf("|   ●   |\n");
		printf("|     ● |\n");
		printf("+-------+\n");
	} else if(n == 4){
		printf("+-------+\n");
		printf("| ●   ● |\n");
		printf("|       |\n");
		printf("| ●   ● |\n");
		printf("+-------+\n");
	} else if(n == 5){
		printf("+-------+\n");
		printf("| ●   ● |\n");
		printf("|   ●   |\n");
		printf("| ●   ● |\n");
		printf("+-------+\n");
	} else{
		printf("+-------+\n");
		printf("| ●   ● |\n");
		printf("| ●   ● |\n");
		printf("| ●   ● |\n");
		printf("+-------+\n");
	}

	return 0;
}

$ ./main
サイコロを振ります。
+——-+
| |
| ● |
| |
+——-+

アスキーアートって、こういう仕組みなんだ。
職人がいるんでしょうね。

[C言語]加算で掛算

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

int main(){
	char buf[128];
	int a,b,c;

	printf("a\n");
	gets(buf);a=atoi(buf);
	printf("b\n");
	gets(buf);b=atoi(buf);

	for(c=0; b>0; b--){
		{c+=a;}
	}
	printf("answer: %d\n",c);

	return 0;
}

$ ./main
a
3
b
4
answer: 12

だいぶ佳境に入ってきたか