'2008/08'에 해당되는 글 23건

  1. 2008/08/08 이름과 점수를 입력받아 관리하는 프로그램 by TDRemon
  2. 2008/08/08 날짜 계산 프로그램 by TDRemon

#include<stdio.h>
#include<windows.h>
#include<conio.h>

#define DataFile "c:\\data.txt"

void menu();
void input_sub();
void append_sub();
void search_sub();
void view_sub();

struct AA{
 char name[20]; // 이름 저장할 배열
 int kor, eng, tot; // 국어, 영어, 총점
 double avg; // 평균
};

void main()
{
 char ch;
 while(1){
  menu();
  ch = getche(); // 문자하나를 받아 ch에 저장
  switch(ch){
   case '1' : input_sub(); break;
   case '2' : append_sub(); break;
   case '3' : search_sub(); break;
   case '4' : view_sub(); break;
   case '5' : exit(0);
  }
 }
}

void menu()
{
 system("cls"); // 화면 클리어
 printf("1.InputData\n");
 printf("2.AppendData\n");
 printf("3.SearchData\n");
 printf("4.ViewData\n");
 printf("5.Exit\n");
 printf("Select ? ");
}

void search_sub()
{
 struct AA saram;
 int sw;
 char temp[20], imsi[20];
 FILE *fp;
 fp=fopen(DataFile, "r");
 system("cls");
 printf("Serach Name ? ");
 scanf("%s", temp);

 while(1){
  fgets(saram.name, 20, fp);
  if(feof(fp))
   break;
  fscanf(fp, "%d %d", &saram.kor, &saram.eng);
  fscanf(fp,"%*c"); // enter clear
  saram.name[strlen(saram.name)-1] = '\0'; //마지막 문자열에 저장된 '\n'를 '\0'로 바꿔저는 함수
  strcpy(imsi,saram.name); // saram.name에 저장된 내용을 imsi에 복사
  strupr(temp); // strupr함수는 소문자를 대문자로 바꿔주는 함수이다
  strupr(imsi); // strlwr함수는 대문자를 소문자로 바꿔주는 함수이다
  if(strncmp(temp,imsi,strlen(temp))==0){
   saram.tot = saram.kor+saram.eng;
   saram.avg = (double)saram.tot/2;
   printf("%-20s%-5d%-5d%-5d%-8.2lf\n", saram.name, saram.kor, saram.eng, saram.tot, saram.avg);
  }
  sw=1;
 }
 if(sw==0)printf("Nor found.....\n");
 getch(); // 하나의 문자를 입력 받을때까지 기다림
}

void input_sub()
{
 struct AA saram;
 FILE *fp;
 fp=fopen(DataFile, "w");
 system("cls");
 printf("==== Input Data ====\n");

 while(1){
  printf("Name ? "); gets(saram.name); fflush(stdin);
  if(stricmp(saram.name, "end")==0)
   break;
  printf("Kor ? "); scanf("%d", &saram.kor); fflush(stdin);
  printf("Eng ? "); scanf("%d", &saram.eng); fflush(stdin);

  fprintf(fp, "%s\n", saram.name);
  fprintf(fp, "%5d%5d\n", saram.kor, saram.eng);
 }
 fclose(fp);

}

void append_sub()
{
 struct AA saram;
 FILE *fp;
 fp=fopen(DataFile, "a");
 getch();
 system("cls");
 printf("==== Append Data ====\n");

 while(1){
  printf("Name ? "); gets(saram.name); fflush(stdin);
  if(stricmp(saram.name,"end")==0)
   break;
  printf("Kor ? "); scanf("%d", &saram.kor); fflush(stdin);
  printf("Eng ? "); scanf("%d", &saram.eng); fflush(stdin);

  fprintf(fp, "%s\n", saram.name);
  fprintf(fp, "%5d%5d\n", saram.kor, saram.eng);
 }
 fclose(fp);
}

void view_sub()
{
 FILE *fp;
 struct AA saram;
 int cnt = 0;
 fp = fopen(DataFile, "r");

 system("cls"); // 화면 클리어
 printf("==== Data View ====\n");

 printf("%-20s%-5s%-5s%-5s%-8s\n", "Name", "Kor", "Eng", "Tot", "Avg");

 while(1){
  fgets(saram.name, 20, fp);
  fscanf(fp, "%*c"); // 버퍼에 있는 데이터를 저장하지 않고 꺼내기만 함.
  if(feof(fp))
   break;
  fscanf(fp, " %d %d", &saram.kor, &saram.eng);
  fscanf(fp, "%*c"); // enter clear


  saram.tot = saram.kor+saram.eng;
  saram.avg = (double)saram.tot/2;

  saram.name[strlen(saram.name)-1] = '\0';

  if(cnt==0){
   system("cls");
   printf("%-20s%-5s%-5s%-5s%-8s\n", "Name", "Kor", "Eng", "Tot", "Avg");
  }

  printf("%-20s%-5d%-5d%-5d%-8.2lf\n", saram.name, saram.kor, saram.eng, saram.tot, saram.avg);
  cnt++;
  if(cnt==3){
   printf(".................more\n");
   getch();
   cnt=0;
  }
 }
 printf(".................data end\n");
 getch(); // 문자하나 입력 받을때까지 잠깐 멈춰 주세요

 fclose(fp);
}

Posted by TDRemon

// 날짜 계산하는 프로그램
#include<stdio.h>

void main()
{
 int data[2][3];
 long sum[2], result;
 int i;
 char name[20];

 printf("입력 ]\n = Today =\n");
 printf("년 ? ");
 scanf("%d", &data[0][0]); // 오늘의 년
 printf("월 ? ");
 scanf("%d", &data[0][1]); // 오늘의 월
 printf("일 ? ");
 scanf("%d", &data[0][2]); // 오늘의 일

 printf("\n = Brithday =\n");
 printf("이름 ? ");
 scanf("%s", name); // 이름
 printf("년 ? ");
 scanf("%d", &data[1][0]); // 태어난 년
 printf("월 ? ");
 scanf("%d", &data[1][1]); // 태어난 월
 printf("일 ? ");
 scanf("%d", &data[1][2]); // 태어난 일

 for(i=0; i<2; i++){
  if((data[i][0]%4 == 0) && (data[i][1] > 2)){
   sum[i] = ((data[i][0]-1)*365+((data[i][0]-1)/4))+
     ((data[i][1]-1)/2-1)*30+29+((data[i][1]-1)-((data[i][1]-1)/2))*31+data[i][2];
  }
  else{
   sum[i] = ((data[i][0]-1)*365+((data[i][0]-1)/4))+
     ((data[i][1]-1)/2-1)*30+28+((data[i][1]-1)-((data[i][1]-1)/2))*31+data[i][2];
  }
 }

 result = sum[0]-sum[1]+1;
 printf(" = Result = \n");
 printf("%s님 오늘까지 총 살아온 일수가 %d일입니다.", name, result);
}
이 프로그램은 나에게 반복적인 연산이 수행되면 반드시 for문이나 while문을 써야한다는 인식을 고쳐준 프로그램이다. 정확히 말하면 이 프로그램이 아니라 이와 비슷한 다른 프로그램이었지만... 이 프로그램에서 중요한 부분이라고 하다면... x/y를 하게되면 몫만 정수로써 출력된다는 것을 각인 시켰줬다는 점이다. 그리고 날짜의 특성, 윤달이나 월별로 30일 31일로 끝난다는 점을 이용한 계산식이다. 반복문의 사용을 줄임으로써 보다 빠른 프로그램이 구현 가능했다. 뭐 이정도에서는 거의 차이가 안나겠지만...

Posted by TDRemon