우분투에서 이클립스 메뉴 탭이 안보이는 것 해결.
위 파일을 받아서 아래와 같은 두 줄만 mino부분을 자기가 경로이름으로 만들어준다.
Icon=/home/mino/Eclipse/icon.xpm
Exec=env UBUNTU_MENUPROXY= /home/mino/Eclipse/eclipse
포인터 리뷰
#include <stdio.h>
int main()
{
int num = 10;
int * ptr; //포인터 변수 선언
ptr = # //할당
printf("num = %d, &num = %u\n", num, &num);
printf("*ptr = %d, ptr = %u\n", *ptr, ptr);
return 0;
}
출력:
num = 10, &num = 3215480600
*ptr = 10, ptr = 3215480600
-----------------------------------------
#include <stdio.h>
int main()
{
int num1, num2;
int * ptr = &num1;
*ptr = 10; //num1=10
printf("%d, %d, %d\n", num1, num2, *ptr);
num2 = *ptr;
printf("%d, %d, %d\n", num1, num2, *ptr);
ptr = &num2;
*ptr = 5; //num2=5
printf("%d, %d, %d\n", num1, num2, *ptr);
return 0;
}
출력:
10, 134513883, 10
10, 10, 10
10, 5, 5
---------------------------------------------
int num1, num2;
int * ptr;
num1 = 123;
ptr = &num1;
num2 = *ptr; //num2=num1
printf("%d, %d ,%d\n", num1, num2, *ptr); //포인터변수를 통한 값 복사
ptr = &num2;
*ptr = 456;
printf("%d, %d ,%d\n", num1, num2, *ptr);
출력:
123, 123 ,123
123, 456 ,456
---------------------------------------------------
//pointer 변수 사용시 주의할점1
int * ptr;
ptr = 150; //ptr을 어디다 넣을 것인가?
printf("*ptr = %d\n", *ptr); //값이 나오질 않음.
----------//pointer 변수 사용시 주의할점1
int num = 100;
char * ptr = # //int 와 char 은 호환이 안되는 타입
printf("%d, %d\n", num, *ptr);
출력이 될수도 있지만, 일반적으로 에러가 난다.
---------------------------------------------------
char str[10];
char * ptr;
str[0] = 'A'; str[1] = 'B'; str[2] = 'C';
ptr = str;
printf("%c, %c, %c\n", str[0], str[1], str[2]);
printf("%c, %c, %c\n", *ptr, *(ptr+1), ptr[2]);
int i;
for(i=0; i<3 ; i++) printf("%c\t", *ptr++);
출력:
A, B, C
A, B, C
A B C
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
int array[5] = {10,20,30,40,50};
int * ptr = array;
printf("++*ptr = %d\n", ++*ptr); // a[0] = 11
printf("*++ptr = %d\n", *++ptr); // a[1] = 20. 포인터 이동후 값 찍음
printf("--*ptr = %d\n", --*ptr); // a[1] = 19
printf("*--ptr = %d\n", *--ptr); // a[0] = 11. 포인터 이동후 값 찍음.
printf("*ptr + 1 = %d\n", *ptr + 1); //a[0] = 12
printf("*(ptr+1) = %d\n", *(ptr+1)); //a[0] = 19 - a[1]의 값만 찍어주는 것임.
printf("*ptr++ = %d\n", *ptr++); //a[0] = 11 을 찍어주고 포인터 a[1]로 이동
printf("(*ptr)++ = %d\n", (*ptr)++); //a[1] = 19 를찍어주고 20으로 바뀜
출력:
++*ptr = 11
*++ptr = 20
--*ptr = 19
*--ptr = 11
*ptr+1 = 12
*(ptr+1) = 19
*ptr++ = 11
(*ptr)++ = 19
---------------------------------------------------
//const와 pointer 변수와의 관계
int num;
const int * ptr = # //ptr을 통해서는 num을 바꾸지 않겠다는 의미.
*ptr = 500;
//num = 100; //ok
printf("num = %d\n", num);
오류가 발생한다. error: assignment of read-only location ‘*ptr’
-------------------
int num = 10;
int num1 = 100;
int * const ptr = # //ptr을 통으로 상수화.
printf("num = %d\n", num);
ptr = &num1; //오류발생. ptr은 오직 num번지만 가지고있으며, 다른 주소는 가질 수 없다.
=======================================================================================
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <time.h>
time_t now;
//now = time(0);
time_t * ptr = &now;
now = time(ptr);
//printf("%d\n",now); //1394158939초가 나온다... 초로 출력 되기 때문에..
struct tm * tmptr = localtime(ptr);
printf("Year = %d, Month = %d, Day = %d\n", tmptr->tm_year, tmptr->tm_mon, tmptr->tm_mday);
//month는 1900을 더해줘야하고 month는 1을 더해줘야 제대로 날짜가 나온다.
printf("Now is %d년 %d월 %d일 %d시 %d분 %d초입니다.\n", (1900 + tmptr->tm_year), (1+tmptr->tm_mon),
tmptr->tm_mday, tmptr->tm_hour, tmptr->tm_min, tmptr->tm_sec);
출력:
Year = 114, Month = 2, Day = 7
Now is 2014년 3월 7일 11시 39분 20초입니다.
-----------------------------------------------
#include <time.h>
time_t now;
time_t * ptr = &now;
now = time(ptr);
struct tm * tmptr = localtime(ptr);
char * str = (char *)malloc(100);
str = asctime(tmptr);
puts(str);
출력:
Fri Mar 7 11:44:57 2014
----------------------------------------------------
#include <time.h>
time_t now;
time_t * ptr = &now;
now = time(ptr);
struct tm * tmptr = localtime(ptr);
char * buffer[80];
strftime(buffer, 80, "Today is %Y년 %m월 %d일 입니다.", tmptr);
puts(buffer);
출력:
Today is 2014년 03월 07일 입니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
=====================================================================================================
스트링 함수
#include <stdio.h>
#include <string.h>
int main()
{
//strlen() : 문자열의 길이
size_t length;
char buffer[100];
while(1){
puts("\nEnter a string, a blank line to exit....");
gets(buffer);
length = strlen(buffer);
if(length == 0) break; //이름의 길이가 0이면 blank line을 뜻한다.
printf("string' length = %d\n", length);
}
return 0;
}
출력 :
Enter a string, a blank line to exit....
hello
string' length = 5
Enter a string, a blank line to exit....
hi
string' length = 2
Enter a string, a blank line to exit....
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//문자열의 복사 : strcpy() - 미리 공간을 준비 해야함, strncpy() - n개만 복사, strdup() - 자기가 알아서 malloc을 해서 만들어줌(표준아님)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char original[] = "The Source String...";
char dest[100];
char * dest1, *dest2;
strcpy(dest, original); //이미 100개의 공간이 있으므로 복사가 됨. null도 복사됨.
printf("original = %s\n", original);
printf("dest = %s\n", dest);
dest1 = (char *)malloc(strlen(original)+1); //gcc같은 경우는 괜찮지만, 다른 컴파일러의 경우 널 값을 안가져오는 경우가 있다.
strcpy(dest1, original);
printf("dest1 = %s\n", dest1);
strcpy(dest2, original);
printf("dest2 = %s\n", dest2);
return 0;
}
출력:
original = The Source String...
dest = The Source String...
dest1 = The Source String...
(dest2는 나오지 않거나 오류가 날 것이다)
-------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//strncpy() : 지정된 문자열의 갯수만 복사
char source[]= "abcdefghijklmnopqrstuvwxyz";
char dest[] = "..........................";
size_t n;
while(1){
printf("복사할 문자열의 갯수(1 - 26) : ");
scanf("%d", &n);
if(n>0 && n<27) break;
}
printf("\nBefore copy dest = %s\n", dest);
strncpy(dest, source, n); //source에 n개를 복사해서 dest에 넣어줌.
printf("\nAfter copy dest = %s\n", dest);
return 0;
}
출력:
복사할 문자열의 갯수(1 - 26) : 30
복사할 문자열의 갯수(1 - 26) : 5
Before copy dest = ..........................
After copy dest = abcde.....................
------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//non-standard C strdup(), 사용시 사용할 수 있는지 확인 필요.
char source[] = "The Source String...";
char * dest;
if((dest = strdup(source)) == NULL) //복사실패. 표준이 아니거나 복사하려던 메모리가 뻥...
{
puts("System Error");
exit(-1);
}
printf("source = %s\n", source);
printf("dest = %s\n", dest);
return 0;
}
출력 :
source = The Source String...
dest = The Source String...
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//strcat(), strncat()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char array[27] = "a"; //맨뒤에 널까지 생각해서 26자+널.
char str[2];
str[1] = '\0';
int i;
for(i=98; i<123; i++) //97이 'a'. 이미 a는 들어와있으니 다음부터.
{
str[0] = i; //str[0] = b;
strcat(array, str); // array + str. 앞에 것에다가 계속해서 덧붙이는
puts(array);
}
return 0;
}
출력 :
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
abcdefghijk
abcdefghijkl
abcdefghijklm
abcdefghijklmn
abcdefghijklmno
abcdefghijklmnop
abcdefghijklmnopq
abcdefghijklmnopqr
abcdefghijklmnopqrs
abcdefghijklmnopqrst
abcdefghijklmnopqrstu
abcdefghijklmnopqrstuv
abcdefghijklmnopqrstuvw
abcdefghijklmnopqrstuvwx
abcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxyz
------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strncat() - n개만 잇는..
int main()
{
char array[] = "abcdefghijklmnopqrstuvwxyz";
char str[27];
int i;
for(i=1; i<27; i++)
{
strcpy(str, ""); //NULL 복사
strncat(str, array, i);
puts(str);
}
return 0;
}
출력:
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
abcdefghijk
abcdefghijkl
abcdefghijklm
abcdefghijklmn
abcdefghijklmno
abcdefghijklmnop
abcdefghijklmnopq
abcdefghijklmnopqr
abcdefghijklmnopqrs
abcdefghijklmnopqrst
abcdefghijklmnopqrstu
abcdefghijklmnopqrstuv
abcdefghijklmnopqrstuvw
abcdefghijklmnopqrstuvwx
abcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxyz
=========================================================================
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//strcmp(), strncmp()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char array[100], str[100];
int result;
while(1){
printf("비교대상 문자열 ");
gets(array);
printf("비교할 문자열, 중지하려면 엔터를 치세요 : ");
gets(str);
if(strlen(str)==0) break;
result = strcmp(array, str); // result가 0이면 두문자열은 같다.
printf("strcmp(%s, %s) --> %d\n", array, str, result);
}
return 0;
}
출력 :
비교대상 문자열 hello
비교할 문자열, 중지하려면 엔터를 치세요 : hello
strcmp(hello, hello) --> 0
비교대상 문자열 Hello
비교할 문자열, 중지하려면 엔터를 치세요 : hello
strcmp(Hello, hello) --> -1
비교대상 문자열 ice
비교할 문자열, 중지하려면 엔터를 치세요 : bababa
strcmp(ice, bababa) --> 1
-----------------------------------------
//strncmp() - 지정된 자릿수만큼 비교하자.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char array[] = "The First String";
char str[] = "The Second String";
int num, result;
while(1){
printf("몇 개의 문자열을 비교할까요 ? 단, 종료는 0 : ");
scanf("%d", &num);
if(num <= 0) break;
result = strncmp(array, str, num);
printf("strncmp() ==> %d\n", result);
}
return 0;
}
출력:
몇 개의 문자열을 비교할까요 ? 단, 종료는 0 : 3
strncmp() ==> 0
몇 개의 문자열을 비교할까요 ? 단, 종료는 0 : 4
strncmp() ==> 0
몇 개의 문자열을 비교할까요 ? 단, 종료는 0 : 5
strncmp() ==> -1
몇 개의 문자열을 비교할까요 ? 단, 종료는 0 : 10
strncmp() ==> -1
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//검색 : 문자검색 strchr(), 문자열검색 strstr()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//strchr() - 주어진 문자열에서 특정 문자를 검색함.
char array [100], * search;
int munja;
while(1){
printf("검색대상 문자열 단, 종료는 그냥 엔터 : ");
gets(array);
if(strlen(array) == 0) break;
printf("검색할 문자 : " );
munja = getchar();
getchar(); //엔터 날리기
search = strchr(array, munja);
if(search == NULL) puts("Not Found");
else printf("%d번째에서 찾았음\n", (search-array));
}
return 0;
}
출력 :
검색대상 문자열 단, 종료는 그냥 엔터 : Hello, World
검색할 문자 : l
2번째에서 찾았음
검색대상 문자열 단, 종료는 그냥 엔터 : Hello, World
검색할 문자 : a
Not Found
--------------------------------------------
//strstr()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char array[100], search[100], *ptr;
while(1){
printf("검색대상 문자열 : ");
gets(array);
if(strlen(array)==0) break;
printf("검색 할 문자열 : " );
gets(search);
ptr = strstr(array,search);
if(ptr == NULL) puts("Not Found");
else printf("%d번째에서 찾았음\n", (ptr - array));
}
return 0;
}
출력:
검색대상 문자열 : Hello, World
검색 할 문자열 : orld
8번째에서 찾았음
검색대상 문자열 : Hello, World
검색 할 문자열 : Haok
Not Found
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//strlwr() --> 소문자 변환, 대문자로 변환은 gcc에서 제공하지 않음
================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() //gcc에는 없네
{
char str[] = "This is a test string...";
printf("Original String : %\n", str);
printf("reverse --> %s\n", strrev(str));
printf("again reverse --> %s\n", strrev(str));
printf("strnset() -- > %s\n", strnset('*',8));
printf("strset() --> %s\n", strset('!'));
return EXIT_SUCCESS; //이렇게하여도 성공적인 종료 가능.
}
에러 발생. gcc에서 제공하지 않는 함수.
================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
double d;
printf("Enter a number : ");
scanf("%lf", &d);
printf("Original Value : %f\n", d);
printf("ceil() --> %f\n", ceil(d)); //어떤값보다 작은 정수 중 제일 큰 정수
printf("floor() --> %f\n", floor(d)); //어떤값보다 큰 정수 중 제일 작은 정수
printf("sqrt() --> %f\n", sqrt(d));
printf("cosine() --> %f\n", cos(d));
return EXIT_SUCCESS;
}
이것도 정의되어있지 않다고...
====================================================================================
#include <stdio.h>
#include <assert.h>
int main()
{
int num;
printf("양의 정수 하나를 입력하세요 : ");
scanf("%d", &num);
assert(num>=0); //괄호안의 수식이 참이나 거짓을 끌어낼 수 있어야 한다. 거짓이면 에러메시지가 뜸.
printf("양의 정수 num = %d \n", num);
return 0;
}
출력:
양의 정수 하나를 입력하세요 : 5
양의 정수 num = 5
양의 정수 하나를 입력하세요 : -1
0307: ../src/assertdemo.c:17: main: Assertion `num>=0' failed.
=========================================================================================
#include <stdio.h>
#include <stdarg.h>
float average(int num, ...);
int main()
{
float result;
result = average(10, 1,2,3,4,5,6,7,8,9,10); //앞에는 넘어오는 갯수. 루프를 몇번 돌아야하는지
printf("1st result = %.2f\n", result);
result = average(5, 121, 206, 76, 31, 5);
printf("2nd result = %.2f\n", result);
return 0;
}
float average(int num, ...)
{
//1. va_list args_ptr 선언;
va_list args_ptr;
int sum = 0, i;
//2. va_list 초기화
va_start(args_ptr, num); //num개 방으로 초기화
for(i = 0; i < num; i++)
{
sum += va_arg(args_ptr, int);
}
//4. va_list clean-up 하자.
va_end(args_ptr);
return (float)sum/num;
}
출력:
1st result = 5.50
2nd result = 87.80
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
==============================================================================
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
환자 관리 프로그램 ...
student.h
#define MAX 5
typedef struct Hop{
char cod[10];
char dep[20];
double ip;
int num, day, age, jin;
}H;
input.c
#include "student.h"
int input(H * ptr) {
int i=0;
char tmp;
do{
printf("번 호 : ");
scanf("%d", &ptr->num);
getchar();
printf("\n진료코드 : ");
gets(ptr -> cod);
printf("\n입원일수 : ");
scanf("%d", &ptr->day);
getchar();
printf("\n나 이 : ");
scanf("%d", &ptr->age);
//getchar();
getchar();
printf("\n입력/출력(I/O) ? ");
scanf("%c", &tmp);
printf("\n");
//getchar();
ptr++;
i++;
}while(tmp == 'I' || tmp == 'i');
return i;
}
calc.c
#include <stdio.h>
#include <stdlib.h>
#include "student.h"
int getGrade1(); //진찰비
double getGrade(); //입원일수 할인표
void calc(H*ptr, int num){
int i, imsi;
int temp;
double dis;
for(i =0; i<num; i++){
if(ptr->day < 4)
temp = 30000;
else temp = 25000;
dis = getGrade(ptr -> day);//할인 비율
imsi = temp * ptr -> day;//총입원비
ptr -> ip = imsi * dis;//입원비;
//double asd = imsi * dis;
//printf("%f",asd);
ptr -> jin = getGrade1(ptr -> age);//진찰비
imsi = 0;
ptr++;
}
}
double getGrade(day){
return (day<= 9 && day>=1)? 1.00:
(day< 15 && day >= 10)? 0.85:
(day<20 && day>= 15)? 0.80:
(day<30 && day>=20)? 0.77:
(day<100 && day>=30)? 0.72 : 0.68;
}
int getGrade1(age){
return (age<10)? 7000:
(age< 20 && age >= 10)? 5000:
(age<30 && age>= 20)? 8000:
(age<40 && age>=30)? 7000:
(age<50 && age>=40)? 4500 : 2300;
}
jinchal.c
#include "student.h"
#include<stdio.h>
#include <string.h>
void jinchal(H *ptr, int num){
char MI[]="MI";
char NI[]="NI";
char SI[]="SI";
char TI[]="TI";
char VI[]="VI";
char WI[]="WI";
int i;
for(i=0; i<num; i++){
if(!strcmp(ptr->cod,MI))
strcpy(ptr->dep,"외과");
else if(!strcmp(ptr->cod,NI))
strcpy(ptr->dep,"내과");
else if(!strcmp(ptr->cod,SI))
strcpy(ptr->dep,"피부과");
else if(!strcmp(ptr->cod,TI))
strcpy(ptr->dep,"소아과");
else if(!strcmp(ptr->cod,VI))
strcpy(ptr->dep,"산부인과");
else
strcpy(ptr->dep,"비뇨기과");
ptr++;
}
}
sort.c
#include <stdio.h>
#include "student.h"
void swap(H * ptr,int first, int second )
{
H imsi = *(ptr + first);
*(ptr + first) = *(ptr + second);
*(ptr + second) = imsi;
}
void sort(H * ptr, int su)
{
int i, j;
for(i = 0 ; i < su - 1; i++ )
{
for(j = 0 ; j < su - 1 - i; j++ )
{
while((ptr +j)-> num > (ptr + j +1)-> num )
{
swap(ptr , j , j + 1);
}
}
}
}
output.c
#include <stdio.h>
#include "student.h"
void printLabel();
void output(H *ptr,int su){
int i;
printLabel();
for(i=0;i<su;i++){
printf("%d\t %s\t %d\t %.f\t",ptr->num,ptr->dep,ptr->jin,ptr->ip);
printf("%.f\n",(ptr->jin)+(ptr->ip));
puts("-----------------------------------------------------");
ptr++;
}
}
void printLabel(){
puts(" << 병원관리프로그램 >>\n");
puts("-----------------------------------------------------");
puts("번호\t 진찰부서\t 진찰비\t 입원비\t 진료비\n");
puts("-----------------------------------------------------");
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include "student.h"
int input(H *);
void jinchal(H *, int);
void calc(H *, int);
void sort(H *, int);
void output(H *, int);
int main(void){
H array[MAX];
int num;
num = input(array);
jinchal(array, num);
calc(array, num);
sort(array, num);
output(array, num);
return 0;
}
출력:
번 호 : 3
진료코드 : MI
입원일수 : 5
나 이 : 22
입력/출력(I/O) ? I
번 호 : 5
진료코드 : Wi
입원일수 : 2
나 이 : 55
입력/출력(I/O) ? O
<< 병원관리프로그램 >>
-----------------------------------------------------
번호 진찰부서 진찰비 입원비 진료비
-----------------------------------------------------
3 외과 8000 125000 133000
-----------------------------------------------------
5 비뇨기과 2300 60000 62300
-----------------------------------------------------
================================================================================
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
과락과제 : 급여관리프로그램
sawon.h
#define MAX 5
typedef struct s{
int num, su, ho, sd, jp, tax, cp; //사번, 급수, 호, 수당, 지급액, 세금, 차인지급액
}Sawon;
input.c
#include "sawon.h"
int input(Sawon *ptr) {
int rt=0, count=1, k=0, imsi;//rt=리턴값.
int array[5]; //정수 배열을 만들어서 사번값을 저장.
char io;
do{
while(1)
{
int i=0;
printf("사원번호 : ");
scanf("%d", &imsi);
if(imsi<0 || imsi>=100) //사번이 두 자리 이내가 아니라면
printf("사원번호는 두 자리 이내로 입력하셔야해요. 다시 입력해주세요\n");
else //사번이 두 자리 이내라면
{
array[k] = imsi; //정수배열에 ptr->num값을 넣어준다
for(i=0; i<count-1; i++) //중복인지 확인.
{
if(imsi == array[i] )
{
printf("사원번호가 중복이에요. 종료합니다.\n");
exit(-1);
}
}
ptr->num = imsi;
k++; //다음 사원번호가 배열의 다음위치에 저장되게
break;
}
}
while(1)
{
printf("급 : ");
scanf("%d", &ptr->su);
if(ptr->su<0 || ptr->su>6)
printf("급수는 1~5 사이를 입력하셔야해요. 다시 입력해주세요.\n");
else break;
}
while(1)
{
printf("호 : ");
scanf("%d", &ptr->ho);
if(ptr->ho<0 || ptr->ho>3)
printf("호는 1~3 사이를 입력하셔야해요. 다시입력해주세요. \n");
else break;
}
printf("수당 : ");
scanf("%d", &ptr->sd);
getchar(); //엔터 오류 방지
printf("입력/출력(I/O)? ");
scanf("%c", &io);
ptr++; //배열이 가리키는 위치 이동.
rt++; //총 몇개의 배열을 가지는지
count++; //최대 사원을 5명 이내로 하기위해
if(count>5)
{
printf("최대 사원 5명 입력 가능합니다.. ");
break;
}
}while(io == 'I' || io == 'i');
return rt;
}
ip.c
#include "sawon.h"
void ip(Sawon * ptr, Sawon * ptr1, int inp)
{
int i;
for(i=0;i<inp;i++) //빈 구조체 배열에 값을 복사해서 넣어줌.
{
ptr1->num = ptr->num;
ptr1->su = ptr->su;
ptr1->ho = ptr->ho;
ptr1->sd = ptr->sd;
ptr++;
ptr1++;
}
}
calc.c
#include "sawon.h"
double getGb(); //지급액별 세율 및 조정액
void calc(Sawon * ptr, int num)
{
int jo, i, imsi; //조정액
double saerate; //세율
int gby;
for(i = 0 ; i < num ; i++)
{
gby = getGb(ptr->ho, ptr->su); //급여
ptr->jp = gby + ptr->sd ; // 지급액 = 급여 + 수당
if(ptr->jp < 70000 && ptr->jp >= 0)
{
saerate = 0.0;
jo = 0;
}
else if(ptr->jp >= 70000 && ptr->jp < 80000 )
{
saerate = 0.005;
jo = 300;
}
else if(ptr->jp >= 80000 && ptr->jp < 90000 )
{
saerate = 0.007;
jo = 500;
}
else if (ptr->jp >= 90000 )
{
saerate = 0.012;
jo = 1000;
}
ptr->tax = (ptr->jp * saerate) - jo; //세금 = (지급액 * 세율) - 조정액
ptr->cp = ptr->jp - ptr->tax ; //차인 지급액 = 지급액 - 세금
ptr ++;
}
}
double getGb(ho, su) //급, 호별 급여
{
return (ho == 1 && su == 1) ? 95000 :
(ho == 1 && su == 2) ? 80000 :
(ho == 2 && su == 1) ? 92000 :
(ho == 2 && su == 2) ? 75000 :
(ho == 3 && su == 1) ? 89000 :
(ho == 3 && su == 2) ? 70000 :
(ho == 4 && su == 1) ? 86000 :
(ho == 4 && su == 2) ? 65000 :
(ho == 5 && su == 1) ? 83000 : 60000;
}
sort.c
#include <stdio.h>
#include "sawon.h"
void swap(Sawon * ptr, int first, int second)
{
Sawon imsi = *(ptr + first);
*(ptr + first) = *(ptr + second);
*(ptr + second) = imsi;
}
//버블 정렬을 이용해 사번순서대로 출력
void sort(Sawon * ptr, int su)
{
int i, j;
for(i=0 ; i<su-1; i++)
{
for(j=0 ; j<su-1-i; j++)
{
if((ptr+j)->num > (ptr+j+1)->num)
{
swap(ptr, j, j+1);
}
}
}
}
output.c
#include <stdio.h>
#include "sawon.h"
void output(Sawon * ptr, Sawon * ptr1, int inp)
{
int i;
printf(" <<급여관리 프로그램>> \n");
printf(" -------------------------------------------------------\n");
printf("사번\t급수\t 호\t 수당\t 지급액\t 세금\t 차인지급액\n");
printf("--------------------------------------------------------\n");
for(i=0;i<inp;i++)
{
printf("%-5d\t %d\t %d\t %d\t %d\t %d\t %d\n",
ptr->num, ptr->su,ptr->ho,ptr->sd,ptr->jp,ptr->tax,ptr->cp);
ptr++;
}
printf("입력데이타 출력\n");
for(i=0;i<inp;i++) //입력순으로 데이타 출력
{
printf("%d\t%d\t%d\t%d\n",ptr1->num,ptr1->su,ptr1->ho,ptr1->sd);
ptr1++;
}
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include "sawon.h"
int input(Sawon *);
void calc(Sawon *, int);
void sort(Sawon *, int);
void output(Sawon *, Sawon *, int);
int main(void){
Sawon array[MAX];
Sawon array1[MAX]; //입력데이타 출력의 순서를 위해 구조체 배열 하나더 생성.
int inp;
inp = input(array);
ip(array, array1, inp);
calc(array, inp);
sort(array, inp);
output(array, array1, inp);
return 0;
}
'Java & Oracle' 카테고리의 다른 글
자바 기본, 입력, 변수접근, 연산자, 제어문 (0) | 2014.03.11 |
---|---|
자바 시작(윈도우, 우분투, 에디트플러스 환경설정)(이클립스는 다운만) (0) | 2014.03.10 |
c 구조체 배열, 퀵 정렬, 우분투 메뉴 안나오는 문제해결 (0) | 2014.03.06 |
c 삽입정렬, 포인터 배열, 구조체 기본 (0) | 2014.03.05 |
c 배열 , 전처리기, 버블정렬, 선택정렬 (0) | 2014.03.04 |