Fascination
article thumbnail

자료구조 개념 및 구현

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)

 

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!