본문 바로가기
01.Bit 단기/C

25_구조체실습, 비트필드, 공용체

by chojju 2018. 4. 28.
반응형

#include <stdio.h>

struct list{
 char name[20];
 char sex;
 int  age;
};

// inp 함수 구현, 사용자로부터 이름, 성별, 나이를 입력 받아 저장하는 기능
void inp1(struct list * pman );

void main(){
 struct list man;
 inp1(&man);
 printf("\n    Name   Sex     Age\n");
 printf("-------------------------\n");
 printf("%s      %c     %d\n", man.name, man.sex, man.age);
}

void inp1(struct list * pman)
{
 //1번째 방법 : 임시변수를 선언해서 입력받은 후
 //             대입연산을 통해 원본의 값에 저장하는 방법
 //char name[20];
 //char sex;
 //int  age;

 //printf("이름 : ");   gets(name);
 //printf("성별 : "); scanf("%c", &sex);
 //printf("나이 : ");  scanf("%d", &age);

 //pman->sex = sex;
 //pman->age = age;
 //strcpy(pman->name , name);

 //2번째 방법 : 직접 입력받는 방법
 printf("이름 : ");   gets(pman->name);
 printf("성별 : "); scanf("%c", &pman->sex);
 printf("나이 : ");  scanf("%d", &pman->age);
}


}

struct list{
 char name[20];
 char sex;
 int  age;
};

// inp 함수 구현, 사용자로부터 이름, 성별, 나이를 입력 받아 저장하는 기능
void inp2(char *name, char *psex, int *page);
// struct list함수의 멤버와 차수 동일

void main(){
 struct list man;
// inp1(&man);
 inp2(man.name, &man.sex, &man.age); 
 //<====== struct list함수의 멤버와 차수 동일

 printf("\n    Name   Sex     Age\n");
 printf("-------------------------\n");
 printf("%s      %c     %d\n", man.name, man.sex, man.age);
}
void inp2(char *name, char *psex, int *page)
{
 printf("이름 : ");   gets(name);
 printf("성별 : "); scanf("%c", psex);
 printf("나이 : ");  scanf("%d", page);
}


 

struct student_t{
 char name[20];
 int kor;
 int eng;
 int mat;
 int total;
 float aver;
 char grad;
};
void fun_inputjumsu(struct student_t * stulist, int size);
void fun_printstudent(const struct student_t * stulist, int size);
void fun_input_sum(struct student_t * stulist, int size);
void fun_input_aver(struct student_t * stulist, int size);
void fun_printresult(const struct student_t * stulist, int size);
void fun_input_grad(struct student_t * stulist, int size);

int main(){
 struct student_t  stulist[4] = { 0 };

 fun_inputjumsu(stulist, 4);
 fun_input_sum(stulist, 4);
 fun_input_aver(stulist, 4); 
 fun_input_grad(stulist, 4); //<==================
 fun_printstudent(stulist, 4);
 fun_printresult(stulist, 4); 
 return 0;
}

void fun_input_grad(struct student_t * stulist, int size)
{
 int i;
 for (i = 0; i < size; i++)
 {
  if (stulist[i].aver >= 90.0f && stulist[i].aver <= 100.0f)
  {
   stulist[i].grad = 'A';
  }
  else if (stulist[i].aver >= 80.0f && stulist[i].aver <= 89.0f)
  {
   stulist[i].grad = 'B';
  }
  else if (stulist[i].aver >= 70.0f && stulist[i].aver <= 79.0f)
  {
   stulist[i].grad = 'C';
  }
  else if (stulist[i].aver >= 60.0f && stulist[i].aver <= 69.0f)
  {
   stulist[i].grad = 'D';
  }
  else
  {
   stulist[i].grad = 'F';
  }
 }
}

void fun_printresult(const struct student_t * stulist, int size)
{
 int i;
 float kor_sum = 0, eng_sum = 0, mat_sum = 0;
 for (i = 0; i < size; i++)
 {
  kor_sum = kor_sum + stulist[i].kor;
  eng_sum = eng_sum + stulist[i].eng;
  mat_sum = mat_sum + stulist[i].mat;
 }
 printf(" >> 국어 평균 : %.2f\n", (float)kor_sum / size);
 printf(" >> 영어 평균 : %.2f\n", (float)eng_sum / size);
 printf(" >> 수학 평균 : %.2f\n", (float)mat_sum / size);
}


void fun_input_aver(struct student_t * stulist, int size)
{
 int i;
 for (i = 0; i < size; i++)
 {
  stulist[i].aver = stulist[i].total / 3.0f;
 }
}

void fun_input_sum(struct student_t * stulist, int size)
{
 int i;
 for (i = 0; i < size; i++)
 {
  stulist[i].total = stulist[i].kor + stulist[i].eng + stulist[i].mat;
 }
}

void fun_inputjumsu(struct student_t * stulist, int size)
{
 //국어, 영어, 수학
 int i;
 for (i = 0; i < size; i++)
 {
  printf("[%d] 번째 학생 성적 입력(국어, 영어, 수학)\n", i + 1);
  printf("  >> 입력 예) 홍길동 100 90 80 : ");
  scanf("%s", stulist[i].name);
  scanf("%d%d%d", &stulist[i].kor, &stulist[i].eng, &stulist[i].mat);
  printf("\n");
 }
}

void fun_printstudent(const struct student_t * stulist, int size)
{
 int i;
 printf("%10s%10s%10s%10s%10s%10s%10s\n",
  "이름", "국어", "영어", "수학", "총점", "평균", "등급");
 printf("======================================================================\n");

 for (i = 0; i < size; i++)
 {
  printf("%10s%10d%10d%10d%10d%10.2f%10c\n",
   stulist[i].name,
   stulist[i].kor, stulist[i].eng, stulist[i].mat,
   stulist[i].total, stulist[i].aver,
   stulist[i].grad);
 }
 printf("======================================================================\n");

}


#include <stdio.h>
/*
비트필드 구조체는 일반적으로 동일타입으로 맴버가 구성된다.
주로 사용되는 타입은 unsignd int
>> 맴버들은 unsigned int 타입의 크기를
   비트단위로 나누어 사용한다.
>> 목적은 메모리 효율성..............
사용방법은 구조체 사용법과 동일하나
단 하나, 맴버변수에 직접 입력할 수 없다.
*/
/*
struct AAA
{
 unsigned int num1 : 3;
 unsigned int num2 : 4;
 unsigned int num3 : 1;
};

void main()
{
 printf("%dbyte\n", sizeof(struct AAA));
}

[예제] 사용자 글씨체에 대한 선택정보를 구조체 비트 필드를 이용하여 저장하는 프로그램
#include <stdio.h>
struct font { unsigned int bold : 1;  // 1비트 : 0 or 1의 값만 갖는다.
 unsigned int italic : 1;  // 1비트 : 0 or 1의 값만 갖는다.
 unsigned int size : 7;   // 7비트 : 0 ~ 127 사이의 값을 갖는다.
};
int main(void)
{
    struct font myfont = {0,0,10};
    char ch;
    unsigned int res;

    printf("기본 글씨체:%s %s, 크기:%d 입니다.\n", (myfont.bold == 1?"굵고":"얇고"),
           (myfont.italic == 1? "이탤릭체이며":"이탤릭체가 아니며"), myfont.size);

    printf("글씨체를 바꾸시겠습니까? (Y or N) : ");  scanf("%c", &ch);
    if (ch == 'Y' || ch == 'y')
    {
        printf("굵은 글씨체로 하시겠습니까? (1 or 0) : ");  scanf("%d", &res);
        myfont.bold = res;

        printf("이탤릭체로 하시겠습니까? (1 or 0) : ");  scanf("%d", &res);
        myfont.italic = res;

        printf("크기는 몇으로 하시겠습니까? (1 ~ 127) : "); scanf("%d", &res);
        myfont.size = res;

        printf("선택한 글씨체:%s %s, 크기:%d 입니다.\n",(myfont.bold == 1?"굵고":"얇고"),
               (myfont.italic == 1? "이탤릭체이며":"이탤릭체가 아니며"), myfont.size);
    }
    return 0;
}
*/

#include <stdio.h>
struct font {
 unsigned int bold : 1;  // 1비트 : 0 or 1의 값만 갖는다.
 unsigned int italic : 1;  // 1비트 : 0 or 1의 값만 갖는다.
 unsigned int size : 7;   // 7비트 : 0 ~ 127 사이의 값을 갖는다.
 unsigned int rest   : 23;  // 남는 공간
};
int main(void)
{
 struct font myfont = { 0, 0, 10 };
 char ch;
 unsigned int res;

 printf("기본 글씨체:%s %s, 크기:%d 입니다.\n",
      (myfont.bold == 1 ? "굵고" : "얇고"),
      (myfont.italic == 1 ? "이탤릭체이며" : "이탤릭체가 아니며"), myfont.size);

 printf("글씨체를 바꾸시겠습니까? (Y or N) : ");  scanf("%c", &ch);
 if (ch == 'Y' || ch == 'y')
 {
  printf("굵은 글씨체로 하시겠습니까? (1 or 0) : "); 
  scanf("%d", &res);
  myfont.bold = res;

  printf("이탤릭체로 하시겠습니까? (1 or 0) : ");  scanf("%d", &res);
  myfont.italic = res;

  printf("크기는 몇으로 하시겠습니까? (1 ~ 127) : "); scanf("%d", &res);
  myfont.size = res;

  printf("선택한 글씨체:%s %s, 크기:%d 입니다.\n", (myfont.bold == 1 ? "굵고" : "얇고"),
   (myfont.italic == 1 ? "이탤릭체이며" : "이탤릭체가 아니며"), myfont.size);
 }
 return 0;
}


#include <stdio.h>
/*

공용체

*/
#pragma pack(1)  // 바이트 메모리 저장 단위
struct AAA
{
 int num1 ;
 char num2 ;
 char num3[20];
};
union BBB
{
 char num2;
 int num1;
 char num3[20];
};
void main()
{
 struct AAA a;
 union  BBB b;
 printf("%d : %d : %d\n", &a.num1, &a.num2, &a.num3);
 printf("%d : %d : %d\n", &b.num1, &b.num2, &b.num3);

 printf("%dbyte\n", sizeof(struct AAA)); //25
 printf("%dbyte\n", sizeof(union BBB)); //25
}


 

반응형

'01.Bit 단기 > C' 카테고리의 다른 글

27_파일IO기본코드  (0) 2018.04.28
26_typedef사용법  (0) 2018.04.28
24_구조체포인터및인자전달  (0) 2018.04.28
23_구조체배열  (0) 2018.04.28
22_구조체1  (0) 2018.04.28

댓글