Guest User

Untitled

a guest
Oct 17th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void del(char *p); //3번 문제에서 사용하던 공백을 지우는 함수
  5.  
  6. void main()
  7. {
  8. double arr[10] = { 0 }; //실수를 저장할 arr배열
  9. int num_flag = 0, str_flag = 0, flag = 0; // 실수 배열에서 사용할 num_flag, 사칙연산의 기호 배열에서 사용할 str_flag 숫자의 시작 주소의 척도로 사용할 flag, 모두 0으로 초기화
  10. int muldiv_cnt = 0, plminus_cnt = 0; //곱셈, 나눗셈의 개수인 muldiv_cnt & 덧셈, 나눗셈의 개수인 plminum_cnt
  11. int max_num, max_str; // 배열의 가장 큰 인덱스를 저장하기 위한 변수
  12. double tmp; //연산을 통해 나온 값을 저장할 임시 저장소
  13. char str[100], *pstr = str; //처음 입력할 문자 배열 선언과 포인터 선언 & 초기화
  14. char op[10]; // 임시값으로 사용할 tmp와 사칙연산의 기호를 저장할 배열 op 선언 & 포인터 pop 선언 및 초기화
  15.  
  16. gets(str); //문자열 str 입력
  17.  
  18. del(str); // 공백들을 전부 지워줌
  19.  
  20.  
  21. for (pstr = str; ; pstr++) { //pstr의 주소를 증가시키는 무한반복문
  22.  
  23. if (*pstr == '\0') { //문자열의 끝인 경우
  24. *(arr + num_flag) = atoi(str + flag); // 숫자의 시작주소부터 \0 전까지의 숫자를 정수로 변환해 저장
  25. num_flag++; //숫자배열의 개수 증가
  26. break; //반복문 중지
  27. }
  28.  
  29.  
  30. else if (*pstr == '-' || *pstr == '+' || *pstr == '*' || *pstr == '/') { // 사칙연산 기호의 경우
  31.  
  32. if (*pstr == '*' || *pstr == '/') { //곱셈, 나눗셈일 경우 곱셈, 나눗셈의 개수 증가
  33. muldiv_cnt++;
  34. }
  35.  
  36. else if (*pstr == '-' || *pstr == '+') { //뺄셈, 덧셈일 경우 그 기호의 개수 증가
  37. plminus_cnt++;
  38. }
  39.  
  40. *(op + str_flag) = *pstr; //사칙연산의 기호를 tmp에 임시 저장
  41. str_flag++; //사칙연산의 기호 개수 증가
  42.  
  43.  
  44. *pstr = '\0'; //기호 전의 숫자만 읽도록 문자에 \0 대입
  45.  
  46. *(arr + num_flag) = atoi(str + flag); //시작주소부터 \0 직전까지의 숫자 문자열을 정수로 변환해 배열에 저장
  47. num_flag++; //실수를 저장하는 배열 위치 및 개수 증가
  48.  
  49. flag += strlen(str + flag) + 1; //시작주소의 척도인 flag 계산 ex) 123 456일경우 123(\0)456이 되었으므로 숫자 4가 시작주소가 되도록 함
  50.  
  51.  
  52. }
  53.  
  54. }
  55.  
  56. max_num = num_flag; //숫자의 개수 저장
  57. max_str = str_flag; //문자의 개수 저장
  58.  
  59. num_flag = 0; // 숫자배열의 인덱스 초기화
  60. str_flag = 0; // 문자배열의 인덱스 초기화
  61.  
  62. while(muldiv_cnt) // 곱셈, 나눗셈의 개수가 0이 될 때까지 반복문 실행
  63. {
  64.  
  65. if (*(op + str_flag) == '*' || *(op + str_flag) == '/') //곱셈, 혹은 나눗셈일 때
  66. {
  67.  
  68. muldiv_cnt--; // 곱셈, 나눗셈의 기호 개수 감소
  69.  
  70. if (*(op + str_flag) == '*') { // 곱하기일 경우 곱셈
  71. tmp = (double) *(arr + num_flag) * *(arr + num_flag + 1); // 앞의 수와 뒤의 수 연산
  72. }
  73. else if (*(op + str_flag) == '/') { //나눗셈일 경우 나눗셈
  74. tmp = (double) *(arr + num_flag) / *(arr + num_flag + 1); // 앞의 수와 뒤의 수 연산
  75. }
  76.  
  77. *(arr + num_flag) = tmp; //계산된 값을 연산자 앞 숫자배열에 저장
  78.  
  79. for (flag = num_flag + 1; flag < max_num - 1; flag++) { //계산된 숫자 뒤의 숫자부터
  80. *(arr + flag) = *(arr + flag + 1); //계산된 값 이후의 숫자들은 한칸씩 땡겨옴
  81. }
  82.  
  83. for (flag = str_flag; flag < max_str - 1; flag++) { //계산된 숫자 뒤의 숫자부터
  84. *(op + flag) = *(op + flag + 1); //연산자들을 앞으로 하나씩 덮어씌움
  85. }
  86.  
  87. max_str--;
  88. max_num--; //기호의 개수, 숫자의 개수 감소
  89.  
  90. *(arr + max_num) = 0; //숫자배열 마지막 인덱스에 0 대입
  91. *(op + max_str) = '\0'; //기호배열 마지막 인덱스에 null문자 대입
  92.  
  93. str_flag = 0;
  94. num_flag = 0; //str_flag, num_flag를 0으로 초기화
  95.  
  96. }
  97.  
  98. else {
  99. num_flag++;
  100. str_flag++; // 곱셈, 나눗셈이 아닐 경우 숫자 배열, 문자배열의 인덱스 증가
  101. }
  102.  
  103. }
  104.  
  105. while (plminus_cnt) // 덧셈, 뺄셈 기호 개수가 0이 아닐때까지 반복문 실행
  106. {
  107.  
  108. if (*(op + str_flag) == '+' || *(op + str_flag) == '-') //덧셈, 혹은 뺄셈일 때
  109. {
  110.  
  111. plminus_cnt--; //덧셈, 뺄셈의 기호 개수 감소
  112.  
  113. if (*(op + str_flag) == '+') { // 덧셈일 경우 곱셈
  114. tmp = (double) *(arr + num_flag) + *(arr + num_flag + 1); // 뒤의 숫자와 덧셈
  115. }
  116. else if (*(op + str_flag) == '-') { //뺄셈일 경우 나눗셈
  117. tmp = (double) *(arr + num_flag) - *(arr + num_flag + 1); // 뒤의 숫자와 뺄셈
  118. }
  119.  
  120. *(arr + num_flag) = tmp; //계산된 값을 연산자 앞 숫자배열에 저장
  121.  
  122. for (flag = num_flag + 1; flag < max_num - 1; flag++) {
  123. *(arr + flag) = *(arr + flag + 1); //계산된 값 이후의 숫자들은 한칸씩 땡겨옴
  124. }
  125.  
  126. for (flag = str_flag; flag < max_str - 1; flag++) {
  127. *(op + flag) = *(op + flag + 1); //연산자들을 앞으로 하나씩 덮어씌움
  128. }
  129.  
  130. max_str--;
  131. max_num--; //기호의 개수, 숫자의 개수 감소
  132.  
  133. *(arr + max_num) = 0; //숫자배열 마지막 인덱스에 0 대입
  134. *(op + max_str) = '\0'; //기호배열 마지막 인덱스에 null문자 대입
  135.  
  136. str_flag = 0;
  137. num_flag = 0; //str_flag, num_flag를 0으로 초기화
  138.  
  139. }
  140.  
  141. else {
  142. num_flag++;
  143. str_flag++; //뺄셈, 덧셈이 아닐 경우 숫자, 문자 배열의 인덱스 증가
  144. }
  145.  
  146. }
  147.  
  148. printf("%lf", tmp); //lf로 계산이 완료된 값을 출력
  149. }
  150.  
  151.  
  152.  
  153. void del(char *p)
  154. {
  155. char *str = p; // 포인터 str선언 & p(main함수에서 str)로 초기화
  156. int flag, i; // 공백 자리에 null문자를 대입하고 그 위치의 척도가 될 flag, 반복문에서 null 문자를 덮어씌우기 위해서 사용할 변수 i
  157.  
  158. while (1) //무한반복문
  159. {
  160.  
  161. if (*str == '\0') //문장 맨 끝일 경우 반복문 중지
  162. break;
  163.  
  164. else if (*str == ' ') { //공백일 경우
  165.  
  166. *str = '\0'; //공백에 null문자 복사
  167.  
  168. flag = strlen(str); //대입한 null의 위치의 척도가 될 flag
  169.  
  170. for (i = flag; i <= strlen(str + 1); i++) { // 대입한 널 문자를 기준으로 한칸씩 땡겨옴 맨 마지막 NULL문자 까지 한칸씩 앞으로 땡겨옴
  171.  
  172. *(str + i) = *(str + i + 1); //뒤의 문자를 앞으로 한칸씩 땡겨옴 (맨 마지막 NULL문자 포함)
  173. }
  174. }
  175.  
  176. //처음부터 쭉 훑어보며 공백이 있을 시 이를 null문자로 바꾸고 그 뒤의 나머지 문자열을 합치는 방식
  177.  
  178. else // 공백, 문장의 맨 끝이 아닐 경우
  179. str++; //str 주소 증가
  180.  
  181. }
  182.  
  183. }
Add Comment
Please, Sign In to add comment