Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- void del(char *p); //3번 문제에서 사용하던 공백을 지우는 함수
- void main()
- {
- double arr[10] = { 0 }; //실수를 저장할 arr배열
- int num_flag = 0, str_flag = 0, flag = 0; // 실수 배열에서 사용할 num_flag, 사칙연산의 기호 배열에서 사용할 str_flag 숫자의 시작 주소의 척도로 사용할 flag, 모두 0으로 초기화
- int muldiv_cnt = 0, plminus_cnt = 0; //곱셈, 나눗셈의 개수인 muldiv_cnt & 덧셈, 나눗셈의 개수인 plminum_cnt
- int max_num, max_str; // 배열의 가장 큰 인덱스를 저장하기 위한 변수
- double tmp; //연산을 통해 나온 값을 저장할 임시 저장소
- char str[100], *pstr = str; //처음 입력할 문자 배열 선언과 포인터 선언 & 초기화
- char op[10]; // 임시값으로 사용할 tmp와 사칙연산의 기호를 저장할 배열 op 선언 & 포인터 pop 선언 및 초기화
- gets(str); //문자열 str 입력
- del(str); // 공백들을 전부 지워줌
- for (pstr = str; ; pstr++) { //pstr의 주소를 증가시키는 무한반복문
- if (*pstr == '\0') { //문자열의 끝인 경우
- *(arr + num_flag) = atoi(str + flag); // 숫자의 시작주소부터 \0 전까지의 숫자를 정수로 변환해 저장
- num_flag++; //숫자배열의 개수 증가
- break; //반복문 중지
- }
- else if (*pstr == '-' || *pstr == '+' || *pstr == '*' || *pstr == '/') { // 사칙연산 기호의 경우
- if (*pstr == '*' || *pstr == '/') { //곱셈, 나눗셈일 경우 곱셈, 나눗셈의 개수 증가
- muldiv_cnt++;
- }
- else if (*pstr == '-' || *pstr == '+') { //뺄셈, 덧셈일 경우 그 기호의 개수 증가
- plminus_cnt++;
- }
- *(op + str_flag) = *pstr; //사칙연산의 기호를 tmp에 임시 저장
- str_flag++; //사칙연산의 기호 개수 증가
- *pstr = '\0'; //기호 전의 숫자만 읽도록 문자에 \0 대입
- *(arr + num_flag) = atoi(str + flag); //시작주소부터 \0 직전까지의 숫자 문자열을 정수로 변환해 배열에 저장
- num_flag++; //실수를 저장하는 배열 위치 및 개수 증가
- flag += strlen(str + flag) + 1; //시작주소의 척도인 flag 계산 ex) 123 456일경우 123(\0)456이 되었으므로 숫자 4가 시작주소가 되도록 함
- }
- }
- max_num = num_flag; //숫자의 개수 저장
- max_str = str_flag; //문자의 개수 저장
- num_flag = 0; // 숫자배열의 인덱스 초기화
- str_flag = 0; // 문자배열의 인덱스 초기화
- while(muldiv_cnt) // 곱셈, 나눗셈의 개수가 0이 될 때까지 반복문 실행
- {
- if (*(op + str_flag) == '*' || *(op + str_flag) == '/') //곱셈, 혹은 나눗셈일 때
- {
- muldiv_cnt--; // 곱셈, 나눗셈의 기호 개수 감소
- if (*(op + str_flag) == '*') { // 곱하기일 경우 곱셈
- tmp = (double) *(arr + num_flag) * *(arr + num_flag + 1); // 앞의 수와 뒤의 수 연산
- }
- else if (*(op + str_flag) == '/') { //나눗셈일 경우 나눗셈
- tmp = (double) *(arr + num_flag) / *(arr + num_flag + 1); // 앞의 수와 뒤의 수 연산
- }
- *(arr + num_flag) = tmp; //계산된 값을 연산자 앞 숫자배열에 저장
- for (flag = num_flag + 1; flag < max_num - 1; flag++) { //계산된 숫자 뒤의 숫자부터
- *(arr + flag) = *(arr + flag + 1); //계산된 값 이후의 숫자들은 한칸씩 땡겨옴
- }
- for (flag = str_flag; flag < max_str - 1; flag++) { //계산된 숫자 뒤의 숫자부터
- *(op + flag) = *(op + flag + 1); //연산자들을 앞으로 하나씩 덮어씌움
- }
- max_str--;
- max_num--; //기호의 개수, 숫자의 개수 감소
- *(arr + max_num) = 0; //숫자배열 마지막 인덱스에 0 대입
- *(op + max_str) = '\0'; //기호배열 마지막 인덱스에 null문자 대입
- str_flag = 0;
- num_flag = 0; //str_flag, num_flag를 0으로 초기화
- }
- else {
- num_flag++;
- str_flag++; // 곱셈, 나눗셈이 아닐 경우 숫자 배열, 문자배열의 인덱스 증가
- }
- }
- while (plminus_cnt) // 덧셈, 뺄셈 기호 개수가 0이 아닐때까지 반복문 실행
- {
- if (*(op + str_flag) == '+' || *(op + str_flag) == '-') //덧셈, 혹은 뺄셈일 때
- {
- plminus_cnt--; //덧셈, 뺄셈의 기호 개수 감소
- if (*(op + str_flag) == '+') { // 덧셈일 경우 곱셈
- tmp = (double) *(arr + num_flag) + *(arr + num_flag + 1); // 뒤의 숫자와 덧셈
- }
- else if (*(op + str_flag) == '-') { //뺄셈일 경우 나눗셈
- tmp = (double) *(arr + num_flag) - *(arr + num_flag + 1); // 뒤의 숫자와 뺄셈
- }
- *(arr + num_flag) = tmp; //계산된 값을 연산자 앞 숫자배열에 저장
- for (flag = num_flag + 1; flag < max_num - 1; flag++) {
- *(arr + flag) = *(arr + flag + 1); //계산된 값 이후의 숫자들은 한칸씩 땡겨옴
- }
- for (flag = str_flag; flag < max_str - 1; flag++) {
- *(op + flag) = *(op + flag + 1); //연산자들을 앞으로 하나씩 덮어씌움
- }
- max_str--;
- max_num--; //기호의 개수, 숫자의 개수 감소
- *(arr + max_num) = 0; //숫자배열 마지막 인덱스에 0 대입
- *(op + max_str) = '\0'; //기호배열 마지막 인덱스에 null문자 대입
- str_flag = 0;
- num_flag = 0; //str_flag, num_flag를 0으로 초기화
- }
- else {
- num_flag++;
- str_flag++; //뺄셈, 덧셈이 아닐 경우 숫자, 문자 배열의 인덱스 증가
- }
- }
- printf("%lf", tmp); //lf로 계산이 완료된 값을 출력
- }
- void del(char *p)
- {
- char *str = p; // 포인터 str선언 & p(main함수에서 str)로 초기화
- int flag, i; // 공백 자리에 null문자를 대입하고 그 위치의 척도가 될 flag, 반복문에서 null 문자를 덮어씌우기 위해서 사용할 변수 i
- while (1) //무한반복문
- {
- if (*str == '\0') //문장 맨 끝일 경우 반복문 중지
- break;
- else if (*str == ' ') { //공백일 경우
- *str = '\0'; //공백에 null문자 복사
- flag = strlen(str); //대입한 null의 위치의 척도가 될 flag
- for (i = flag; i <= strlen(str + 1); i++) { // 대입한 널 문자를 기준으로 한칸씩 땡겨옴 맨 마지막 NULL문자 까지 한칸씩 앞으로 땡겨옴
- *(str + i) = *(str + i + 1); //뒤의 문자를 앞으로 한칸씩 땡겨옴 (맨 마지막 NULL문자 포함)
- }
- }
- //처음부터 쭉 훑어보며 공백이 있을 시 이를 null문자로 바꾸고 그 뒤의 나머지 문자열을 합치는 방식
- else // 공백, 문장의 맨 끝이 아닐 경우
- str++; //str 주소 증가
- }
- }
Add Comment
Please, Sign In to add comment