자료구조 개념 및 구현
Chapter 2. C언어 기초 - 연습문제
Q1. 주어진 코드를 사용하여 다음 세부 기능을 구현하시오
(1) 배열의 각 원소의 주소와 저장된 값을 출력한다
(2) 각 원소의 자료형 별로 할당되는 바이트 크기를 출력한다
[코드]
#include <stdio.h>
#define SIZE 20
void printArray(int *ptr,int size);
int main() {
int list[SIZE], i;
for(i=0;i<SIZE;i++)
list[i]=i;
// 배열의 각 원소의 주소와 저장된 값을 출력
printArray(list,SIZE);
// 각 원소의 자료형 별로 할당되는 바이트 크기를 출력
printf("int = %d bytes\n", sizeof(int));
printf("long = %d bytes\n", sizeof(long));
printf("long long = %d bytes\n", sizeof(long long));
printf("float = %d bytes\n", sizeof(float));
printf("double = %d bytes\n", sizeof(double));
return 0;
}
void printArray(int *ptr, int size){
int i;
printf("Address Contents\n");
for(i=0;i<size;i++){
// (포인터+정수) 형태로 배열 원소의 주소와 값을 출력
printf("%8u %d, ",ptr+i,*(ptr+i));
// 포인터[인덱스] 형태로 배열 원소의 주소와 값을 출력
printf("%8u %d\n",&ptr[i],ptr[i]);
}
}
[실행결과]
Q2. [실습] 다음 조건들을 만족하도록 프로그램을 작성하시오
[조건]
1. 10개의 Person 구조체 객체를 갖는 배열을 선언한다
2. scanf 함수를 사용하여 각 멤버의 값을 실행 화면과 같이 입력받는다
3. 구조체 변수의 값을 출력한다
4. 개인별 봉급의 평균을 계산하여 출력한다.
[코드]
#include <stdio.h>
#include <string.h>
struct date{
int month;
int day;
int year;
};
struct Person_type{
char name[20];
int age;
float salary;
struct date birth;
};
// Q. Person_type 구조체로 10명의 사람을 선언하시오
struct Person_type person[10];
void personstruct(int);
void average_salary(int);
int main() {
int i=0;
char name[20];
int age;
float salary;
int month, day, year;
int ans =1;
int count =0;
while(ans!=0&&count<=10){
count++;
printf("person data[%d] \n",i+1);
// Q. scanf를 사용하여 구조체의 age, salary, birthday 멤버를 입력 받는 코드를 작성하시오
printf("name[20 chars] ="); scanf("%s",name);
strcpy(person[i].name, name);
printf("Age[digit] ="); scanf("%d",&age);
person[i].age = age;
printf("salary[digit] ="); scanf("%f", &salary);
person[i].salary = salary;
printf("birth year[0000] ="); scanf("%d", &year);
person[i].birth.year = year;
printf("birth month[0..00] ="); scanf("%d", &month);
person[i].birth.month = month;
printf("birth day[00] ="); scanf("%d", &day);
person[i].birth.day = day;
i++;
printf("\nDo you want to input more? <yes = 1, no = 0> :"); scanf("%d",&ans);
}
// Q. personstruct 함수를 호출한다
personstruct(count);
// Q. average_salary 함수를 호출한다
average_salary(count);
}
void personstruct(int count){
int i;
printf("name age salary birthday \n");
printf("========================================================\n");
for(i=0;i<count;i++){
// Q. person 구조체의 멤버 값을 출력한다
printf("%-20s %3d %6.1f %d %d %d\n", person[i].name, person[i].age, person[i].salary,person[i].birth.year,person[i].birth.month,person[i].birth.day);
}
printf("========================================================\n");
}
void average_salary(int count){
// Q. 반복문을 사용하여 개인의 월급을 출력한다.
float sum=0, mean=0;
for(int i=0;i<count;i++){
printf("[%d] %.1f\n",i,person[i].salary);
sum += person[i].salary;
}
// Q. 월급의 평균을 출력한다
mean = sum/count;
printf("========================================================\n");
printf("average salary : %.1f", mean);
}
[실행결과]
- 입력
- 출력
Q3. [실습] 다항식의 계수와 지수를 구조체로 표현하고 이 구조체의 배열에 다항식을 저장하고자 한다. 다항식을 입력받아 덧셈을 수행하는 프로그램을 작성하시오
[조건]
1. 다항식의 각 항을 위한 계수와 지수를 지수의 내림차순으로 입력 받는다
2. (-1 -1)이 입력되면 다음 다항식의 입력으로 넘어가고, 두 다항식의 입력이 끝나면 덧셈을 수행한다
3. 하나의 항을 입력받을 때마다 전체 다항식의 내용을 실행 결과와 같이 출력한다
[코드]
#include <stdio.h>
#define MAX_TERMS 100
void printpoly(int start, int finish);
void addition();
void append(int coef, int expon);
struct term_type{
int coef;
int expon;
};
struct term_type terms[MAX_TERMS];
int startA=0, finishA=0;
int startB=-1, finishB=-1;
int d1=0, d2=0;
int avail=0;
int main() {
int coef, expon;
while (1) {
// 다항식A 입력
printf("Write <coef exp> of a term of polynominal A <exit = -1 -1>\n");
printf("the exponent should be lower than the former one :");
scanf("%d %d", &coef, &expon);
if(coef==-1&&expon==-1) {
finishA--;
break;
}
append(coef, expon);
printpoly(startA, finishA);
finishA ++;
}
startB=finishA+1;
finishB=finishA+1;
printf("\n");
while (1) {
// 다항식B 입력
printf("Write <coef exp> of a term of polynominal B <exit = -1 -1>\n");
printf("the exponent should be lower than the former one :");
scanf("%d %d", &coef, &expon);
if(coef==-1&&expon==-1) {
finishB--;
break;
}
append(coef, expon);
printpoly(startB, finishB);
finishB ++;
}
addition();
printf("\nresult of D(x)\n");
printpoly(d1,d2);
}
void printpoly(int start, int finish){
printf("startA = %d, finishA = %d\nstartB = %d, finishB = %d\n", startA, finishA, startB, finishB);
printf("\nindex:\t");
for (int i = start; i <= finish; i++) printf("%d\t", i);
printf("\n---------------------------------------------------");
printf("\nCoef :\t");
for (int i = start; i <= finish; i++) printf("%d\t", terms[i].coef);
printf("\nExpon :\t");
for (int i = start; i <= finish; i++) printf("%d\t", terms[i].expon);
printf("\n\n");
}
void addition(){
int coefficient;
int a1=startA, a2=finishA, b1=startB, b2=finishB;
d1 = avail;
while (a1 <= a2 && b1 <= b2) { // A(x), B(x)의 시작과 끝 인덱스가 유효할 동안. a1과 b1은 덧셈이 진행되는 동안 1씩 증가
if (terms[a1].expon < terms[b1].expon) { // b항의 지수가 더 크면
append(terms[b1].coef, terms[b1].expon); // 결과 항에 b항 그대로 추가
b1++; // B의 다음 항을 가리킴
}
else if (terms[a1].expon > terms[b1].expon) { // a항의 지수가 더 크면
append(terms[a1].coef, terms[a1].expon); // 결과 항에 a항 그대로 추가
a1++; // A의 다음 항을 가리킴
}
else if (terms[a1].expon == terms[b1].expon) { // a항과 b항의 지수가 같으면
coefficient = terms[a1].coef + terms[b1].coef; // 계수끼리 더해서
if (coefficient) append(coefficient, terms[a1].expon); // 더한 결과의 항 추가
a1++; b1++; // A, B 둘다 다음 항을 가리킴
}
}
for(;a1<=a2;a1++) append(terms[a1].coef, terms[a1].expon); /* 내가 만든 프로그램 상에서는 한번의 덧셈이 이뤄지면 finish가
다음 인덱스의 시작을 가리키므로 for문에서 조건이 a1<a2가 되어야 함 등호가 빠져야 정상적으로 계산됨*/
for(;b1<=b2;b1++) append(terms[b1].coef, terms[b1].expon);
d2 = avail-1;
}
void append(int coef, int expon){
if(avail>=MAX_TERMS){
printf("Too many terms in the polynomial");
return;
}
terms[avail].coef = coef;
terms[avail++].expon = expon;
}
[실행결과]
> 다항식 A 입력
> 다항식 B 입력
> 결과 - D(x)
'Study > Data Structure' 카테고리의 다른 글
[DS] Recursion(재귀 호출) 과 함수 호출 과정 (0) | 2021.08.26 |
---|---|
[DS] Polynomial (다항식) (0) | 2021.08.25 |
[DS] 볼링 게임 점수 계산 구현 (0) | 2021.08.25 |
[DS] Array (배열) & Multi-Dimensional Array (다차원 배열) (0) | 2021.08.25 |
[DS] Pointer (포인터) (0) | 2021.08.25 |