donchanee

구조체에 대한 5문제 본문

프로그래밍/C언어

구조체에 대한 5문제

donchanee 2018. 12. 7. 13:32
728x90


#include <stdio.h>


typedef struct student{ // 학생 구조체 선언

    int stunum; // 학생번호

    double hei; // 키

    double wei; // 몸무게

}st;


int main() {

    int N, i;

    double heiavg=0.0, weiavg=0.0; // 평균 초기화

    st member[10]={'\0', 0, 0.0}; // 구조체 초기화

    

    scanf("%d", &N); // 학생수 입력받습니다.

    

    for(i=0;i<N;i++){

        scanf("%d %lf %lf", &member[i].stunum, &member[i].hei, &member[i].wei);

    } // 입력받을거 입력받습니다.

    for(i=0;i<N;i++){

        heiavg += member[i].hei;

        weiavg += member[i].wei; // 값들의 합을 일단 선언한 평균인자에 더합니다.

    }

    heiavg /= (double)N;

    weiavg /= (double)N; // 형변환한 학생수로 나눠줍니다.

    

    printf("%.1lf %.1lf\n", heiavg, weiavg); // 출력

    

    for(i=0;i<N;i++) {

        if(member[i].hei<heiavg){ // 키가 평균키보다 작고

            if(member[i].wei<weiavg) // 몸무게가 평균보다 적게 나가면

                printf("%d below\n", member[i].stunum); // below

            else // 몸무게는 많이 나가면

                printf("%d average\n", member[i].stunum); // average

        }

        else { // 키가 평균키보다 크고

            if(member[i].wei >= weiavg) // 몸무게가 평균보다 많이 나가면

                printf("%d super\n", member[i].stunum); // super

            else // 몸무게는 적게 나가면

                printf("%d average\n", member[i].stunum); // average 입니다.

        }

    }

    return 0;

}


#include <stdio.h>

#include <string.h>


typedef struct student{ // 학생 구조체 선언

    char name[10];

    char fav[3][10];

}STUDENT;


int ABC (STUDENT stu[], char *perA, char *perB) { // 문제에 나온 ABC 함수입니다.

    STUDENT *p;

    int i;

    

    for(p=stu;p<stu+3;p++) {

        if(!strcmp(p->name,perB)) { // perB학생이 있다면

            for(i=0;i<3;i++)

                if(!strcmp(p->fav[i], perA)) // 게다가 perA의 좋아하는 목록에 있다면

                    return 1; // 1을 반환합니다.

        }

    }

    return 0; // 아니라면 0을 반환합니다.

}


int main() {

    

    STUDENT stlist[3], *p=stlist;

    int i;

    

    for(p=stlist;p<stlist+3;p++) {

        scanf("%s -> %s %s %s", p->name, p->fav[0], p->fav[1], p->fav[2]);

        getchar(); // 입력을 받고 개행문자를 버립니다.

    }

    

    for(p=stlist;p<stlist+3;p++) { // 포인터를 사용해서 구조체를 둘러봅니다.

        for(i=0;i<3;i++)

        {

            if(ABC(stlist, p->name, p->fav[i])) // 함수를 사용해서 참이라면

                printf("%s %s\n", p->name, p->fav[i]); // 출력합니다.

        }

    }

    return 0;

}




#include <stdio.h>


typedef struct park { // 구조체 선언

    int car; // 차번호

    int stu; // 학생번호

    int indate[3]; // 들어온날짜

    int intime[2]; // 들어온시간

    int outdate[3]; // 나간날짜

    int outtime[2]; // 나간시간입니다.

}pk;


int main() {

    

    pk system[100], *p, *q, *r, illegal[50]; // 부정사용자 구조체를 따로 선언합니다.

    int N, cnt=0, tmp, flag = 0;

    

    scanf("%d", &N);

    

    for(p=system;p<system+N;p++) {

        scanf("%d %d", &p->car, &p->stu);

        scanf("%d-%d-%d", &p->indate[0], &p->indate[1], &p->indate[2]);

        scanf("%d:%d", &p->intime[0], &p->intime[1]);

        scanf("%d-%d-%d", &p->outdate[0], &p->outdate[1], &p->outdate[2]);

        scanf("%d:%d", &p->outtime[0], &p->outtime[1]);

    } // 입력부분입니다. 함수로 사용해 main을 깔끔하게 짜고싶었으나 다음문제에서만 함수로 사용했습니다.

    

    for(p=system;p<system+N;p++) {

        for(q=p+1; q<system+N; q++) { // 같은 사용자를 발견하기 위한 반복문입니다.

            if(p->stu == q->stu) { // 같은 사용자 발견!

                for(r=illegal;r<illegal+cnt;r++) {

                    if(r->stu == p->stu)

                        flag = 1; // 부정사용이 3건 이상 있을 수 있기때문에 깃발을 사용합니다.

                }

                if( flag == 0 ) {

                    illegal[cnt] = *p; // 2건이라면 부정사용자 리스트에 올립니다.

                    cnt ++; // 부정사용자 리스트 사람 수입니다.

                }

                flag = 0; // 초기화

            }

        }

    }

    

    for(p=illegal;p<illegal+cnt-1;p++) {

        for(q=p+1; q<illegal+cnt; q++) { // 오름차순 정렬을 위한 선택정렬입니다.

            if(p->stu > q->stu) {

                tmp = p->stu;

                p->stu = q->stu;

                q->stu = tmp;

            }

        }

    }

    

    for(p=illegal;p<illegal+cnt;p++) {

        printf("%d\n", p->stu); // 출력하는 반복문입니다.

    }

    

    return 0;

}




#include <stdio.h>


typedef struct park { // 구조체 선언합니다.

    int car; // 차번호

    int stu; // 학생번호

    int indate[3]; // 들어온날짜

    int intime[2]; // 들어온시간

    int outdate[3]; // 나간날짜

    int outtime[2]; // 나간시간

    int fare; // 요금입니다.

}pk;


void punish (pk system[], pk illegal[], int N); // 문제 3번에서 사용했던 부정사용자 색출 함수

void fare_cal(pk p[], pk q[]); // 요금 계산하는 함수

void input(pk system[], int N); // 구조체 입력받는 함수


int main() {

    

    pk system[100], illegal[50], *p; // 불법사용자는 중복이 최대로 될때 50이기 때문에 50으로 선언

    int N, M, i, carnum;

    

    scanf("%d", &N);

    

    input(system, N);

    punish(system, illegal, N); // 함수 사용합니다.

    

    scanf("%d", &M); // 요금 산정 시 차량의 대수

    

    for(i=0; i<M; i++) {

        scanf("%d", &carnum); // 차량 번호 입력받습니다.

        for(p=system;p<system+N;p++) {

            if(carnum == p->car) {

                

                fare_cal(p, illegal); // 요금 산정을 합니다.

                printf("%d\n", p->fare); // 요금을 출력합니다.

                

            }

        }

    }

    

    return 0;

}


void punish (pk system[], pk illegal[], int N) { // 문제 3번에서 사용했던 부정사용자 색출 함수

    

    pk *p, *q, *r;

    int cnt=0, tmp, flag = 0;

    

    for(p=system;p<system+N;p++) {

        for(q=p+1; q<system+N; q++) {

            if(p->stu == q->stu) {

                for(r=illegal;r<illegal+cnt;r++) {

                    if(r->stu == p->stu)

                        flag = 1;

                }

                if( flag == 0 ) {

                    illegal[cnt] = *p;

                    cnt ++;

                }

                flag = 0;

            }

        }

    }

    

    for(p=illegal;p<illegal+cnt-1;p++) {

        for(q=p+1; q<illegal+cnt; q++) {

            if(p->stu > q->stu) {

                tmp = p->stu;

                p->stu = q->stu;

                q->stu = tmp;

            }

        }

    }

}

void input(pk system[], int N) { // 입력받는 함수입니다.

    pk *p;

    

    for(p=system;p<system+N;p++) { // 포인터를 이용해서 입력을 받습니다.

        scanf("%d %d", &p->car, &p->stu);

        scanf("%d-%d-%d", &p->indate[0], &p->indate[1], &p->indate[2]);

        scanf("%d:%d", &p->intime[0], &p->intime[1]);

        scanf("%d-%d-%d", &p->outdate[0], &p->outdate[1], &p->outdate[2]);

        scanf("%d:%d", &p->outtime[0], &p->outtime[1]); // 중복이 발생하였지만 2개 이하여서 손코딩했습니다.

    }

}


void fare_cal(pk p[], pk q[]) { // 요금 산정 함수

    

    pk *r; // 포인터를 하나 더 사용했습니다.

    int time;

    

    time = (p->outtime[0] - p->intime[0]) * 60 + (p->outtime[1] - p->intime[1]);

    // 시간을 분단위로 계산했습니다.

    

    if( time / 10 >= 6 ) { // 분단위를 10으로 나눠서 1시간이 넘는지 확인합니다.

        if( time % 10 == 0 ) {

            p->fare = 3000 + (time / 10 - 6) * 1000; // 0단위로 끝날경우 요금부과가 1000원 적게 됩니다.

        }

        else

            p->fare = 3000 + (time / 10 - 6 + 1) * 1000; // 아닐 경우 1000원 더 부과합니다.

    }

    else

        p->fare = 3000; // 1시간 미만 주차일 경우 3000원만 부과합니다.

    

    if ( p->fare > 30000 )

        p->fare = 30000; // 주차요금의 최대값은 30000원

    

    for(r=q;r<q+50;r++) {

        if(p->stu == r->stu)

            p->fare = 100000; // 부정사용자 리스트에 있을경우 벌금 10만원

    }

    

}




#include <stdio.h>

#include <string.h>


typedef struct stuinfo { // typedef를 사용해서 구조체 선언합니다.

    char stuname[31];

    char stunum[9]; // 학생이름과 학번 문자열로 받습니다.

    int sub; // 과목수 입니다.

    char subname[10][31];

    double grade[10]; // 과목과 학점입니다.

    double avg; // 평균을 구조체에 저장하기위해 선언합니다.

}student;


void I (student stu[], student sort[], int *cnt);

void P (student stu[], int *cnt);

void S (student sort[], int *cnt);

int D (student stu[], student sort[], int *cnt); // 함수의 원형


int main() {

    char input;

    int cnt=0;

    student stu[100], sort[100]; // 배열하는 함수와 구분하기 위해 두가지를 선언합니다.

    

    while(1) { // Q가 입력될 때 까지 무한으로 반복합니다.

        scanf("%c", &input);

        getchar(); // 입력받은 개행문자를 버립니다.

        

        if(input == 'I'){

            I(stu, sort, &cnt); // I일 경우 I 함수 실행

        }

        else if(input == 'S'){

            S(sort, &cnt); // S일 경우 S 함수 실행

        }

        else if(input == 'D'){

            D(stu, sort, &cnt); // D일 경우 D 함수 실행

        }

        else if(input == 'P'){

            P(stu, &cnt); // P일 경우 P 함수 실행

        }

        else if(input == 'Q'){

            return 0; // Q일 경우 함수를 종료합니다.

        }

    }

    

    return 0;

}


void I (student stu[], student sort[], int *cnt) { // I 입력 펑션

    int i;

    student *p = &stu[*cnt];

    p->avg = 0; // 평균을 0으로 우선 초기화합니다.

    

    if(*cnt<100) { // 100명의 학생보다 적을 때에만 입력받습니다.

        scanf("%s %s %d", p->stuname, p->stunum, &p->sub);

        for(i=0;i<p->sub;i++) {

            scanf("%s %lf", p->subname[i], &p->grade[i]);

            p->avg += p->grade[i]; // 값들의 합을 계산해서 평균 구조체 값에 넣어둡니다.

        }

        getchar(); // 입력이 끝난뒤 개행문자를 버립니다.

        p->avg /= (double)p->sub; // 과목의 개수로 나눕니다. 평균이 됩니다.

        

        sort[*cnt] = stu[*cnt]; // S 펑션에서 쓸 정렬할 리스트에 복사해놓습니다.

        (*cnt)++; // 입력이 올때 학생수를 1명 늘립니다.

    }

}


void P (student stu[], int *cnt) { // P 출력 펑션

    

    student *p=stu;

    

    if(*cnt>0) { // 0명의 학생보다 많을때만 출력합니다.

        for(p=stu;p<stu+*cnt;p++) {

            printf("%s %s %d %.2lf\n", p->stuname, p->stunum, p->sub, p->avg);

        } // 일반적인 출력 반복문 입니다.

    }

}


void S (student sort[], int *cnt) { // S 정렬 출력 펑션

    student *p, *q, tmp;

    

    for(p=sort;p<sort+*cnt-1;p++) {

        for(q=p+1;q<sort+*cnt;q++) { // 선택정렬 방식을 사용했습니다.

            if(strcmp(p->stuname, q->stuname) > 0){

                tmp = *p;

                *p = *q;

                *q = tmp;

            }

        }

    }

    

    P(sort,cnt); // P 함수 재활용

}


int D (student stu[], student sort[], int *cnt) { // D 삭제 펑션

    char name[30]=" ";

    int i, j;

    

    if(*cnt > 0) { // 0명보다 많을때만 삭제가능합니다.

        gets(name); // 공백을 포함하여 아무 이름도 없을땐 실행하지 않기위해 gets를 사용합니다.

        

        for(i=0;i<*cnt;i++){

            if(!strcmp(stu[i].stuname, name)){ // 비교해서 같으면

                break; // 포문을 나갑니다.

            }

        }

        if(i != *cnt) { // 마지막 학생일때는 당길필요가 없습니다.

            for(j=i;j<*cnt-1;j++){

                stu[j] = stu[j+1]; // 아니라면 뒤 학생을 한칸씩 앞으로 당겨옵니다.

            }

        }

        

        for(i=0;i<*cnt;i++){

            if(!strcmp(sort[i].stuname, name)){

                break; // 정렬할 함수도 마찬가지로 지워야 하기때문에 똑같이 합니다.

            }

        }

        if(i != *cnt) { // sort 배열도 마찬가지로 해줍니다.

            for(j=i;j<*cnt-1;j++){

                sort[j] = sort[j+1];

            }

            (*cnt)--; // 학생수를 1명 지웠기 때문에 1명 줄여줍니다.

        }

        return 0;

    }

    return 0;

}




'프로그래밍 > C언어' 카테고리의 다른 글

합병정렬에 대한 문제.  (0) 2018.12.07
동적할당에 대한 4문제  (0) 2018.12.07
문자열에 대한 3문제  (0) 2018.12.07
포인터에 대한 4문제  (0) 2018.10.02
배열 문제 #7.  (0) 2018.05.22