본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] 구조체와 공용체 (Lab 09)

by 2den 2021. 1. 4.
728x90

<Lab 09 문제 유형 요약>

 

  • Program 1 : 구조체, 분수의 덧셈과 곱셈
  • Program 2 : 구조체, 사람 정보 출력
  • Program 3 : 구조체, 내용 수정하기
  • Program 4 : 구조체, 내용 검색하기
  • Program 5 : 구조체, 내용 수정하기, 월급/연봉/인센티브
  • Program 6 : 구조체, 열거형, 카드 섞기, 카드 분배

 


 

Program 1

 

분수(fraction) 은 분자와 분모로 이루어져 있다. 분수를 표현하기 위한 구조체 fraction을 정의하고, 두 분수의 덧셈과 곱셈을 계산하는 프로그램을 쓰시오.

 

  • 구조체 fraction 멤버 구성: 정수형의 분자(numerator)와 분모(denominator)
  • 분자와 분모를 차례로 입력 받아 처리한다.
  • 두 분자의 뎃셈과 곱셈 결과를 아래 예시와 같이 출력한다.

#include <stdio.h>

struct fraction {
    int numerator;
    int denorminator;       
};

int main(void)
{
  struct fraction f1; struct fraction f2; struct fraction result;

  printf("첫번째 분수의 분모와 분자를 차례로 입력하시오 >> ");
  scanf("%d %d", &f1.denorminator, &f1.numerator);
  printf("두번째 분수의 분모와 분자를 차례로 입력하시오 >> ");
  scanf("%d %d", &f2.denorminator, &f2.numerator);
  
  
  result.numerator = f1.numerator * f2.denorminator + f2.numerator * f1.denorminator;
  result.denorminator = f1.denorminator * f2.denorminator;
  printf("%d/%d + %d/%d = %d/%d\n", f1.numerator, f1.denorminator, f2.numerator, f2.denorminator, result.numerator, result.denorminator);

  result.numerator = f1.numerator * f2.numerator;
  result.denorminator = f1.denorminator * f2.denorminator;
  printf("%d/%d * %d/%d = %d/%d\n", f1.numerator, f1.denorminator, f2.numerator, f2.denorminator, result.numerator, result.denorminator);
  
  return 0;
}

 

 

Program 2

 

다음 내용을 참고로 구조체 person을 정의하고, 사람 3명의 정보에 대해 임의의 값으로 초기화하고, 내용을 출력하는 프로그램을 작성하시오.

 

  • 구조체 person 멤버 구성: 이름, 전화번호, 주소

#include <stdio.h>
#include <string.h>

struct person {
  char name[10];
  char digets[20];
  char address[30];
};

int main(void)
{
  struct person p1, p2, p3;

  strcpy(p1.name, "홍길동"); strcpy(p2.name, "이순신"); strcpy(p3.name, "박문수");

  strcpy(p1.digets, "011-1111-1111"); strcpy(p2.digets, "017-3245-3278"); strcpy(p3.digets, "011-2222-2456");

  strcpy(p1.address, "서울시 구로구 고척동"); strcpy(p2.address, "서울시 강남구 도곡동"); strcpy(p3.address, "경기도 안양시 비산동");

  printf("------------------------------------------------\n");
  printf("   이름      전화번호               주소\n");
  printf("------------------------------------------------\n");
  printf(" %s   %s    %s\n", p1.name, p1.digets, p1.address);
  printf(" %s   %s    %s\n", p2.name, p2.digets, p2.address);
  printf(" %s   %s    %s\n", p3.name, p3.digets, p3.address);
  printf("------------------------------------------------\n");

  return 0;
}

 

 

Program 3

 

다음 내용을 참고로 구조체 struct movie를 정의하고, 영화 3개를 아래 실행 예시와 유사하게 초기 값을 설정하여 출력하고, 영화 감독 수정을 하여 다시 출력하는 프로그램을 작성하시오.

 

  • 구조체 struct movie 멤버 구성: 영화제목, 관객수, 감독, 상영일
  • 상영일은 다른 구조체 struct date를 정의 
  • 구조체 struct date 멤버 구성: 년, 월, 일
#include <stdio.h>
#include <string.h>

struct Date {
    int year;
    int month;
    int day;
};

struct movie {
    char title[10];
    int pop;
    char director[10];
    struct Date start;
};

int main(void) 
{
    struct movie movies[3];

    strcpy(movies[0].title, "명량  "); strcpy(movies[1].title, "도둑들"); strcpy(movies[2].title, "국제시");
    strcpy(movies[0].director, "김한민"); strcpy(movies[1].director, "최동훈"); strcpy(movies[2].director, "윤제균");
    movies[0].pop = 17613000; movies[1].pop = 12983000; movies[2].pop = 14257000;
    movies[0].start.year = 2020; movies[1].start.year = 2020; movies[2].start.year = 2020;
    movies[0].start.month = 7; movies[1].start.month = 12; movies[2].start.month = 12;
    movies[0].start.day = 30; movies[1].start.day = 17;  movies[2].start.day = 27;

    printf("---------------------------------------------\n");
    printf("   제목     감독     관객수      개봉일\n");
    printf("---------------------------------------------\n");
    for (int i = 0; i < 3; i++)
    {
        printf("%d. [%6s]  %s  %d  %d.%d.%d\n", i, movies[i].title, movies[i].director, movies[i].pop, movies[i].start.year, movies[i].start.month, movies[i].start.day);
    }
    printf("---------------------------------------------\n");

    int number = 0;
    char* director_m;

    printf("영화 감독을 수정합니다. <영화번호 감독이름> >> ");
    scanf(" %d %s", &number, director_m);
    strcpy(movies[number].director, director_m);

    printf("---------------------------------------------\n");
    printf("   제목     감독     관객수      개봉일\n");
    printf("---------------------------------------------\n");
    for (int i = 0; i < 3; i++)
    {
        printf("%d. [%6s]  %s  %d  %d.%d.%d\n", i, movies[i].title, movies[i].director, movies[i].pop, movies[i].start.year, movies[i].start.month, movies[i].start.day);
    }
    printf("---------------------------------------------\n");

    return 0;
}

 

 

Program 4

 

다음 내용을 참고로 구조체 student를 정의하고, 학생 5명을 선언하여 적당한 값을 입력하고 출력하는 프로그램을 작성하시오.

 

  • 구조체 student멤버 구성: 이름, 학번, 평균평점, 학과, 진로

?는 idle이 인식하지 못하는 이름

#include <stdio.h>
#include <string.h>

struct student {
  char name[10];
  int num;
  double score;
  char major[10];
  char career[10];
};

int main(void) 
{
  struct student s[10];
  printf("   이름    학번    학점    학과         진로\n");
  printf(" -------------------------------------------------- \n");

  strcpy(s[0].name, "김영국");
  strcpy(s[1].name, "강미연");
  strcpy(s[2].name, "송은혜");
  strcpy(s[3].name, "박보현");
  strcpy(s[4].name, "박보현");
  strcpy(s[5].name, "김형근");
  strcpy(s[6].name, "김형근");
  strcpy(s[7].name, "김보름");
  strcpy(s[8].name, "서정순");
  strcpy(s[9].name, "최종욱");

  s[0].num = 23462456;
  s[1].num = 78423534;
  s[2].num = 45622344;
  s[3].num = 24575356;
  s[4].num = 24564575;
  s[5].num = 62625645;
  s[6].num = 23464557;
  s[7].num = 45684684;
  s[8].num = 34257656;
  s[9].num = 45674575;

  s[0].score = 3.4;
  s[1].score = 3.5;
  s[2].score = 3.2;
  s[3].score = 3.5;
  s[4].score = 3.1;
  s[5].score = 4.5;
  s[6].score = 4.1;
  s[7].score = 4.3;
  s[8].score = 4.4;
  s[9].score = 4.2;

  strcpy(s[0].major, "전자과");
  strcpy(s[1].major, "컴퓨터");
  strcpy(s[2].major, "소프트");
  strcpy(s[3].major, "전자과");
  strcpy(s[4].major, "전자과");
  strcpy(s[5].major, "소프트");
  strcpy(s[6].major, "소프트");
  strcpy(s[7].major, "컴퓨터");
  strcpy(s[8].major, "소프트");
  strcpy(s[9].major, "컴퓨터");

  strcpy(s[0].career, "공무원");
  strcpy(s[1].career, "회사원");
  strcpy(s[2].career, "회사원");
  strcpy(s[3].career, "프로게이머");
  strcpy(s[4].career, "웹마스터");
  strcpy(s[5].career, "웹디자이너");
  strcpy(s[6].career, "군인");
  strcpy(s[7].career, "군인");
  strcpy(s[8].career, "DB관리자");
  strcpy(s[9].career, "교수");

  for(int i=0; i<10; i++)
  {
    printf("%s  %d  %.1lf  %7s  %5s\n", s[i].name, s[i].num, s[i].score, s[i].major, s[i].career);
  }

  while(1)
  {
    char str[60] = "";
    printf("\n검색하려는 학과를 입력하시오 : ");
    scanf(" %s", str);
    for(int i=0; i<10; i++) 
    {
      if(!strcmp(s[i].major, str))
      {
        printf("%s  %d  %.1lf  %7s  %5s\n", s[i].name, s[i].num, s[i].score, s[i].major, s[i].career);
      }
    }
  }
  

  return 0;
}

 

 

Program 5

 

다음 내용을 참고로 구조체 employee를 정의하고, 직원 4명를 선언하여 임의의 값을 입력하고 출력하시오. 그리고 사번 또는 이름과 새로운 인센티브를 입력하여 변경된 연봉을 출력하도록 하는 프로그램을 작성하시오.

 

  • 구조체 person 멤버의 구성 :  사번, 이름, 전화번호
  • 구조체 employee : 멤버의 구성 : person, 월급, 인센티브
  • 연봉은 구조체의 멤버가 아니며 계산하여 출력
  • 연봉 =  월급 * (12 + 인센티브/100)로 계산

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

struct Person {
  int number;
  char name[10];
  char digits[50];
};

struct Employee {
  struct Person person;
  int pay;
  int in;
};

int main(void)
{
  struct Employee employee[4];

  employee[0].person.number = 20123423;
  employee[1].person.number = 20122436;
  employee[2].person.number = 20124564;
  employee[3].person.number = 20123464;

  strcpy(employee[0].person.name, "김지혜");
  strcpy(employee[1].person.name, "김자경");
  strcpy(employee[2].person.name, "강동구");
  strcpy(employee[3].person.name, "안태용");

  strcpy(employee[0].person.digits, "010-1111-1111");
  strcpy(employee[1].person.digits, "010-2222-2222");
  strcpy(employee[2].person.digits, "010-3333-3333");
  strcpy(employee[3].person.digits, "010-4444-4444");

  employee[0].pay = 1200000;
  employee[1].pay = 1500000;
  employee[2].pay = 1800000;
  employee[3].pay = 2200000;

  employee[0].in = 120;
  employee[1].in = 150;
  employee[2].in = 180;
  employee[3].in = 250;

  printf("  사번      이름      전화번호     월급   인센     연봉\n");
  printf("----------------------------------------------------------\n");
  for(int i=0; i<4; i++)
  {
    printf("%d  %s  %s  %d  %d%%  %d\n", employee[i].person.number, employee[i].person.name, employee[i].person.digits, employee[i].pay, employee[i].in, employee[i].pay*(12+employee[i].in/100));
  }
  while(1)
  {
    printf("\n인센티브를 변경합니다...\n");
    printf("사번 또는 이름과 새로운 인센티브를 입력하시오 >> ");

    int number_m, in_m;
    char str[150] ="";

    scanf(" %s %d", str, &number_m);
  
    if(isdigit(str[0]))
    {
      in_m = atoi(str);
      for(int i=0; i<4; i++)
      {
        if(employee[i].person.number == in_m)
        {
          employee[i].in = number_m;
        }
      }

      printf("\n  사번      이름      전화번호     월급   인센     연봉\n");
      printf("----------------------------------------------------------\n");  

      for(int i=0; i<4; i++)
      {
        printf("%d  %s  %s  %d  %d%%  %d\n", employee[i].person.number, employee[i].person.name, employee[i].person.digits, employee[i].pay, employee[i].in, employee[i].pay*(12+employee[i].in/100));
      }
      continue;
    }
    else 
    {
      for(int i=0; i<4; i++)
      {
        if(!strcmp(employee[i].person.name, str))
        {
          employee[i].in = number_m;
        }
      }

      for(int i=0; i<4; i++)
      {
        printf("%d  %s  %s  %d  %d%%  %d\n", employee[i].person.number, employee[i].person.name, employee[i].person.digits, employee[i].pay, employee[i].in, employee[i].pay*(12+employee[i].in/100));
      }

    }
  }

  return 0;
}

 

 

Program 6

 

다음 내용을 참고로 구조체와 열거형을 이용하여 카드 게임을 할 수 있는 기본적인 자료형을 만들어보고, 카드를 나눠주는 프로그램을 작성하시오.

 

  • 카드는 총 52
  • 모양 4가지 : "(Hearts)", "(Diamonds)", "(Clubs)", "(Spades)"
  • 숫자 13가지 : ace(1)부터 10까지 그리고 jack(11), queen(12), king(13)
  • 3명의 Player에게 7장의 카드를 나누어주는 과정을 다음과 같이 출력하도록 한다
  • filldeck()- 무늬와 숫자의 52장 카드덱 구성,  shuffle() – 카드 섞기, deal() – 카드 분배

#include <stdio.h>
#include <time.h>

// 열거형
enum num { ace = 1, jack = 11, queen = 12, king = 13 };

// 카드 구조체
struct Card {
    int number;
    int shape;
};

// 52장의 카드
struct Card card_all[52];

// 선수마다 갖게 되는 카드 7장
struct Player {
    struct Card card_player[7];
};

void shuffle()
{
    // 52장의 카드를 랜덤한 인덱스번째 카드와 하나씩 뒤바꾸어 줌
    srand(time(NULL));
    for (int i = 0; i < 52; i++)
    {
        int index = rand() % 52;
        struct Card temp = card_all[index];
        card_all[index] = card_all[i];
        card_all[i] = temp;
    }
}

void filldeck()
{
    int i = 0;
    // 4개의 모양과 13개의 숫자를 짝지어서 카드 만듦
    for (int j = 0; j < 4; j++)
    {
        for (int k = 0; k < 13; k++)
        {
            card_all[i].number = k;
            card_all[i].shape = j;
            i++;
        }
    }
}

void deal(struct Player player[])
{
    // 섞어진 카드를 앞에서부터 나누어줌
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 7; j++)
        {
            player[i].card_player[j] = card_all[i * 7 + j];
        }
    }
}

int main(void)
{
    struct Player player[3];
    printf("카드게임에 3명의 선수가 참여합니다...\n");
    filldeck(); shuffle(); printf("52장의 카드를 섞어 줍니다.\n");
    deal(player); printf("카드를 7장씩 나누어 줍니다.\n");

    printf("player 1     player 2     player 3\n");

    // 7개의 카드를 출력
    for (int i = 0; i < 7; i++) {
        // 사람마다 번갈아가며 1장씩
        for (int j = 0; j < 3; j++)
        {
            switch (player[j].card_player[i].number) {
                // 특별한 숫자일 경우
            case ace:
                printf(" A");
                break;
            case jack:
                printf(" J");
                break;
            case queen:
                printf(" Q");
                break;
            case king:
                printf(" K");
                break;
            default:
                printf("%2d", player[j].card_player[i].number);
                break;
            }
            printf(" of ");
            switch (player[j].card_player[i].shape) {
            case 0:
                printf("♥ ");
                break;
            case 1:
                printf("◆ ");
                break;
            case 2:
                printf("♣ ");
                break;
            case 3:
                printf("♠ ");
                break;
            }
            printf("     ");
        }
        printf("\n");
    }
    return 0;
}

 

728x90

댓글