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

물론 제가 지금 지원하는 산성은 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;

}


블로그 이미지

이사가는 사람

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

,