지금 제가 화학 반응 계산기라는 것을 만들게 되었습니다.

물론 제가 지금 지원하는 산성은 3개

염기성은 2개로 고2 수준(?)의 화1을 배우는 내용을 다루고 있습니다.


내용으로는 산성을 띄는 화학식과 염기성을 띄는 화학식 하나가 만나게 되어서 중화 반응이 일어나는 내용입니다.



#include <stdio.h>

#include <Windows.h>

#include <stdlib.h>

#include <string.h>


//false 0

//true 1


#define max_max 15


int main() {

int hydrogen_chloride = 0; //염화수소를 불러오고 거짓의 형태로 바꾼다.

int sulfuric_acid = 0; //황산을 불러오고 거짓의 형태로 바꾼다.

int nitric_acid = 0; //질산을 불러오고 거짓의 형태로 바꾼다.

int sodium_hydroxide = 0; //수산화나트륨을 불러오고 거짓의 형태로 바꾼다.

int potassium_hydroxide = 0; //수산화칼슘을 불러오고 거짓의 형태로 바꾼다.


int aCid = 0; //산성 용액이 있는 지 없는 지를 판단하는 수단으로 거짓의 형태로 바꾼다.

int bAsic = 0; //염기성 용액이 있는 지 없는 지를 판단하는 수단으로 거짓의 형태로 바꾼다.


char acid[1][max_max]; //산성을 입력하는 15칸 짜리를 만든다.

char basic[1][max_max];//염기성을 입력하는 15칸 짜리를 만든다.


float acidic_solution; //산성의 용액양

float base_solution;   //염기성의 용액양


float acidic_Concentration; //산성 농도

float base_Concentration;  //염기성 농도


float acidic_end; //산성 용액과 농도 총 합

float base_end; //염기성 용액과 농도 총 합

int i; //반복을 담당함


printf("입력하는 방식은 다양합니다.\n물의 화학식으로 예를 들면\nH(2)O으로 입력을 해야 합니다.\n");

printf("그러면 먼저 산성을 입력해 주세요 : ");

aCid = 0; //산성이 달성이 되었는가 아닌가를 판단하는 것이므로 거짓으로 셋팅

bAsic = 0;//염기성이 달성이 되었는가 아닌가를 판단하는 것이므로 거짓으로 셋팅

gets(acid); //산성을 입력하여 산성이라는 변수에 저장을 함

getchar(); //버퍼(입력란)을 초기화함

printf("산성 용액의 ml당 농도는 얼마로 설정할까요? 기본은 1입니다. : "); 

scanf_s("%d", &acidic_Concentration); //산성의 농도를 입력받아 농도를 담당하는 변수에 저장함

getchar();//버퍼(입력란)을 초기화함

printf("\n산성 용액의 양은 어느 정도로 할까요?? (단위는 ml) : ");

scanf_s("%d", &acidic_solution); //산성의 용액 양을 입력받아 양을 담당하는 변수에 저장함

getchar();//버퍼(입력란)을 초기화함

printf("\n그러면 이제 염기성의 용액을 입력해 주세요 : ");

gets(basic);//염기성을 입력하여 염기성이라는 변수에 저장을 함

getchar(); //버퍼(입력란)을 초기화함

printf("염기성 용액의 ml당 농도는 얼마로 설정할까요? 기본은 1입니다. : ");

scanf_s("%d", &base_Concentration); //염기성의 농도를 입력받아 농도를 담당하는 변수에 저장함

getchar();//버퍼(입력란)을 초기화함

printf("\n염기성 용액의 양은 어느 정도로 할까요?? (단위는 ml) : ");

scanf_s("%d", &base_solution); //염기성의 용액 양을 입력받아 양을 담당하는 변수에 저장함

printf("\n");



acidic_end = acidic_Concentration * acidic_solution; //농도의 정도를 파악하기 위해 용액의 양과 농도를 곱함

base_end = base_solution * base_Concentration; //농도의 정도를 파악하기 위해 용액의 양과 농도를 곱함


for (i = 0; i < 15; i++) {

if (acid[i] == 'H' && acid[i + 1] == 'C' && acid[i + 2] == 'l') { 

hydrogen_chloride = 1;

sulfuric_acid = 0;

nitric_acid = 0;

aCid = 1;

break;

}

}

if (aCid == 0) {

for (i = 0; i < 15; i++) {

if (acid[i] == 'H'&& acid[i + 1] == '('&& acid[i + 2] == '2'&& acid[i + 3] == ')'&& acid[i + 4] == 'S'&& acid[i + 5] == 'O'&&acid[i + 6] == '('&&acid[i + 7] == '4'&&acid[i + 8] == ')') {

hydrogen_chloride = 0;

sulfuric_acid = 1;

nitric_acid = 0;

aCid = 1;

break;

}

}

}

if (aCid == 0) {

for (i = 0; i < 15; i++)

if (acid[i] == 'H' && acid[i + 1] == 'N' && acid[i + 2] == 'O' && acid[i + 3] == '(' && acid[i + 4] == '3' && acid[i + 5] == ')') {

hydrogen_chloride = 0;

sulfuric_acid = 0;

nitric_acid = 1;

aCid = 1;

break;

}

}


for (i = 0; i < 15; i++) {

if (basic[i] == 'N' && basic[i + 1] == 'a' && basic[i + 2] == 'O' && basic[i + 3] == 'H') {

sodium_hydroxide = 1;

potassium_hydroxide = 0;

bAsic = 1;

break;

}

}

if (bAsic == 0) {

for (i = 0; i < 15; i++) {

if (basic[i] == 'C' && basic[i + 1] == 'a' && basic[i + 2] == '(' && basic[i + 3] == 'O' && basic[i + 4] == 'H'&&basic[i + 5] == ')'&&basic[i + 6] == '('&&basic[i + 7] == '3'&&basic[i + 8] == ')') {

sodium_hydroxide = 0;

potassium_hydroxide = 0;

bAsic = 1;

break;

}

}

}



if (acidic_end < base_end) {

printf("반응 후의 용액은 염기성이 됩니다.\n");

}

else if (acidic_end == base_end) {

printf("반응 후의 용액은 중성이 됩니다.\n");

}

else if (acidic_end > base_end) {

printf("반응 후의 용액은 산성이 됩니다.\n");

}


if (hydrogen_chloride == 1 && sodium_hydroxide == 1) { //염화수소하고 수산화나트륨반응

printf("H(2)O  +  Cl^-  +  Na^+ 가 반응 후 화학식이 됩니다.\n");

}

if (hydrogen_chloride == 1 && potassium_hydroxide == 1) { //염화수소하고 수산화칼슘반응

printf("H(2)O  +  Cl^-  +  Ca^+ 가 반응 후 화학식이 됩니다.\n");

}

if (sulfuric_acid == 1 && sodium_hydroxide == 1) { //황산하고 수산화나트륨반응

printf("H(2)O  +  H^+  +  SO(4)^-  +  Na^- 가 반응 후 화학식이 됩니다.\n");

}

if (sulfuric_acid == 1 && potassium_hydroxide == 1) { //황산하고 수산화칼슘반응

printf("H(2)O  +  H^+  +  SO(4)^-  +  Ca^- 가 반응 후 화학식이 됩니다.\n");

}

if (nitric_acid == 1 && sodium_hydroxide == 1) { //질산하고 수산화나트륨반응

printf("H(2)O  +  NO(3)^-  +  Na^- 가 반응 후 화학식이 됩니다.\n");

}

if (nitric_acid == 1 && potassium_hydroxide == 1) { //질산하고 수산화칼슘반응

printf("H(2)O  +  NO(3)^-  +  Ca^- 가 반응 후 화학식이 됩니다.\n");

}

printf("\n\n\n");

getchar();

return 0;

}

해당 코드는 전부 공개 처리를 하도록 하겠습니다.

해당 코드는 아마 제 글을 읽으셨더라면 이해하는 것에 관해서는 무리가 없게 하였습니다.


주석을 전부 읽으신다면 아마도 가능하지 않을까 싶습니다.


해당 코드는 버그가 있는 코드이므로 새로 수정한 코드를 올리도록 하겠습니다.

#include <stdio.h>

#include <Windows.h>

#include <stdlib.h>

#include <string.h>


//false 0

//true 1


#define max_max 15


int main() {

int hydrogen_chloride = 0; //염화수소를 불러오고 거짓의 형태로 바꾼다.

int sulfuric_acid = 0; //황산을 불러오고 거짓의 형태로 바꾼다.

int nitric_acid = 0; //질산을 불러오고 거짓의 형태로 바꾼다.

int sodium_hydroxide = 0; //수산화나트륨을 불러오고 거짓의 형태로 바꾼다.

int potassium_hydroxide = 0; //수산화칼슘을 불러오고 거짓의 형태로 바꾼다.


int aCid = 0; //산성 용액이 있는 지 없는 지를 판단하는 수단으로 거짓의 형태로 바꾼다.

int bAsic = 0; //염기성 용액이 있는 지 없는 지를 판단하는 수단으로 거짓의 형태로 바꾼다.


char acid[1][max_max]; //산성을 입력하는 15칸 짜리를 만든다.

char basic[1][max_max];//염기성을 입력하는 15칸 짜리를 만든다.


float acidic_solution; //산성의 용액양

float base_solution;   //염기성의 용액양


float acidic_Concentration; //산성 농도

float base_Concentration;  //염기성 농도


float acidic_end; //산성 용액과 농도 총 합

float base_end; //염기성 용액과 농도 총 합

int i; //반복을 담당함


//char *ptr_acid; // 산성의 체크

//char *ptr_base; // 염기의 체크


printf("입력하는 방식은 다양합니다.\n물의 화학식으로 예를 들면\nH(2)O으로 입력을 해야 합니다.\n");

printf("그러면 먼저 산성을 입력해 주세요 : ");

aCid = 0; //산성이 달성이 되었는가 아닌가를 판단하는 것이므로 거짓으로 셋팅

bAsic = 0;//염기성이 달성이 되었는가 아닌가를 판단하는 것이므로 거짓으로 셋팅

gets(acid); //산성을 입력하여 산성이라는 변수에 저장을 함

getchar(); //버퍼(입력란)을 초기화함

printf("산성 용액의 ml당 농도는 얼마로 설정할까요? 기본은 1입니다. : "); 

scanf_s("%d", &acidic_Concentration); //산성의 농도를 입력받아 농도를 담당하는 변수에 저장함

getchar();//버퍼(입력란)을 초기화함

printf("\n산성 용액의 양은 어느 정도로 할까요?? (단위는 ml) : ");

scanf_s("%d", &acidic_solution); //산성의 용액 양을 입력받아 양을 담당하는 변수에 저장함

getchar();//버퍼(입력란)을 초기화함

printf("\n그러면 이제 염기성의 용액을 입력해 주세요 : ");

gets(basic);//염기성을 입력하여 염기성이라는 변수에 저장을 함

getchar(); //버퍼(입력란)을 초기화함

printf("염기성 용액의 ml당 농도는 얼마로 설정할까요? 기본은 1입니다. : ");

scanf_s("%d", &base_Concentration); //염기성의 농도를 입력받아 농도를 담당하는 변수에 저장함

getchar();//버퍼(입력란)을 초기화함

printf("\n염기성 용액의 양은 어느 정도로 할까요?? (단위는 ml) : ");

scanf_s("%d", &base_solution); //염기성의 용액 양을 입력받아 양을 담당하는 변수에 저장함

printf("\n");



acidic_end = acidic_Concentration * acidic_solution; //농도의 정도를 파악하기 위해 용액의 양과 농도를 곱함

base_end = base_solution * base_Concentration; //농도의 정도를 파악하기 위해 용액의 양과 농도를 곱함


for (i = 0; i < 15; i++) {

if (strstr(acid, "HCl")) {

hydrogen_chloride = 1;

sulfuric_acid = 0;

nitric_acid = 0;

aCid = 1;

break;

}

}

if (aCid == 0) {

for (i = 0; i < 15; i++) {

if (strstr(acid, "H(2)SO(4)")) {

hydrogen_chloride = 0;

sulfuric_acid = 1;

nitric_acid = 0;

aCid = 1;

break;

}

}

}

if (aCid == 0) {

for (i = 0; i < 15; i++)

if (strstr(acid, "HNO(3)")) {

hydrogen_chloride = 0;

sulfuric_acid = 0;

nitric_acid = 1;

aCid = 1;

break;

}

}


for (i = 0; i < 15; i++) {

if (strstr(basic, "NaOH")) {

sodium_hydroxide = 1;

potassium_hydroxide = 0;

bAsic = 1;

break;

}

}

if (bAsic == 0) {

for (i = 0; i < 15; i++) {

if (strstr(basic, "Ca(OH)(2)")) {

sodium_hydroxide = 0;

potassium_hydroxide = 0;

bAsic = 1;

break;

}

}

}



if (acidic_end < base_end) {

printf("반응 후의 용액은 염기성이 됩니다.\n");

}

else if (acidic_end == base_end) {

printf("반응 후의 용액은 중성이 됩니다.\n");

}

else if (acidic_end > base_end) {

printf("반응 후의 용액은 산성이 됩니다.\n");

}


if (hydrogen_chloride == 1 && sodium_hydroxide == 1) { //염화수소하고 수산화나트륨반응

printf("H(2)O  +  Cl^-  +  Na^+ 가 반응 후 화학식이 됩니다.\n");

}

if (hydrogen_chloride == 1 && potassium_hydroxide == 1) { //염화수소하고 수산화칼슘반응

printf("H(2)O  +  Cl^-  +  Ca^+ 가 반응 후 화학식이 됩니다.\n");

}

if (sulfuric_acid == 1 && sodium_hydroxide == 1) { //황산하고 수산화나트륨반응

printf("H(2)O  +  H^+  +  SO(4)^-  +  Na^- 가 반응 후 화학식이 됩니다.\n");

}

if (sulfuric_acid == 1 && potassium_hydroxide == 1) { //황산하고 수산화칼슘반응

printf("H(2)O  +  H^+  +  SO(4)^-  +  Ca^- 가 반응 후 화학식이 됩니다.\n");

}

if (nitric_acid == 1 && sodium_hydroxide == 1) { //질산하고 수산화나트륨반응

printf("H(2)O  +  NO(3)^-  +  Na^- 가 반응 후 화학식이 됩니다.\n");

}

if (nitric_acid == 1 && potassium_hydroxide == 1) { //질산하고 수산화칼슘반응

printf("H(2)O  +  NO(3)^-  +  Ca^- 가 반응 후 화학식이 됩니다.\n");

}

printf("\n\n\n");

Sleep(12300);

return 0;

}

아래의 것은 재귀함수를 통한 반복과 키보드에서 나가는 명령어를 추가하였습니다.

#include <stdio.h>

#include <Windows.h>

#include <stdlib.h>

#include <string.h>


//false 0

//true 1


#define max_max 15


int main() {

int hydrogen_chloride = 0; //염화수소를 불러오고 거짓의 형태로 바꾼다.

int sulfuric_acid = 0; //황산을 불러오고 거짓의 형태로 바꾼다.

int nitric_acid = 0; //질산을 불러오고 거짓의 형태로 바꾼다.

int sodium_hydroxide = 0; //수산화나트륨을 불러오고 거짓의 형태로 바꾼다.

int potassium_hydroxide = 0; //수산화칼슘을 불러오고 거짓의 형태로 바꾼다.


int aCid = 0; //산성 용액이 있는 지 없는 지를 판단하는 수단으로 거짓의 형태로 바꾼다.

int bAsic = 0; //염기성 용액이 있는 지 없는 지를 판단하는 수단으로 거짓의 형태로 바꾼다.


char acid[1][max_max]; //산성을 입력하는 15칸 짜리를 만든다.

char basic[1][max_max];//염기성을 입력하는 15칸 짜리를 만든다.


int acidic_solution; //산성의 용액양

int base_solution;   //염기성의 용액양


int acidic_Concentration; //산성 농도

int base_Concentration;  //염기성 농도


int acidic_end; //산성 용액과 농도 총 합

int base_end; //염기성 용액과 농도 총 합

int i; //반복을 담당함


//char *ptr_acid; // 산성의 체크

//char *ptr_base; // 염기의 체크


printf("입력하는 방식은 다양합니다.\n물의 화학식으로 예를 들면\nH(2)O으로 입력을 해야 합니다.\n");

printf("종료하시려면 산성 입력시에 'x'만 입력해 주세요\n");

printf("그러면 먼저 산성을 입력해 주세요 : ");

aCid = 0; //산성이 달성이 되었는가 아닌가를 판단하는 것이므로 거짓으로 셋팅

bAsic = 0;//염기성이 달성이 되었는가 아닌가를 판단하는 것이므로 거짓으로 셋팅

gets(acid); //산성을 입력하여 산성이라는 변수에 저장을 함

getchar(); //버퍼(입력란)을 초기화함

if (strstr(acid, "x")) {

return 0;

}

printf("산성 용액의 ml당 농도는 얼마로 설정할까요? 기본은 1입니다. : "); 

scanf_s("%d", &acidic_Concentration);

getchar();//버퍼(입력란)을 초기화함

printf("\n산성 용액의 양은 어느 정도로 할까요?? (단위는 ml) : ");

scanf_s("%d", &acidic_solution); //산성의 용액 양을 입력받아 양을 담당하는 변수에 저장함

acidic_end = acidic_Concentration * acidic_solution;

getchar();//버퍼(입력란)을 초기화함

printf("\n그러면 이제 염기성의 용액을 입력해 주세요 : ");

gets(basic);//염기성을 입력하여 염기성이라는 변수에 저장을 함

getchar(); //버퍼(입력란)을 초기화함

printf("염기성 용액의 ml당 농도는 얼마로 설정할까요? 기본은 1입니다. : ");

scanf_s("%d", &base_Concentration); //염기성의 농도를 입력받아 농도를 담당하는 변수에 저장함

getchar();//버퍼(입력란)을 초기화함

printf("\n염기성 용액의 양은 어느 정도로 할까요?? (단위는 ml) : ");

scanf_s("%d", &base_solution); //염기성의 용액 양을 입력받아 양을 담당하는 변수에 저장함

getchar();

base_end = base_Concentration * base_solution;

printf("\n");



//acidic_end = acidic_Concentration * acidic_solution; //농도의 정도를 파악하기 위해 용액의 양과 농도를 곱함

//base_end = base_solution * base_Concentration; //농도의 정도를 파악하기 위해 용액의 양과 농도를 곱함



//acidic_end = acidic_Concentration * acidic_solution;

//printf("%d\n", acidic_end);

//base_end = base_Concentration * base_solution;

//printf("%d\n", base_end);



for (i = 0; i < 15; i++) {

if (strstr(acid, "HCl")) {

hydrogen_chloride = 1;

sulfuric_acid = 0;

nitric_acid = 0;

aCid = 1;

break;

}

}

if (aCid == 0) {

for (i = 0; i < 15; i++) {

if (strstr(acid, "H(2)SO(4)")) {

hydrogen_chloride = 0;

sulfuric_acid = 1;

nitric_acid = 0;

aCid = 1;

break;

}

}

}

if (aCid == 0) {

for (i = 0; i < 15; i++)

if (strstr(acid, "HNO(3)")) {

hydrogen_chloride = 0;

sulfuric_acid = 0;

nitric_acid = 1;

aCid = 1;

break;

}

}


for (i = 0; i < 15; i++) {

if (strstr(basic, "NaOH")) {

sodium_hydroxide = 1;

potassium_hydroxide = 0;

bAsic = 1;

break;

}

}

if (bAsic == 0) {

for (i = 0; i < 15; i++) {

if (strstr(basic, "Ca(OH)(2)")) {

sodium_hydroxide = 0;

potassium_hydroxide = 0;

bAsic = 1;

break;

}

}

}



if (acidic_end < base_end) {

printf("반응 후의 용액은 염기성이 됩니다.\n");

}

else if (acidic_end == base_end) {

printf("반응 후의 용액은 중성이 됩니다.\n");

}

else if (acidic_end > base_end) {

printf("반응 후의 용액은 산성이 됩니다.\n");

}


if (hydrogen_chloride == 1 && sodium_hydroxide == 1) { //염화수소하고 수산화나트륨반응

printf("H(2)O  +  Cl^-  +  Na^+ 가 반응 후 화학식이 됩니다.\n");

}

if (hydrogen_chloride == 1 && potassium_hydroxide == 1) { //염화수소하고 수산화칼슘반응

printf("H(2)O  +  Cl^-  +  Ca^+ 가 반응 후 화학식이 됩니다.\n");

}

if (sulfuric_acid == 1 && sodium_hydroxide == 1) { //황산하고 수산화나트륨반응

printf("H(2)O  +  H^+  +  SO(4)^2-  +  Na^- 가 반응 후 화학식이 됩니다.\n");

}

if (sulfuric_acid == 1 && potassium_hydroxide == 1) { //황산하고 수산화칼슘반응

printf("H(2)O  +  H^+  +  SO(4)^2-  +  Ca^- 가 반응 후 화학식이 됩니다.\n");

}

if (nitric_acid == 1 && sodium_hydroxide == 1) { //질산하고 수산화나트륨반응

printf("H(2)O  +  NO(3)^-  +  Na^- 가 반응 후 화학식이 됩니다.\n");

}

if (nitric_acid == 1 && potassium_hydroxide == 1) { //질산하고 수산화칼슘반응

printf("H(2)O  +  NO(3)^-  +  Ca^- 가 반응 후 화학식이 됩니다.\n");

}

printf("\n\n\n");

main();

return 0;

}


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

이것도 중복 강좌일 수도 있습니다.

하지만 저는 굳이 한 번 더 하고 싶어서 이렇게 올리게 됩니다.

게시한 글이 많아지고 점점 오래되다 보니 기억이 살짝 애매해지는 것 같군요

일단 노화는 아닙니다.

왜냐하면 제가 자율동아리에서 부장을 맡았는데 어쩌다보니 부장인 제가 프로그래밍 강의를 하고 있기에.... 쿨럭!! 아무튼!! 하도록 하겠습니다.

(그리고 다른 블로그에 있는 강좌 왜 안하시는 지?? 라고 물으신다면 저는 할 말이 없습니다. 저는 제가 독학을 하면서 예제를 직접 만들어 공부했고 그때 쓰던 방식들만 알고 있기때문에 저는 그것들을 먼저 차근차근 해나아가고 싶습니다. 뭐 나중에 정식으로 배운다면 시즌 2라는 것을 달고 다시 올리기는 할 겁니다.)

변수선언이라는 것은 다른 이름으로 자료형이라는 것을 말하기도 합니다.

저는 변수선언이라는 말을 더 많이 쓰지만 다른 이름인 자료형이라는 것도 알아두셨으면 합니다.

일단 다른 강좌에서는 자료형이라고 표현을 하고 있으니 제 강좌를 보신다면 

자료형이라는 것을 검색하셔서 다른 강좌도 찾아보셨으면 합니다.

먼저 자료형은 4가지 외 한개로 이루어져 있습니다.

문자형, 정수형, 실수형, void형 외 기타

이렇게 이루어져있습니다. 

 문자형 - char, unsigned char

 정수형 - int, unsigned int, short, unsigned short, long, unsigned long

 실수형 - float, double

정수형은 가우스기호를 씌운 느낌의 방식입니다.

그러니깐 소수점이 없는 형태라는 소리죠.

반면 실수형은 소수점이 있어도 됩니다.

또, 문자를 표현하는 방법으로는 각 문자에 코드를 부여해서 표기하는 방법입니다.

C언어는 알파벳의 대소문자도 구별을 합니다.

그러면 다음 강좌에서 봐요!

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

콘솔창의 크기는 원래 마음데로 하지 못하고 있었습니다.

하지만, 오늘 이 글을 보신 뒤 부터는 콘솔창을 전체화면 또는 지뢰찾기 초급 수준으로 늘리시거나 줄이실 수 있습니다!

그래서 저는 간단하게 코드를 보여드리려고 합니다.

1
2
3
4
5
#include <stdio.h>
#include <windows.h>
int test() {
system("mode con cols=70 lines=70");
}
cs

이렇게 나옵니다.

이렇게 만들어 놓으면 가로 70 세로 70크기의 콘솔창이 뜹니다.

그리고 가로는 cols이고 lines가 세로가 되는 것입니다.

이것들은 이전 강좌에서 계속해서 알아보고 있는 windows헤더선언이 되어있다면 아마 언제든지 사용이 가능하리라고 생각을 하고 있습니다.

알맞은 크기로 만들어 보는 것은 어떨까요???

그리고 한가지 더!! 주의를 하셔야 할 점이 있습니다.

정사각형의 꼴을 맞추고 싶으시다면 가로는 70 세로는 35로 약 가로와 세로의 비율이 70 : 35 = 가로 : 세로 와 같은 2배의 형태가 되는 것이 좋습니다.

괜히 제가 저렇게 70 : 70으로 맞추었다고 해서 그렇게 하시면 안됩니다.

그러면 다음으로 색을 바꾸도록 하겠습니다.

색상은 조금 복잡하다고 생각을 합니다.

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <windows.h>
test(int color_number) {
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color_number);
}
int main() {
  test(14);
  printf("테스팅\n");
  return 0;
}
cs

이렇게 되는 것인데 이전 함수 선언을 했을 때를 응용하여 text의 색상을 원하는 색으로 변형이 가능해지는 것입니다.

이렇게 되는 것인데 이것이 출력되는 비슷한 코드를 사진으로 준비를 했습니다.

코드를 복사만 하는 것은 좋지 않은 방법이니 제가 올린 사진을 보고 부디 따로 작성을 하셨으면 합니다.


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

오늘은 실행을 잠시 멈추는 것을 뜻하는 대기 함수에 대하여 강좌를 시작하려고 하는데요.

이것은 잠깐의 대기를 하라고 하는 코드입니다.

코드는 간단하지만 우리가 흔하게 알고 있는 시간의 개념과는 조금 많이 다르니 그 점은 유의를 해주시기를 바랍니다.

Sleep (1000);

이라는 코드는 우리가 알고 있는 단위인 초, 분, 시각 과는 전혀 다른 느낌입니다.

밀리초 라는 단위로 1000을 입력해야 1초라는 시간이 완성되는 것이지요.

그리고 이 명령어역시 windows라는 헤더파일( windows.h )을 사용하겠다고 선언을 해야 비로소 사용이 가능해지는 내장함수입니다.

그러면 다음 주제인 주석이라는 녀석으로 넘어가 볼까 합니다.

주석이라는 것은 원래 먼저 설명을 했어야 하는 것이지만 제가 부득이 하게 잊어버리게 된 관계로 살짝 늦어지지 않았나 합니다.

이전에 설명을 했지만 잊어버린 것이라면 뭐.... 할 말은 없습니다.

주석의 종류는 2가지가 존재합니다.

하나는 ' // '로 슬래시 두개가 연속으로 나온 뒤의 enter가 press되기 전까지 전부 프로그래밍의 코드라고 인식을 하지 않습니다.

그리고 다른 또하나는 ' /* 주석 내용 */ '이라는 주석이 존재하는 데요 저 /**/ 사이에 들어가는 모든 문장은 주석으로 인식하여 코드를 실행하지 않습니다.

이런 것은 다른 사람에게 나의 코드를 설명하는 과정또는 버그를 테스팅하기 위해서 사용을 하는 경우가 있습니다.

저는 주로 전자에서 사용을 더 하지만요

그렇다고 해서 제가 코드를 짠 것은 무조건 버그가 없다는 것이 아닙니다.

아직까지는 제가 기억을 하고 원하는 파트를 수정하고 테스팅하는 과정을 사용을 할 뿐이지요 코드를 아에 삭제할 필요는 없다고 보니깐요.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

제목에도 나와있듯이 오늘을 실행창(명령창 또는 cmd)에 출력되는 것들을 전부 삭제해 보겠습니다.

헤더는 windows헤더입니다. ( windows.h )

그러면 바로 핵심 코드를 본다면

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <windows.h>
int main() {
  printf("안녕하세요?\n");
  system("cls");
  printf("안녕?\n");
  return 0;
}
cs

이런 식으로 나옵니다.

그런데 이거 바로 '안녕?'이 출력이 될겁니다.

이거에 관하여는 다음 강좌인 대기 함수라는 것을 할 때 진행을 하려고 합니다.

그러면 이제는 분석을 들어가야 하는 타이밍입니다.

#include <windows.h>라는 구절이 있습니다.

이는 windows라는 헤더파일을 사용하겠다라고 표현을 하는 것입니다.

그래서 실제로 windows헤더 파일에 있는 내장함수(헤더파일 내에 존재하는 함수들)를 사용하는 것인데요 그 중 하나가 system ("cls");입니다.

이것은 출력창(실행창 또는 cmd)에 출력이 된 모든 문장을 지우는 것으로 가독성을 상승시켜주고 제가 앞으로 베타 테스팅에 돌입하면서 사용을 하게 되는 것이기도 합니다.

실제로 제가 올려놓은 게임 예제를 보시게 된다면 아마 가독성이 떨어지는 게임이라는 것을 확인하실 수가 있으실 겁니다.

그래서 가독성을 올려주고 우리가 흔히 접하는 프로그램의 형태를 지니게 해주는 것입니다.

하지만 windows헤더에는 가장 큰 단점이 있습니다.

그 단점은 윈도우에서만 사용이 가능하다고 들었습니다.

윈도우로 범위가 좁혀지는 것은 원하는 바가 아니지만 그래도 사용을 하는 것으로 합시다.


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

솔직히 따로 만들어서 설명을 해야하나 생각을 많이 했었습니다....

하지만 제가 생각하기에 이것은 따로 게시글을 빼야할 존재가 될 수도 아닐 수도 있습니다.

하지만 이 글을 읽고 계시는 분이 만약 저와 같은 고등학생이시라면 그냥 도움이 되셨으면합니다. //이 말의 의미는 알아서 해석을 하셨으면 합니다.

설명을 시작하자면 우리는 변수를 선언할 때 다양한 선언을 합니다.

int로 선언하기도 하고 double로 선언하기도 합니다.

하지만 이것은 왜 이렇게 선언을 하는 것일까요??

답은 변수를 선언할 때 메모리 값을 미리 정할 수 있기 때문에 컴퓨터에게 부담이 가지 않게 설정이 가능 합니다.

그래서 우리는 다양한 변수 선언을 시도하곤 합니다.

그에 따라 포인터 형도 다양하게 바뀌어야 합니다.

메모리 값이 정해지는 만큼 여러가지를 알아두면 좋지만 아직은 배우고 있는 입장이니 int형만 사용을 하는 것은 나쁘지 않다고 생각을 합니다.

메모리를 참조해야 하는 크기도 큰 편은 아니고 작은 편도 아니라서 좋다고 생각을 합니다.

또 이유가 있습니다.

실수로 해석을 할지 정수로 해석을 할지 정하는 것도 다양한 포인터 형이 존재하는 이유가 될 수 도있습니다.

그러니 부디 다른 선언을 하거나 그런 실수는 없었으면 합니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

오늘은 포인터 연산자에 대하여 배우게 될 건데요

포인터 연산자는 제가 그냥 포인터와 관련된 연산자를 간단하게 말하기 위해서 임의로 정한 말이니 뭐... 딱히 알아두시지 않으셔도 좋을 것 같습니다.

포인터 연산자는 두개정도 있습니다.

&와 *이 포인터 연산자로 존재하는데 *은 곱셈 연산자와는 거리가 멀다 연산이 되는 피연산자라는 녀석이 존재하는데 여기서의 피연산자는 2개가 아닌 한개이기에 곱셈연산자가 아닙니다.

그러니 곱셈연산자와 포인터 연산자를 혼돈하지 않는 것으로 해야할 것 같습니다.

일단 &연산자를 설명하려고 하는데

이 연산자는 전에 말했던것 같기도하고..... 아무튼 자세히 다시 설명을 하려고 하니 일단 들어두시는 것을 추천합니다.

아무튼!!이 연산자는 변수의 주소(이름)을 반환하는 연산자입니다.

그래서 표현을 하자면

1
2
3
4
5
int main() {
  int nm = 7;
  int * pnm = &nm;
  //코드
}
cs

이런 식으로 나오게 될겁니다.

그러면 이제 & 연산자의 피연산자는 변수이어야 합니다.

그러니 다른 것이 온다고 하더라도 오류를 뿜뿜하고 내뿜지 않을까 합니다.

또한 주의를 해야할 점으로는 int형 변수는 int형 포인터 변수에 저장을 해야 합니다.

또는 이 반대의 경우는 용납이 가능합니다.

int는 int에 저장을 해야할 필요가 있습니다.

이어서 *연산자를 설명하도록 하겠습니다.

이 연산자는 메모리 공간에 접근할 시 사용하는 연산자입니다.

그러면 간단하게 설명을 하도록 하겠습니다.

만약

1
2
3
4
5
int nm = 100, nm1 = 100;
int * pnm;
pnm = &nm;
(*pnm) += 48;
printf("nm : %d, nm1 : %d", nm, nm1);
cs

이러한 코드가 존재한다면 이렇게 표현이 가능합니다.

1| nm이라는 변수에 100의 값을 nm1이라는 변수에 100의 값을 저장한 상태로 선언합니다.

2|pnm이라는 포인터 변수를 선언합니다.

3|pnm이라는 포인터 변수는 nm이라는 변수를 가리킵니다.

4|pnm이라는 포인터 변수가 가리키는 변수에 48을 더하고 저장합니다.

5|"nm : (nm의 값), nm1 : (nm1의 값)"을 출력합니다.

라는 의미로 해석이 가능해 집니다.

그러면 이 코드를 출력했을 시

nm은 148이 출력되고 nm1은 100이 출력됩니다.

그러면 4번 째 줄을 보는 것으로 설명을 마치겠습니다.

4번 째 줄의 형태는 이러합니다.

*pnm 즉 pnm이 가리키는 nm에 48을 더하고 저장하는 코드가 되는 것이죠 네... 아무튼!! 이렇게 사용이 가능해 집니다.

그러면 다음 강좌에서 뵙도록 합시다.


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,
먼저 변수라는 것을 설명해야 이번 포인터라는 것을 설명이 쉽게 가능하기 때문에 일단 변수를 다시 정의하도록 하겠습니다.

변수라는 것을 선언하면 컴퓨터는 정보를 저장할 공간을 마련합니다.

그 공간이라는 녀석은 메모리라고 불립니다.

그 메모리라는 녀석에게 이름을 붙여서 이 int형 변수는 어디에 할당이 되었는지 알려주는 것을 포인터라고 하는 것 입니다.

그러면 이해하기 편하게 설명을 추가적으로 하자면 도로명주소와 비슷하게 바둑판식 느낌의 공간에게 주소를 붙여서 찾기 쉽게 만드는 것입니다.

그러면 포인터에 관하여 간단하게 접해보는 것으로 하겠다.

1
2
3
4
5
6
7
8
int main() {
  int nm = 8;
  int * pnm;
  pnm = &nm;
  printf("%d"&nm);
  printf("%p"&pnm);
  return 0;
}
cs

이 코드로 하는 것입니다.

그러면 다시 분석을 하는 시간으로 돌아가보도록 하겠습니다.

간단하게 설명을 하자면 int nm 이것은 아실 겁니다.

하지만, int * pnm; 이것은 무엇인가 하실 것 같은데 이거는 pnm이라는 포인터 변수를 선언하는 것으로 그냥 선언문 입니다.

그리고 pnm = &nm; 이것은 선언된 포인터 변수에 nm의 포인터 값을 저장하는 것입니다.

또 %p라는 것은 %d와 비슷한 서식 문자로 나중에 다시 거론을 하도록 하겠습니다.

그냥 포인터라는 것은 변수의 주소와 비슷하다라고 생각을 하면 이해하기가 편하리라고 생각을 합니다.

저 코드로 출력이 되는 값은 직접 확인해 보는 것을 저는 추천합니다.

그럼 저는 다음 강좌시간에 찾아 뵙도록 하겠습니다.

감사합니다!!!! ^^

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,
드디어 배열이라는 곳까지 왔습니다.

배열이라는 것은 여러분에게 조금 더 간편한 코딩을 도와주게 될 코드인데요

이유는 고등수학에 수열이라는 것을 떠올리시면 편하실 것이라고 생각을 합니다.

수열이라는 것은 수의 나열이라는 것을 기억하시거나 알아두시기를 바랍니다.

아무튼 배열은 변수를 조금 더 간편하게 사용 가능하게 해 줍니다.

일단 예제를 보시고 판단을 하시기를 바랍니다.

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main() {
  int ga, na, da, ra, ma, ba, sa, a;
  printf("8명의 나이를 조사하여 작성하세요\n");
  scanf_s("%d, %d, %d, %d, %d, %d, %d, %d"&ga, &na, &da, &ra, &ma, &ba, &sa, &a);
  printf("8명의 나이는 다음과 같습니다.\n");
  printf("%d, %d, %d, %d, %d, %d, %d, %d\n", ga, na, da, ra, ma, ba, sa, a);
  return 0;
}
cs

이렇게 길고 귀찮은 코드를 단번에 줄일 수가 있습니다.

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main() {
  int a[8];
  printf("8명의 나이를 조사하여 작성하세요\n");
  scanf_s("%d, %d, %d, %d, %d, %d, %d, %d"&a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8]);
  printf("8명의 나이는 다음과 같습니다.\n");
  printf("%d, %d, %d, %d, %d, %d, %d, %d\n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
  return 0;
}
cs

뭐 달라지는 것은 보이지 않을 지도 모릅니다.

네 저도 그렇게 생각을 합니다만 엄청나게 많은 양의 코드를 작성을 하다보면 일일이 변수를 선언하기도 귀찮기도 합니다.

그럴때 변수를 한번에 선언을 하는 것도 나쁘지는 않습니다.

그러니깐 int a[8];이라는 선언은 a라는 변수 8칸짜리를 선언하는 것과 다를 것이 없습다.

그냥 귀찮기도 하고 그러니 으음.... 네 아무튼 그렇게 합시다.

일일이 선언하기도 귀찮고 네..... 그냥 사용합니다.

자 이렇게 되었을때 다시 코드를 조금더 줄여보는 것으로 합시다.

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main() {
  int a[8];
  printf("8명의 나이를 조사하여 작성하세요\n");
  for(i = 0 ; i < 8 ; i++ ) {
    scanf("%d"&a[i]);
  }
  for (t = 0 ; t < 8 ; t++ ) {
    printf("%d\n"&a[t]);
  return 0;
  }
cs

이렇게 줄일 수가 있습니다.

그런데 여러 변수를 한번에 선언하는 배열 선언 (이하 배열 선언)에게 각각의 값을 따로 저장이 가능합니다.

int a[4] ={ 43, 48, 99, 234 };

이런 식으로 직접적으로 미리 설정하는 것도 가능합니다.

만약 이러한 경우 int a[4] = {34, 55};

출력값이 이러하게 나옵니다.

a[1]은 34

a[2]은 55

a[3]은 0

a[4]은 0

이런 식으로 나옵니다.

배열이라는 것은 앞으로 코딩을 하는 과정에서 편하게 사용이 되지 않을까하고 조심스럽게 생각을 하는 바입니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

안녕하세요!!

오늘은 랜덤 함수라는 것을 들고 와 보겠습니다.

랜덤 함수란?

제가 함수를 정의하는 것을 알려드린 것으로 기억하고 있습니다.

그래서 제가 이번에는 그 정의하는 것을 재미있게 매번 컴퓨터가 정해주는 값이 출력이 되게 만들어 보겠습니다.

일단 준비물은 늘 그렇듯 비쥬얼 스튜디오(이하 vs)입니다.

일단 저는 이번 시간을 통한 추첨기를 만들어 보도록 하겠습니다.

(올해 학교 축제에 사용을 하기 위해서 말이죠)

일단 먼저 가장 기본적인 랜덤하게 나오는 값을 불러오는 소스코드를 가져오겠습니다.

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#include<stdlib.h>
 
int main() {
  int Num;
  Num = rand();
  printf("랜덤 값입니다 => %d", Num);
  return 0;
}
cs

새로운 헤더파일을 생성하였습니다.

헤더파일에는 이것 외에도 여러가지 헤더파일이 존재합니다.

예를 들어서 

1
2
3
4
5
6
7
8
9
10
#include <windows.h>
#include <stdio.h>
 
int main () {
  printf("으음....\n");
  Sleep(1000);
  printf("으으으음...\n");
  return 0;
}
 
cs

라던가 말이죠

이것은 나중에 따로 파서 알려드릴 건데 미리 귀띔을 해놓자면

대기라는 것입니다.

개에게 "기다려!"하는 것과 같은 대기명령입니다.

나중에 추가적인 설명을 하도록 하겠습니다.

그리고 새로 추가가 된 헤더인 stdlib.h는

랜덤함수인 rand가 들어있는 헤더입니다.

그러면 이제 다시 사용 방법에 대하여 설명을 하도록 하겠습니다. 

늘 그렇듯 int Num;으로 Num이라는 변수를 선언합니다.

그리고 그 Num이라는 변수에 rand()라는 랜덤함수를 저장합니다.

마지막으로 printf로 그 값을 출력하여 랜덤값인지 아닌지를 확인 합니다.

그리고 return으로 0번째 줄로 돌려 보냅니다.

이렇게 설명을 하였지만 무엇인가 부족한 느낌을 받을 수 밖에 없을 것입니다.

저기요....? 왜 같은 값만 주구장창 나오는 것인가요??? 라고 말이죠.

그러면 여기에 시간(s)당 이라는 변화를 주어 봅시다.

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
int main() {
  int Num;
  srand(time(NULL));
  Num = rand();
  printf("랜덤 값입니다 => %d", Num);
  return 0;
}

두개의 코드가 추가가 되었습니다.

하나는 헤더 time.h가 추가가 되었고, 하나는 srand(time(NULL));이 추가가 되었습니다.

이 두개가 하는 시간(s)당이라는 변화를 줍니다.

자세히 보면 srand(time(NULL)); 에서

srand는 함수의 원형이되고

time은 시간을 담당하게 되는 것이고

NULL과 time이 같이 만나게 되어서 1초마다 리턴을 하게 됩니다.

이 강좌를 보면서 계속 익숙해지시는 방법이외에는 전혀 없다고 봅니다.

그리고 이것을 실제로 실행을 시킨다면 의문이 하나 생길 것입니다.

범위를 지정해 줄수는 없는 것인가?? 하면서 말이죠.

가능합니다.

실제로는 32767이라는 너무나도 큰 수까지 존재를 하는데.... 솔직히 100이면 충분하다고 느껴지는 것은 저만 그렇습니까?? 그래서 저는 100까지 하도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
int main() {
  int Num;
  srand(time(NULL));
  Num = rand() % (100+ 1;
  printf("랜덤 값입니다 => %d", Num);
  return 0;
}
cs

새로운 친구를 등장 시켰습니다.

% (100) + 1 이라는 녀석을 추가하였는데

%(최댓값) + 최솟값 이런식으로 사용을 하는 것입니다.


이번 시간에는 랜덤함수라는 것을 배워보았습니다.

랜덤함수는 사용하는 방도가 아주 많아서 앞으로 자주 보지 않을까 하고 생각을 합니다.

그러면 다음 강좌에서 보는 것으로 하고 저는 여기서 이만 마치도록 하겠습니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,