이 위 사진의 문제를 제 실력으로 짤 수가 없는 것 같습니다.
이미 제출기한은 끝났는데, 풀이라도 시원하게 알고싶어서..혹시나 디씨에 프로그래밍 갤이 있나해 입갤했습니다.
아래의 부분문제 4-2번 까지는 풀이완료했구요.
아래가 제가 짠 코드인데 작동하지도 않고, * 와 /를 먼저계산하는 코드도 아닙니다.
저는 각각 arr cha 배열에 각각 flag를 부여해서 flag가 1이면 flag가 1인 arr,cha 배열의 원소를 맨뒤로 정렬하는 방식으로 코딩하려했습니다.
라고 쓴 부분까지는 잘 작동합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | #include <stdio.h> #include <string.h> void del_arr(int *p, float *q); void del_cha(int *p, char *q); int main() { char str[101], cha[10];//문자열입력, 입력될 사칙연산을 받을 배열 float arr[10], ans=0;//숫자 입력 실수 배열 int flag = 0, flag2 = 0;//flag는 일반 숫자 입력을 이어가는 변수, flag2는 음수일경우 음수의 숫자 입력을 이어가는 변수 int i, j, k; int arr_flag[10], cha_flag[10], tmp, tmp2, cnt=0; int a, b; gets(str); // 수치 추출 flag = 0; // 수치 모드 아님 flag2 = 0; i = 0; j = 0; k = 0; while(j < 10) { if (str[i] >= '0' && str[i] <= '9') { // 숫자를 받았을 경우 if(flag == 0 && flag2 == 0){ // 숫자를 받았을 경우 (flag==0), 면서 음수(-1 의 문자를 인식하지 못한 경우)가 아닌경우 flag = 1; //flag를 1로 초기화(이후의 코드에서 쓰일것, 반복되는 부분) ans = str[i] - '0'; //ans에 숫자로 변환후 저장 } else if(flag == 0 && flag2 == 1){// 숫자를 받았을 경우 (flag==0), 면서 음수(-1 의 문자를 인식한)인 경우 flag = 1; ans = -1*(str[i] -'0'); //음수로 변환 } else if(flag == 1 && flag2 == 0){ // flag 가 아직도 1인경우, 즉 다음 문자가 숫자가 이어질 경우, 음수가 아닌경우 ans *= 10; //아래 두 코드는 숫자로 변환하는 코드 ans += str[i] - '0'; } else if(flag2 == 1 && flag2 == 1){ //음수인 경우 ans *= 10; //아래 두 코드는 숫자로 변환하는 코드 ans += -1*(str[i] - '0'); //음수로 변환후 합한다 } } else { // 숫자가 아닌 문자일 경우 if (flag == 1){ // 수치 입력 받는 경우(flag==1) arr[j] = ans; //arr[i]에 수치를 입력 j++; //j 즉 arr의 배열 증가 flag = 0; //flag 0으로 초기화. flag2 = 0; } if (str[i] == '-'){ // 만일 음수라면 flag2를 1로 바꾸어준다 flag2 = 1; } if(str[i] == '+' || str[i] == '*' || str[i] == '/' || str[i] == '-'){ //printf("%c ", str[i]); cha[k]=str[i]; k++; } } if (str[i] == ''){//''이 읽혔을 경우 break;//while(j } i++; } //여기까지는 4-2번 문제 부분이라 틀린부분 없음! //for (i = 0; i // printf("%0.lf", arr[i]); //} //printf(" "); //for (i = 0; i // printf("%c", cha[i]); //} //printf(" "); //printf(" "); for (i = 0; i < k; i++) {//j 가 될때까지 반복 cha_flag[i]=12; } //여기부터 사칙연산 풀이 연산 시작 for (i = 0; i < j; i++) {//j 가 될때까지 반복 arr_flag[i]=0; } for (i = 0; i < k; i++) {//j 가 될때까지 반복 cha_flag[i]=0; } tmp=j; tmp2=k; i=0; while(1){ cnt=0; for(k = 0; k < tmp; k++){ if(arr_flag[k]==0){ cnt++; } } if(cnt==1){ break; } if(cha[i]=='*'){ arr[i]=arr[i]*arr[i+1]; arr_flag[i+1]=1; cha_flag[i]=1; } if(cha[i]=='/'){ arr[i]=arr[i]/arr[i+1]; arr_flag[i+1]=1; cha_flag[i]=1; } if(cha[i]=='+' || cha[i]=='-'){ arr[i]=arr[i]+arr[i+1]; arr_flag[i+1]=1; cha_flag[i]=1; } del_cha(cha_flag, cha); del_arr(arr_flag, arr); i++; } printf("%d", arr[0]); return 0; } void del_arr(int *p, float *q){ int i=0, j;//i선언 0을 초기화 //printf("del_arr 함수 "); for( ; p[i] ; ){ if(p[i] == 1){ for(j = i; p[j]; ++j){//반복문 실행 p[j] = p[j + 1]; //p[j+1]의 값을 p[j]에 저장 q[j] = q[j + 1]; } } else{//문자열의 인자가 ' '가 아니라면 ++i;//i증가 } } } void del_cha(int *p, char *q){ int i=0, j;//i선언 0을 초기화 //printf("del_cha 함수 "); for( ; p[i] ; ){ if(p[i] == 1){ for(j = i; p[j]; ++j){//반복문 실행 p[j] = p[j + 1]; //p[j+1]의 값을 p[j]에 저장 q[j] = q[j + 1]; } } else{//문자열의 인자가 ' '가 아니라면 ++i;//i증가 } } } | cs |