본문 바로가기
C++

[C언어]구조체를 이용한 학생 성적 관리 프로그램

by cod1ng 2023. 11. 19.

C언어 구조체를 이용한 학생 성적 관리 프로그램 

//std.h
#pragma once

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

#include "student.h"
#include "control.h"
#include "wbfile.h"

//start.c
#include "std.h"

//흐름
void app_init();
void app_run();
void app_exit();
//start.c
int main()
{
app_init();
app_run();
app_exit();
return 0;
}

void app_init()
{
con_init();

system("cls"); //#include <stdlib.h>
printf("**********************************************\n");
printf(" C언어 프로그래밍\n");
printf(" 구조체를 활용한 회원 관리 프로그램\n");
printf(" 2023.11.19\n");
printf("**********************************************\n");
system("pause");
}

void app_run()
{

while (1)
{
system("cls");
con_stu_printall();
printf("**********************************************\n");
printf(" [1] 저장(insert)\n");
printf(" [2] 검색(select)\n");
printf(" [3] 수정(update)\n");
printf(" [4] 삭제(delete)\n");
printf(" [5] 종료(exit)\n");
printf("**********************************************\n");
char idx = _getch(); //#include <conio.h>

switch (idx)
{
case '1':  con_stu_insert(); break;
case '2':  con_stu_select(); break;
case '3':  con_stu_update(); break;
case '4':  con_stu_delete(); break;
case '5':   return;
}
system("pause");
}
}

void app_exit()
{
con_exit();

system("cls");
printf("**********************************************\n");
printf(" 프로그램 종료\n");
printf("**********************************************\n");
system("pause");
}

//student.c
#include "std.h"

 

//student.h
#pragma once

typedef struct tagstudent
{
int  number;
char name[20];
int  test1;
int  test2;
int  report;
int  attend;
int  total;
}student;

 

//control.c
#include "std.h"

student g_students[DATA_MAX];

void con_init()
{
wbfile_load();
}

void con_exit()
{
wbfile_save();
}

void con_stu_insert()
{
printf("\n[저장]\n");

int number;
char name[20];
int test1;
int test2;
int report;
int attend;
int idx; 


printf("저장 위치(0~%d) : ", DATA_MAX-1);  scanf_s("%d", &idx);
char dummy = getchar();

printf("번    호 : ");  scanf_s("%d", &number);
dummy = getchar();

printf("이    름 : ");  gets_s(name, sizeof(name));
printf("중간고사 : ");  scanf_s("%d", &test1);
printf("기말고사 : ");  scanf_s("%d", &test2);
printf("과    제 : ");  scanf_s("%d", &report);
printf("출    석 : ");  scanf_s("%d", &attend);
dummy = getchar();


if (g_students[idx].number != 0)
{
printf("이미 회원정보가 존재\n");
return;
}

g_students[idx].number = number;
strcpy_s(g_students[idx].name, sizeof(g_students[idx].name), name);
g_students[idx].test1 = test1;
g_students[idx].test2 = test2;
g_students[idx].report = report;
g_students[idx].attend = attend;
g_students[idx].total = test1 + test2 + report + attend;

printf("저장되었습니다\n");
}

void con_stu_select()
{
printf("\n[검색]\n");

int number;
printf("학생번호 입력 : "); scanf_s("%d", &number);
char dummy = getchar();

int idx = numbertoidx(number);
if (idx == -1)
{
printf("없는 번호\n");
}
else
{
printf("[학생번호] %d\n", g_students[idx].number);
printf("[이    름] %s\n", g_students[idx].name);
printf("[중간고사] %d\n", g_students[idx].test1);
printf("[기말고사] %d\n", g_students[idx].test2);
printf("[과    제] %d\n", g_students[idx].report);
printf("[출    석] %d\n", g_students[idx].attend);
printf("[합    계] %d\n", g_students[idx].total);
}
}

void con_stu_update()
{
printf("\n[수정]\n");

int number, test1, test2;

printf("번    호 : ");  scanf_s("%d", &number);
printf("중간고사 : ");  scanf_s("%d", &test1);
printf("기말고사 : ");  scanf_s("%d", &test2);
char dummy = getchar();

int idx = numbertoidx(number);
if (idx == -1)
{
printf("없는 번호\n");
}
else
{
g_students[idx].test1 = test1; 
g_students[idx].test2 = test2;
g_students[idx].total = test1 + test2 + g_students[idx].report + g_students[idx].attend;

printf("성적 수정\n");
}
}

void con_stu_delete()
{
printf("\n[삭제]\n");

int number;
printf("학생번호 입력 : "); scanf_s("%d", &number);
char dummy = getchar();

int idx = numbertoidx(number);
if (idx == -1)
{
printf("없는 번호\n");
}
else
{
g_students[idx].number = 0;

printf("삭제 성공\n");
}
}

void con_stu_printall()
{
for (int i = 0; i < DATA_MAX; i++)
{
student stu = g_students[i];

if (stu.number == 0)
{
printf("[%d]\n", i);
}
else
{
printf("[%d] %d \t %s \t %d \t %d \t %d \t %d \t %d\n",
i, stu.number, stu.name, 
stu.test1, stu.test2, stu.report, stu.attend, stu.total);
}
}
}

//순차검색
int  numbertoidx(int number)
{
for (int i = 0; i < DATA_MAX; i++)
{
if (g_students[i].number == number) //비교
{
return i; //성공: 인덱스 
}
}
return -1; //  실패
}

 

//control.h
#pragma once

#define DATA_MAX 10

void con_init();
void con_exit();

void con_stu_insert();
void con_stu_select();
void con_stu_update();
void con_stu_delete();
void con_stu_printall();
int  numbertoidx(int number);