C언어 array 계산기 - Ceon-eo array gyesangi

이 위 사진의 문제를 제 실력으로 짤 수가 없는 것 같습니다.

이미 제출기한은 끝났는데, 풀이라도 시원하게 알고싶어서..혹시나 디씨에 프로그래밍 갤이 있나해 입갤했습니다.

아래의 부분문제 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