일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- https://stackoverflow.com/questions/219110/how-python-web-frameworks-wsgi-and-cgi-fit-together/219124#219124
- 스택 괄호
- 스택 구현
- 괄호 짝 잘맞는지
- 장고 하는법
- 데크 구현
- Django tutorial
- 괄호 유효성
- rest gql
- grid flex
- 풀스택?
- 후위수식
- 스택 중위수식
- 루비 초보
- 스택 삭제
- restapi graphql
- 중위수식을 후위수식
- 스택 삽입
- 자료구조 데크
- 중위수식
- 스택 후위수식
- 스택 유효성
- flex html
- golang
- 장고 웹 만들기
- grid html
- 스택 자료구조
- go
- rest graphql
- 풀스택
- Today
- Total
donchanee
구조체에 대한 5문제 본문
#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 |