Coding Challenge

[소스공유/C언어] 다항식 연산 프로그램

인생마린 2017. 4. 29. 12:08
반응형

자료 구조 과제로 만들었던 프로그램 입니다.


스위치문에 대해 설명하자면

1번 multTerm 다항식×다항식

2번 subPoly 다항식-다항식

3번 addTerm 다항식+다항식

4번 delTerm 초기 입력했던 다항식 초기화

5번 MultPoly 다항식×다항식


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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNGINS
#define MAX 101
 
//두 다항식 입력받고 배열에 저장 (계수따로 지수따로)
//최대지수는 100으로 한정, 계수와 변수사이는 *없이 그냥 입력받으며 지수의경우 ^으로 구분
//두 다항식간에 +,-,X 연산 하는 함수 넣기 
//다항식은 내림차순으로 입력받는다.
 
typedef struct {
    int expo;//최대 지수값
    int coef[MAX];//최대지수 100으로 한정
}poly;
 
 
void show(poly A)// 해당poly 출력
{
 
    for (int i = 0; i<A.expo; i++) {
        if (A.coef[i] != 0)
            printf("%dx^%d", A.coef[i], A.expo - i);
        if (A.coef[i + 1>= 0 && A.coef[i] != 0)
            printf(" + ");
 
    }
    printf("%d ", A.coef[A.expo]);
 
}
 
poly polynomialSave()
{
    poly C;
    memset(&C, 0sizeof(C));
    int num1, num2;
    printf("최고차항을 입력해주세요.\n");
    scanf_s("%d"&num1);
    C.expo = num1;
    for (int i = 0; i <= num1; i++)
    {
        printf("x^%d의 계수를 입력해주세요.\n", num1 - i);
        scanf_s("%d"&num2);
        C.coef[i] = num2;
    }
    return C;
}
 
poly multTerm(poly A)//단항식 곱
{
    poly B;
    memset(&B, 0sizeof(B));
    int num;
    printf("지수를 입력해주세요.\n");
    scanf_s("%d"&num);
    B.expo = num;
 
    printf("계수를 입력해주세요.\n");
    scanf_s("%d"&num);
    B.coef[0= num;
 
    poly C;
 
    memset(&C, 0sizeof(C));
    int indxA = 0, indxB = 0, indxC = 0, degA = A.expo, degB = B.expo;
 
    C.expo = A.expo + B.expo;//최고차항은 A,B의 최고차항의 합이다.
 
    for (int i = 0; i <= A.expo; i++)
    {
        for (int j = 0; j <= B.expo; j++)
        {
            C.coef[i + j] += A.coef[i] * B.coef[j];
        }
    }
 
 
    printf("    ");
    show(A);
    printf("\n %c  "'*');
    show(B);
    printf("\n  = ");
    show(C);
    printf("\n");
 
    return C;
}
 
poly subPoly(poly A)
{
    poly B;
    B = polynomialSave();
 
    poly C;
 
 
    int indxA = 0, indxB = 0, indxC = 0, degA = A.expo, degB = B.expo;
 
    C.expo = (A.expo>B.expo) ? A.expo : B.expo;//최고차항 저장
 
    while (A.expo >= indxA && B.expo >= indxB)//각 항의 최고차항을 이용해 연산
    {
        if (degA == degB)
        {
            C.coef[indxC++= A.coef[indxA++- B.coef[indxB++];
 
            degA--; degB--;
        }
        else if (degA>degB)
        {
            C.coef[indxC++= A.coef[indxA++];
            degA--;
        }
        else
        {
            C.coef[indxC++= B.coef[indxB++];
            degB--;
        }
 
    }
 
    printf("    ");
    show(A);
    printf("\n %c  "'-');
    show(B);
    printf("\n  = ");
    show(C);
    printf("\n");
 
    return C;
}
 
poly addTerm(poly A)
{
    poly B;
    B = polynomialSave();
 
    poly C;
 
 
    int indxA = 0, indxB = 0, indxC = 0, degA = A.expo, degB = B.expo;
 
    C.expo = (A.expo>B.expo) ? A.expo : B.expo;//최고차항 저장
 
    while (A.expo >= indxA && B.expo >= indxB)// 각항의 최고차항을 이용해 연산
    {
        if (degA == degB)
        {
            C.coef[indxC++= A.coef[indxA+++ B.coef[indxB++];
            degA--; degB--;
        }
        else if (degA>degB)
        {
            C.coef[indxC++= A.coef[indxA++];
            degA--;
        }
        else
        {
            C.coef[indxC++= B.coef[indxB++];
            degB--;
        }
 
    }
 
    printf("    ");
    show(A);
    printf("\n %c  "'+');
    show(B);
    printf("\n  = ");
    show(C);
    printf("\n");
    return C;
}
 
poly delTerm(poly A)
{
    printf("다항식값을 초기화합니다....\n");
    memset(&A, 0sizeof(A));
 
    return A;
}
 
poly MultPoly(poly A)
{
    poly B;
    B = polynomialSave();
 
    poly C;
 
    memset(&C, 0sizeof(C));
    int indxA = 0, indxB = 0, indxC = 0, degA = A.expo, degB = B.expo;
 
    C.expo = A.expo + B.expo;//최고차항은 A,B의 최고차항의 합이다.
 
    for (int i = 0; i <= A.expo; i++)
    {
        for (int j = 0; j <= B.expo; j++)
        {
            C.coef[i + j] += A.coef[i] * B.coef[j];
        }
    }
    printf("    ");
    show(A);
    printf("\n %c  "'*');
    show(B);
    printf("\n  = ");
    show(C);
    printf("\n");
 
    return C;
}
 
 
 
 
 
 
 
void menu(poly A)
{
    int num = 0;
    while (1)
    {
        printf("1.multTerm 2.subPoly 3.addTerm 4.delTerm 5.MultPoly 6.exit \n");
        scanf_s("%d"&num);
 
        if (num == 6)
            break;
        switch (num)
        {
        case 1:
            A = multTerm(A);
            break;
        case 2:
            A = subPoly(A);
            break;
 
        case 3:
            A = addTerm(A);
            break;
        case 4:
            delTerm(A);
            A = polynomialSave();
            break;
        case 5:
            MultPoly(A);
            break;
        default:
            printf("제대로된 값을 입력해주세요.\n");
        }
        puts("");
    }
}
int main()
{
    poly A;
    A = polynomialSave();
    menu(A);
 
    printf("프로그램을 종료합니다.\n");
    return 0;
}


출력물(예시 addTerm)



※과제로 복붙해서 내시는 분들 있기 때문에 복붙 방지가 되어있습니다. 스스로 쳐보고 소스를 이해해주시길 바랍니다. 본 블로그는 실력을 향상하기 위해서 있는거지 과제를 복붙하기 위해 있는게 아님을 알려드립니다.

반응형