[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

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

[C言語]減算で徐算

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

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

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

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

	return 0;
}

$ ./main
a
15
b
4
answer: 3 余り:3

[C言語]数字当てゲーム

#include 
#include 
#include 

int main(){
	int n1;
	int n2;
	int i;
	char c[128];

	srand((unsigned int)time(NULL));
	n1=rand();
	n1%=100;

	for(i=1;i<=10;i++){
		printf("数字:\n");
		fflush(stdout);
		gets(c);n2=atoi(c);
		if(n1==n2) break;
		if(n1 < n2)
			printf(" 大きすぎます\n");
		else
			printf(" 小さすぎます\n");
	}
	if(i<= 10) printf("%d回目で当たり\n",i);
		else printf("アウト! 正解は%dです。\n", n1);

	return 0;
}

$ ./main
数字:
14
小さすぎます
数字:
55
小さすぎます
数字:
78
大きすぎます
数字:
67
4回目で当たり

[C言語]総和

#include 

int main(){
	int sum=0, i=1;

	while(i<=77){
		sum+=i;
		i++;
	}
	printf("1から77までの総和は%dです。\n",sum);

	return 0;
}

$ ./main
1から77までの総和は3003です。

whileではなくforでもokです。

[C言語]アスキーアート

#include 
#include 
#include 
#include 

char buf[8][64];

void Disp0(int);
void Disp1(int);
void Disp2(int);
void Disp3(int);
void Disp4(int);
void Disp5(int);
void Disp6(int);
void Disp7(int);
void Disp8(int);
void Disp9(int);
void DispC(int);


int main(){
	unsigned long t, tO=0;
	char c[128];
	int i, j, k;

	while(1){
		t = time(NULL);
		if(t == tO) continue;
		tO=t;

		strcpy(c, ctime(&t));

		for(j=0,k=0; j<8; j++,k+=8){
			switch(c[11+j]){
				case '0': Disp0(k);break;
				case '1': Disp1(k);break;
				case '2': Disp2(k);break;
				case '3': Disp3(k);break;
				case '4': Disp4(k);break;
				case '5': Disp5(k);break;
				case '6': Disp6(k);break;
				case '7': Disp7(k);break;
				case '8': Disp8(k);break;
				case '9': Disp9(k);break;
				case ':': DispC(k);break;
			}
		}
		system("cls");
		for(i=0; i<8; i++){
			printf("%.64s",&buf[i][0]);
		}
		fflush(stdout);
		if(kbhit()!=0) break;
		Sleep(900);
	}

	void Disp0(int j){
		memcpy(&buf[0][j],"######",8);
		memcpy(&buf[1][j],"#    #",8);
		memcpy(&buf[2][j],"#    #",8);
		memcpy(&buf[3][j],"#    #",8);
		memcpy(&buf[4][j],"#    #",8);
		memcpy(&buf[5][j],"#    #",8);
		memcpy(&buf[6][j],"######",8);
	}

	void Disp1(int j){
		memcpy(&buf[0][j],"     #",8);
		memcpy(&buf[1][j],"     #",8);
		memcpy(&buf[2][j],"     #",8);
		memcpy(&buf[3][j],"     #",8);
		memcpy(&buf[4][j],"     #",8);
		memcpy(&buf[5][j],"     #",8);
		memcpy(&buf[6][j],"     #",8);
	}

	void Disp2(int j){
		memcpy(&buf[0][j],"######",8);
		memcpy(&buf[1][j],"     #",8);
		memcpy(&buf[2][j],"     #",8);
		memcpy(&buf[3][j],"######",8);
		memcpy(&buf[4][j],"#     ",8);
		memcpy(&buf[5][j],"#     ",8);
		memcpy(&buf[6][j],"######",8);
	}

	void Disp2(int j){
		memcpy(&buf[0][j],"######",8);
		memcpy(&buf[1][j],"     #",8);
		memcpy(&buf[2][j],"     #",8);
		memcpy(&buf[3][j],"######",8);
		memcpy(&buf[4][j],"     #",8);
		memcpy(&buf[5][j],"     #",8);
		memcpy(&buf[6][j],"######",8);
	}

	// 省略

	return 0;
}

アスキーアートって、プログラムの中に絵を書くんだな。

[C言語]コマンドライン引数

int argcが引数の数
char *argv[]が引数のアドレス

#include 

int main(int argc, char *argv[]){

	char c[128];
	int i;

	for(i=0; i

$ ./main hello world 2020
argv[0]=./main
argv[1]=hello
argv[2]=world
argv[3]=2020

argv[0]に実行ファイルも含まれることを注意か。

[C言語]素数

素数とは、1と自分自身以外に約数を持たない数

#include 
#include 

int main(){

	int i, iStart, iEnd;
	int j, kosu;
	char c[128];

	printf("探索開始:\n");
	gets(c); iStart=atoi(c);
	printf("探索終了:\n");
	gets(c); iEnd=atoi(c);

	for(i=iStart, kosu=0; i < =iEnd; i++){
		for(j=2; j < i; j++){
			if(i%j==0) break;
		}
		if(j==i){
			if(kosu%10==0) printf("\n");
			printf("%6d ", i);
			kosu ++;
		}
	}
	printf("%d個の素数がありました。\n",kosu);

	return 0;
}

v$ ./main
探索開始:
1
探索終了:
100

2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 25個の素数がありました。

[C言語]十二支

十二支は12年周期
西暦を12で割った時に余りがないのが申(さる)

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

int main(){

	char buf[128],eto[32];
	int yy;

	printf("あなたは西暦何年生まれですか?");
	fflush(stdin);
	gets(buf);
	yy=atoi(buf);

	switch(yy % 12){
		case 0: strcpy(eto,"申(さる)");break;
		case 1: strcpy(eto,"酉(とり)");break;
		case 2: strcpy(eto,"戌(いぬ)");break;
		case 3: strcpy(eto,"亥(い)");break;
		case 4: strcpy(eto,"子(ね)");break;
		case 5: strcpy(eto,"丑(うし)");break;
		case 6: strcpy(eto,"寅(とら)");break;
		case 7: strcpy(eto,"卯(う)");break;
		case 8: strcpy(eto,"辰(たつ)");break;
		case 9: strcpy(eto,"巳(み)");break;
		case 10: strcpy(eto,"午(うま)");break;
		case 11: strcpy(eto,"未(ひつじ)");break;
	}
	printf("%s年生まれのあなたの十二支は%sです。",buf, eto);

	return 0;
}

$ ./main
あなたは西暦何年生まれですか?1990
1990年生まれのあなたの十二支は午(うま)です。

[C言語]整数型データの内部形式

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

int main(){

	char c[128], *cp;
	int a;

	printf("\n整数を入力してください:\n"); fflush(stdout); // fflushで標準入出力を即座に書き出す
	gets(c); a=atoi(c);

	cp = (char*)&a;

	printf("input data address is %p\n", &cp);

	printf("上位バイトから表示すると次のようになります。\n");
	printf("address %p: %02X\n", &cp, *cp); // %02Xは足りない部分を0で埋め、最小2桁
	printf("address %p: %02X\n", &cp+1, *(cp+1));
	printf("address %p: %02X\n", &cp+2, *(cp+2));
	printf("address %p: %02X\n", &cp+3, *(cp+3));
	return 0;
}

$ ./main

整数を入力してください:
1024
input data address is 0x7ffd473ccfd8
上位バイトから表示すると次のようになります。
address 0x7ffd473ccfd8: 00
address 0x7ffd473ccfe0: 04
address 0x7ffd473ccfe8: 00
address 0x7ffd473ccff0: 00