[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

[C言語]Beep音

Beep音とは?
-> 電子機器が通知のために発する音

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h> // for usleep
#include <sys/io.h> // for inb(バイトデータを呼び出し), outb(バイトデータを出力)

static void beep_on(void){
	outb(inb(0x61)|3, 0x61);  // 0x61はa
}

static void beep_off(void){
	outb(inb(0x61)&0xfc, 0x61);
}


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

	uint32_t count; // 32ビットの符号なし整数型

	if((ioperm(0x0040, 4, 1)) ||(ioperm(0x0061, 1, 1))){  //iopermはポートの入出力を許可
		perror("ioperm");
		return 1;
	} 

	count = 1193180 / 1000;
	outb(0xb6, 0x43);
	outb(count & 0xff, 0x42);
	outb((count>>8) & 0xff, 0x42);

	beep_on();
	usleep(1000000);
	beep_off();

	return 0;
}

$ ./main
ioperm: Operation not permitted

ん? 何故だ?

[C言語]バブルソート

隣と比べて、逆順なら入れ替える

#include 

void swap (int *x, int *y){
	int temp;

	temp = *x;
	*x = *y;
	*y = temp;
}

void bubble_sort(int array[], int array_size){
	int i, j;

	for(i = 0; i < array_size - 1; i++){
		for(j = array_size - 1; j >=  i + 1; j-- ){
			if(array[j] < array[j -1]) {swap(&array[j], &array[j-1]);}
		}
	}
}


int main(void){

	int array[10] = { 2, 1, 8, 5, 4, 7, 9, 0, 6, 3};
	int i;

	bubble_sort(array, 10);

	for(i = 0; i < 10; i++){
		printf("%d ", array[i]);
	}
	printf("\n");

	return 0;
}

$ ./main
0 1 2 3 4 5 6 7 8 9

二重でforループを回している時に、"j >= i + 1" として左から順番に大きい値を配列に入れていく。