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

[C 프로그래밍 실습] Report 04

by 2den 2021. 1. 8.
728x90

Program 1

 

다음 내용을 참고로 구조체 employee를 정의하고, 아래 출력 화면의 내용으로 직원 4명의  정보를 초기값으로 설정하여 출력하시오. 그리고 사번 또는 이름과 새로운 인센티브를 입력하여 변경된 연봉을 출력하도록 하는 프로그램을 작성하시오. (Lab 10 동일문제)

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

 

 

1) 문제 해결 방법에 대한 설명

  • _Person 구조체와 _Employee 구조체를 만들어 사용
  • Line 24에서 연봉 직접 계산하여 출력
  • 사용자 정의 함수 : _Employee 구조체 배열의 내용을 table로 출력하는 printe 함수 정의
  • 나머지 설명은 주석으로 대신합니다.

 

2) 소스 코드

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

//_Person 구조체
typedef struct _Person {
    int no;
    char name[10];
    char digits[20];
} Person;

//_Employee 구조체
typedef struct _Employee {
    Person p;
    int slr;
    int inc;
} Employee;

//printe 사용자 정의 함수
void printe(Employee* e)
{
    printf("  사번     이름     전화번호      월급   인센티브   연봉\n");
    printf("--------------------------------------------------------\n");
    for (int i = 0; i < 4; i++)
    {
        //연봉 계산 출력
        printf("%d  %s  %s  %d  %d%%  %.0lf\n", e[i].p.no, e[i].p.name, e[i].p.digits, e[i].slr, e[i].inc, (float)e[i].slr * (12.0 + (float)(e[i].inc / 100.0)));
    }
    printf("\n");
}

int main()
{
    Employee e[4];

    //구조체 값 입력
    e[0].p.no = 20123478;
    e[1].p.no = 20123479;
    e[2].p.no = 20123480;
    e[3].p.no = 20123481;

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

    strcpy(e[0].p.digits, "011-1111-1111");
    strcpy(e[1].p.digits, "011-2222-2456");
    strcpy(e[2].p.digits, "011-3333-2456");
    strcpy(e[3].p.digits, "017-2222-2456");

    e[0].slr = 1200000;
    e[1].slr = 1500000;
    e[2].slr = 1800000;
    e[3].slr = 2200000;

    e[0].inc = 120;
    e[1].inc = 150;
    e[2].inc = 180;
    e[3].inc = 250;

    printe(e);

    // 새로운 인센티브
    while (1)
    {
        printf("인센티브를 변경합니다...\n");
        printf("사번 또는 이름, 인센티브 입력하시오 >> ");

        int newi, sno;
        char n[50] = "";

        scanf(" %s %d", n, &newi);
        printf("\n");

        // 사번 입력 시
        if (isdigit(n[0]))
        {
            int flag = 0;
            sno = atoi(n);

            for (int i = 0; i < 4; i++)
            {
                if (e[i].p.no == sno)
                {
                    e[i].inc = newi;
                    flag = 1;
                }
            }

            // 오류처리
            if (flag != 1)
            {
                printf("\n오류발생\n");
                continue;
            }
        }

        // 이름 입력 시
        else
        {
            int flag = 0;

            for (int i = 0; i < 4; i++)
            {
                if (!strcmp(e[i].p.name, n))
                {
                    e[i].inc = newi;
                    flag = 1;
                }
            }

            // 오류처리
            if (flag != 1)
            {
                printf("\nerror\n");
                continue;
            }
        }

        printe(e);
    }

    return 0;
}

 

3) 입력/출력 결과

 

 

Program 2

 

아래와 같은 정수, 문자, 정수 배열, 문자열을 출력할 수 있는 함수 printitems()를 쓰시오.

  • 함수 void printItems(void *p, int size, int datatype)
    • 첫번째 인자 : 출력하려는 자료,  void * 를 사용,.
    • 두번째 인자: int , 출력하려는 자료의 데이터 개수
    • 세번째 인자, 출력하려는 자료형, enum에 정의된 4가지중 하나 enum DTYPE {INT, CHAR, INTARY, CHARSTR };
  • 아래 자료와 출력 결과를 참고하여 프로그램을 쓰시오

int ary[10] = {1,2,3,4,5,6,7,8,9,10};

char *str = "abcdef";

 

 

1) 문제 해결 방법에 대한 설명

  • printItems 함수와 DTYPE enum 정의
  • 데이터 타입을 확인할 때 정의한 DTYPE 사용
  • 사용자 정의 함수 : printItems 정의
  • 나머지 설명은 주석으로 대신합니다.

2) 소스 코드

#include <stdio.h>

//enum DTYPE 정의
enum DTYPE { INT, CHAR, INTARY, CHARSTR };

void printItems(void* p, int size, int datatype)
{
    // 0
    if (datatype == INT)
    {
        int* ptr = (int*)p;
        printf("%d\n", ptr[0]);
    }
    // 1
    else if (datatype == CHAR)
    {
        char* ptr = (char*)p;
        printf("%c\n", ptr[0]);
    }
    // 2
    else if (datatype == INTARY)
    {
        int* ptr = (int*)p;
        for (int i=0; i<size; i++)
        {
            printf("%d ", ptr[i]);
        }
        printf("\n");
    }
    // 3
    else if (datatype == CHARSTR)
    {
        char* ptr = (char*)p;
        for (int i = 0; i < size; i++)
        {
            printf("%c ", ptr[i]);
        }
        printf("\n");
    }
    // 오류처리
    else
    {
        printf("\n오류발생\n");
    }
}

int main()
{

    int ary[10] = { 1,2,3,4,5,6,7,8,9,10 };
    char* str = "abcdef";

    printf("ary[0] = ");
    printItems(ary, 1, INT);

    printf("*str = ");
    printItems(str, 1, CHAR);

    printf("ary = ");
    printItems(ary, 10, INTARY);

    printf("str = ");
    printItems(str, 6, CHARSTR);

    return 0;
}

 

3) 입력/출력 결과

 

Program 3

 

다음을 참고로 주어진 입력 파일에서 특정한 문자열을 검색하여 검색된 줄 번호와 그 내용을 출력하는 프로그램을 작성하시오.

  • 입력 파일은 명령행 인자로 처리하고 주어진 “clanguage.txt” 파일을 사용한다
  • 검색단어는 표준입력으로 받는다.

 

 

1) 문제 해결 방법에 대한 설명

  • 명령행에서 파일 이름을 받아 실행, clanguage.txt 활용
  • Line 19에서 표준입력으로 검색단어 받기
  • 사용자 정의 함수 : printline 정의
  • 나머지 설명은 주석으로 대신합니다.

2) 소스 코드

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

// 사용자 정의 함수
void printline(int line, char buffer[])
{
    printf("%d:   %s", line, buffer);
}

int main(int argc, char* fname[])
{
    FILE* fp;
    char search[10];
    char buffer[100];
    int line = 0;

    // 명령행 인자 확인, 표준입력
    printf("검색에 사용될 파일은 %s 입니다.\n", fname[1]);
    printf("검색할 단어를 입력하시오 >> ");
    scanf("%s", search);

    fp = fopen(fname[1], "r");

    // 오류처리
    if (fp == NULL)
    {
        fprintf(stderr, "파일 %s를 열 수 없습니다. \n", fname);
        exit(1);
    }

    // 파일이 끝날때까지
    while (!feof(fp))
    {
        line++;
        fgets(buffer, 300, fp);

        // 검색
        if (strstr(buffer, search) != NULL)
        {
            printline(line, buffer);
        }
    }

    fclose(fp);

    return 0;
}

3) 입력/출력 결과

 

 

Program 4

 

다음 입력 파일, 출력 파일을 참고하여 구조체를 정의하고, 입력 파일의 내용을 읽어서 각 학생 점수의 합을 구하여 표준 출력과 out.txt 파일에 아래의 내용과 합을 출력하는 프로그램을 작성하시오.

 


1) 
제 해결 방법에 대한 설명

  • 구조체 _Person 정의
  • 입력 받아 구조체에 넣고, 새로 연산한 합계까지 새로운 파일에 출력
  • 사용자 정의 함수 : printp 정의 (cmd창에 출력)
  • 나머지 설명은 주석으로 대신합니다.

 

2) 소스 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// _Person 구조체
typedef struct _Person {
  int num;
  char name[10];
  float sub1;
  float sub2;
  float sum;
} Person;

// 사용자 정의 함수
void printp(Person* p)
{
  printf("%d    %6s %6.1f %6.1f %6.1f\n", p->num, p->name, p->sub1, p->sub2, p->sum);
}

int main()
{
  Person people[6];
  char buffer[20];

  // 파일 입력
  FILE *fpr = fopen("in.txt", "r");
  // 오류처리
  if (fpr == NULL) printf("file open error\n");

  // 구조체에 저장
  for(int i=0; i<6; i++)
  {
    fscanf(fpr," %s",buffer);
    people[i].num = atoi(buffer);

    fscanf(fpr," %s",buffer);
    strcpy(people[i].name, buffer);

    fscanf(fpr," %s",buffer);
    people[i].sub1 = strtof(buffer, NULL);

    fscanf(fpr," %s",buffer);
    people[i].sub2 = strtof(buffer, NULL);

    // 합계 계산
    people[i].sum = people[i].sub1 + people[i].sub2;
  }
  fclose(fpr);

  // 출력파일 열기, 존재하지 않으면 새로 생성
  FILE *fpw = fopen("out.txt", "w");

  printf("번호  이름    과목1  과목2  합계\n");
  printf("--------------------------------\n");
  for (int i=0; i<6; i++)
  {
    // 출력파일에 출력
    fprintf(fpw, "%d    %6s %6.1f %6.1f %6.1f\n", people[i].num, people[i].name, people[i].sub1, people[i].sub2, people[i].sum);
    // cmd 출력
    printp(&people[i]);
  }
  fclose(fpw);

  return 0;
}

 

 

3) 입력/출력 결과

 

 

728x90

댓글