달력 문제

☆C언어/소스 2017. 6. 14. 00:49

#include<stdio.h>

int month[13]={0,1,2,3,4,5,6,7,8,9,10,11,12};

int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

char *weekname[7]={"일","월","화","수","목","금","토"};

int main(void)

{


int y=0,m=0;//년월일

int L_y=0;//작년

int total_day;//일수계산

int week=0;//요일

FILE *out; //출력파일


out=fopen("out.txt","w");




//입력

printf("Input Year : ");

scanf("%d",&y);

printf("Input month : ");

scanf("%d",&m);



//윤년계산

if((y%4==0)&& ((y%100!=0)||(y%400)))

day[2]=29;

else

day[2]=28;


//요일 계산

L_y=y-1;

total_day=(L_y+(L_y/4)-(L_y/100)+(L_y/400)+1);

for(int i=1;i<m;i++)

total_day+=day[i];

week=total_day%7;


/////////출력///////////


//년,월 출력

printf("<%d_%02d>\n",y,m);


//요일 출력

for(int i=0;i<7;i++)

printf("%7s", weekname[i]);

printf("\n");


//공백 출력

for(int i=0;i<week;i++)

{

printf("%7c"," ");

}


for(int i=1;i<=day[m];++i)

{

if(week%7==0)

printf("\n");

printf("%7d",i);

week++;

}


fclose(out);


}



'☆C언어 > 소스' 카테고리의 다른 글

괄호 검사  (0) 2017.06.17
바이너리 파일 핸들링  (0) 2017.06.15
3n+1  (0) 2013.06.27
3n+1 재귀함수  (0) 2013.06.27
최소의 동전수 (재귀)  (0) 2013.06.23

c언어 꿀팁

☆C언어 2014. 10. 14. 18:08




동적할당 디버깅할때 저렇게하면 쉽게 볼 수 있음

'☆C언어' 카테고리의 다른 글

fflush 함수  (0) 2017.06.19
달력 1~12월 다 찍어내기  (0) 2017.06.17
조건부 컴파일 #if #elif #else #endif  (0) 2013.10.09
2차원 배열 포인터  (0) 2012.09.18
이차원배열 동적할당  (0) 2012.09.12

조건부 컴파일 #if #elif #else #endif

☆C언어 2013. 10. 9. 19:03

출처 : http://tmdgus.tistory.com/34

전처리 지시사 #if #elif #else #endif 는 컴파일러 (정확히 이야기하면 전처리기)에게 조건을 제시하는 경우에 사용된다.

사용되는 형식
--------------------------
#if CONDITION1

expression1
#elif CONDITION2
expression2
#else
expression3
#endif
---------------------------

위 형식은 다음과 같은 내용을 컴파일러에게 요구하는 것이다.
"CONDIONT1이 만족되면 expression1을 , CONDITION2가 만족되면 expression2를 이도 저도 아니면 expression3를
컴파일해라"

if ~ else if 문장과 상당히 유사한 형태를 지니고 있음을 알 수 있다.
다만 위의 문장은 전처리기에 의해 처리되기 때문에 컴파일 해야 할 대상을 지정할 때 사용하게 된다.

* 흔히 저지르는 실수 중 하나가 #endif 문장을 빼먹는 것이다. if ~ else if 문장과 달리 "여기까지입니다." 라고 정의를 해줘야
* 한다. 따라서 반드시 #endif가 포함되어야 한다.

참고* 일반적으로 함수의 정의를 헤더 파일에 포함시키지는 않는다 (선언만 헤더 파일에 포함한다.)!


0o 헤더 파일의 포함 관계에서 발생하는 문제 때문에 조건부 컴파일로 문제를 해결..한다.o0

-하나의 헤더 파일을 두 번 이상 포함
-이는 중보갷서 함수가 정의되거나, 변수가 선언되는 문제점
-조건부 컴파일로 문제 해결

#ifdef, #endif
if not define

ex)

#ifdef _COUNT_H_ ->> _COUNT_H 가 를 정의하지 않았다면
#define _COUNT_H_20 -- >>

int count=0 ->>> _COUNT_H를 정의하고 int 형 변수 count도 선언하고
#endif ->> 끝낸다.



_COUNT_H_ 는 헤더 파일 이름을 이용하여 만든것이다 조건부 컴파일을 위한 매크로를 정의하는 경우 어떠한 이름을 주건 상관없지만 이름이 중복되어서는 안될것이다. 파일의 이름은 중복될일이 없으므로 이를 이용하는것은 좋은 방법이고 또 가장 보편화되어 있다.



'☆C언어' 카테고리의 다른 글

달력 1~12월 다 찍어내기  (0) 2017.06.17
c언어 꿀팁  (0) 2014.10.14
2차원 배열 포인터  (0) 2012.09.18
이차원배열 동적할당  (0) 2012.09.12
exe의 작동이 중지되었습니다.  (0) 2012.05.12

3n+1

☆C언어/소스 2013. 6. 27. 17:55

//어떤 정수 n에서 시작해, n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다.

//이렇게 해서 새로 만들어진 숫자를 n으로 놓고, n=1 이 될때까지 같은 작업을 계속 반복한다.

//예를 들어, n=22이면 다음과 같은 수열이 만들어진다.

//

//22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

//

//n이라는 값이 입력되었을때 1이 나올때까지 만들어진 수의 개수(1을 포함)를 n의 사이클 길이라고 한다.

//위에 있는 수열을 예로 들면 22의 사이클 길이는 16이다. i와 j라는 두개의 수가 주어졌을때,

//i와 j사이의 모든 수(i, j포함)에 대해 최대 사이클 길이를 구하라.

#include<stdio.h>

int main()

{

// FILE *in=fopen("input.txt","r");

// FILE *out=fopen("output.txt","w");

int i=0,j=0,

su1=0,su2=0; //숫자 범위

int count=0; //숫자 개수 함수 호출수

int arr[1000][2]={0,}; //배열

int min=0,max=0; //계산한 사이클, 최대 사이클

int cc=0; //숫자범위가 앞에가 클때 ex)100 1

// while(EOF!=fscanf(in,"%d %d",&su1,&su2))

while(EOF!=scanf("%d%d",&su1,&su2))

{

// printf("%d %d " ,su1,su2);

// arr[count][0]=su1;

// arr[count++][1]=su2;

// }

// printf("\n카운트 : %d\n ",count);

// for(i=0;i<count;++i)

// {

// func(arr[i][0],arr[i][1]);

cc=0;

if(su1>su2)

{

int temp=su2;

su2=su1;

su1=temp;

cc=1;

}

max=0; //초기화

for(j=su1;j<=su2;++j)

{

int num=j;

int cycle=1;

while(num!=1)

{

if(num%2)

{

//홀수

num=num*3+1;

}

else

{

//짝수

num=num/2;

}

++cycle;

}

if(max<cycle)

max=cycle;

}

//출력

if(cc==1)

printf("%d %d %d\n",su2,su1,max);

else

printf("%d %d %d\n",su1,su2,max);

}

// fclose(in);

// fclose(out);

return 0;

}

'☆C언어 > 소스' 카테고리의 다른 글

바이너리 파일 핸들링  (0) 2017.06.15
달력 문제  (0) 2017.06.14
3n+1 재귀함수  (0) 2013.06.27
최소의 동전수 (재귀)  (0) 2013.06.23
c언어 숫자 변수에 문자입력시 출력  (0) 2012.10.10

3n+1 재귀함수

☆C언어/소스 2013. 6. 27. 17:54


//어떤 정수 n에서 시작해, n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다.

//이렇게 해서 새로 만들어진 숫자를 n으로 놓고, n=1 이 될때까지 같은 작업을 계속 반복한다.

//예를 들어, n=22이면 다음과 같은 수열이 만들어진다.

//

//22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

//

//n이라는 값이 입력되었을때 1이 나올때까지 만들어진 수의 개수(1을 포함)를 n의 사이클 길이라고 한다.

//위에 있는 수열을 예로 들면 22의 사이클 길이는 16이다. i와 j라는 두개의 수가 주어졌을때,

//i와 j사이의 모든 수(i, j포함)에 대해 최대 사이클 길이를 구하라.

#include<stdio.h>

int func(int num,int cycle)

{

// printf("함수 ( %d ) ", num);


if(num==1)

return cycle;

if(num%2)

{

//홀수

return func(num*3+1,++cycle);

}

else

{

//짝수

return func(num/2,++cycle); 

}


return 0;

}

int main()

{

// FILE *in=fopen("input.txt","r");

// FILE *out=fopen("output.txt","w");

int i=0,j=0,

su1=0,su2=0; //숫자 범위

int count=0; //숫자 개수 함수 호출수

int arr[1000][2]={0,}; //배열

int min=0,max=0; //계산한 사이클, 최대 사이클


// while(EOF!=fscanf(in,"%d %d",&su1,&su2))

while(EOF!=scanf("%d%d",&su1,&su2))

{

// printf("%d %d " ,su1,su2);

arr[count][0]=su1;

arr[count++][1]=su2;

// printf("\n카운트 : %d\n ",count);

for(i=0;i<count;++i)

{

// func(arr[i][0],arr[i][1]);

max=0; //초기화

if(arr[i][0]>arr[i][1])

{

su1=arr[i][1];

su2=arr[i][0];

}

else

{

su1=arr[i][0];

su2=arr[i][1];

}

for(j=su1;j<=su2;++j)

{

min=func(j,1);

if(max<min)

max=min;

}

//출력

printf("%d %d %d \n",arr[i][0],arr[i][1],max);

}

}

// fclose(in);

// fclose(out);

return 0;

}



'☆C언어 > 소스' 카테고리의 다른 글

달력 문제  (0) 2017.06.14
3n+1  (0) 2013.06.27
최소의 동전수 (재귀)  (0) 2013.06.23
c언어 숫자 변수에 문자입력시 출력  (0) 2012.10.10
사다리  (0) 2012.09.12

최소의 동전수 (재귀)

☆C언어/소스 2013. 6. 23. 02:59

일단 완벽하지 않지만 답은 빠르게 찾게 만들었는데 더이상 소스 줄이는 방법은 모르겟다 +_+...

#include<stdio.h>

int func(int  coin[][4],int money,int num)

{

if(money==0)

{

printf("100원 : %d개\n 50원 : %d개\n 25원 : %d개\n 1원 : %d개\n",coin[1][0],coin[1][1],coin[1][2],coin[1][3]);

return 0;

}

if(money>=coin[0][num])

{

coin[1][num]++;

func(coin,money-coin[0][num],num);

}

else

{

func(coin,money,++num);

}

}

int main()

{

int coin[2][4]={{100,50,25,1},{0,0,0,0}}; //코인 종류 , 사용 코인 갯수

int num=0;

int money;


scanf("%d",&money);

func(coin,money,num);


return 0;

}

'☆C언어 > 소스' 카테고리의 다른 글

3n+1  (0) 2013.06.27
3n+1 재귀함수  (0) 2013.06.27
c언어 숫자 변수에 문자입력시 출력  (0) 2012.10.10
사다리  (0) 2012.09.12
달력 프로그램 설명  (0) 2011.10.14

c언어 숫자 변수에 문자입력시 출력

☆C언어/소스 2012. 10. 10. 19:10

double a;

int count;

 

count = scanf("%lf",&a);            //scanf가 재대로 입력 받으면 1을 리턴해준다.

if( count == 1)   //1 대신 true 가능

숫자입니다 출력

else

문자입니다 출력

 

'☆C언어 > 소스' 카테고리의 다른 글

3n+1  (0) 2013.06.27
3n+1 재귀함수  (0) 2013.06.27
최소의 동전수 (재귀)  (0) 2013.06.23
사다리  (0) 2012.09.12
달력 프로그램 설명  (0) 2011.10.14

2차원 배열 포인터

☆C언어 2012. 9. 18. 20:09

#include<stdio.h>
#include<stdlib.h>
int ba(char (*in)[101]){
 in[3][3]='A';
 
// printf("%c",in[1][1]);

 return 0;
}


int main(){
 FILE *in=fopen("go.inp","r");
 FILE *out=fopen("go.out","w");
 
 
 int j=0,i=0;
 int n=0;
 int num=0;
 char input[101][101]; //케릭터값
 char e;//엔터값
 fscanf(in,"%d",&n);  //줄 수 스켄
 num=n;;
 n=n+2;

 //테두리 벽 크기 잡기
 for(i=0;i<n;++i){
  //arr[i][j]=7;
  for(j=0;j<n-1;++j){
   if(j==0||i==0 || i==n-1)
    input[i][j]='a';
  }
  input[i][j]='a';
 }


 
 //입력
 for(i=0;i<num;++i){
  fscanf(in,"%c",&e);  //엔터처리
  for(j=0;j<num;++j){
   fscanf(in,"%c",&input[i+1][j+1]);
  }
 }
 
 
 //char배열 출력확인
 for(i=0;i<10;++i){  
   for(j=0;j<10;++j){
    printf("%c ",input[i][j]);
   }
   printf("\n");
 }
 ba(input);

  //char배열 출력확인
 for(i=0;i<10;++i){  
   for(j=0;j<10;++j){
    printf("%c ",input[i][j]);
   }
   printf("\n");
 }
  fclose(in);
  fclose(out);
}

 

'☆C언어' 카테고리의 다른 글

c언어 꿀팁  (0) 2014.10.14
조건부 컴파일 #if #elif #else #endif  (0) 2013.10.09
이차원배열 동적할당  (0) 2012.09.12
exe의 작동이 중지되었습니다.  (0) 2012.05.12
Visual Studio 디버깅 단축키들  (2) 2012.03.25

사다리

☆C언어/소스 2012. 9. 12. 14:51

#include<stdio.h>
#include<stdlib.h>
struct line{
 int jull;
 int kan;
};
int main(){
 //막대기 50
 //칸 10,000
 
 short int af[50][10000];  //이 말도 안되는게 됨 -ㅅ-;;
 FILE *in=fopen("ladder.inp","r");
 FILE *out=fopen("ladder.out","w");
 int i=0;
 int height=10000,width=50;
 int **a;
 //////////////////
 line *b;

 ////////////////////////
 int x1=0,y1=0,x2=0,y2=0;
 fscanf(in,"%d",&width);  //줄 수 스켄
 ////////////////////////////////////////
 b = (line **) malloc ( sizeof(int *) * height);
 b[0]=(line *)malloc ( sizeof (line)*width*height );
 //////////////////////////////////////////

 a = (int **) malloc ( sizeof(int *) * height);
 a[0] = (int *) malloc ( sizeof(int) * width*height );
 
 for( i=1; i<height; i++)
 {
  a[i] = a[ i-1 ] + width;
 }

 for(i=0;i<500000;++i){
  fscanf(in,"%d %d %d %d",&x1,&y1,&x2,&y2);
  if(x1==0 && y1==0 && x2==0 && y2);
  
 // a[x1]
 }


 
 printf("%d %d %d \n",a[0][0],a[0][1],a[49][9999]);
 
 

 free(a[0]);
 free(a);
 ///
 free(b[0]);
 free(b);
 ///

 fclose(in);
 fclose(out);
}

'☆C언어 > 소스' 카테고리의 다른 글

3n+1  (0) 2013.06.27
3n+1 재귀함수  (0) 2013.06.27
최소의 동전수 (재귀)  (0) 2013.06.23
c언어 숫자 변수에 문자입력시 출력  (0) 2012.10.10
달력 프로그램 설명  (0) 2011.10.14

이차원배열 동적할당

☆C언어 2012. 9. 12. 13:54
c언어에서 2차원배열을 만드는 방법은 다음과 같다.

int arr[6][8];
그러면 가로 8, 세로 6의 2차원 배열이 생성된다. 하지만 가로의 크기와 세로의 크기를 컴파일 이전 시간에 미리 정해줘야 한다. 사용자로부터 입력받은 가로와 세로의 크기로, 혹은 실행시간 도중에 정한 크기로 2차원 배열을 만들기 위해선 다른 방법을 사용해야한다.

int height = 6, width = 8;
int arr[ height ][ width ];    // 이런식으로 배열을 만들수 없다.
malloc()로 동적으로 할당 받아야 한다.
1차원 배열을 동적으로 할당 받는 방법은 다음과 같다.

int width = 8;
int *arr;
arr = (int *) malloc ( sizeof(int) * width );
동적으로 할당받은 메모리도, 배열처럼 접근이 가능하다.
arr[0], arr[1], ... arr[7]

2차원 배열을 할당받는 방법은, malloc()를 여러번 호출하는 것이다.

int height = 6, width = 8;
int **arr;
arr = (int**) malloc ( sizeof(int*) * height );
for(int i=0; i<height; i++){
    arr[i] = (int*) malloc ( sizeof(int) * width );
}




할당받은 2차원배열을 다 사용하고 나서, 해제해줘야 한다.
for문을 이용해서 여러번 malloc()로 메모리 공간을 할당 받았기 때문에, 해제할때도, for을 이용해서 여러번 해제해야 한다.
위 그림에서 세로의 크기만큼 malloc()를 호출하고, 또 그전에 한번 malloc()를 호출했다. 따라서, (height + 1)번 해제해야 한다.

for(int i=0; i<height; i++){
    free(arr[i]);
}
free(arr);

2차원 배열 할당과 해제가 번거롭다. 조금 방법을 달리 하면, 한번에 해제할 수 있는 구조로 2차원 배열을 만들 수 있다.


int height=8,width=6;
int **arr;
arr = (int **) malloc ( sizeof(int *) * height);
arr[0] = (int *) malloc ( sizeof(int) * width*height );
for( int i=1; i<height; i++){
    arr[i] = arr[ i-1 ] + width;
}
malloc()를 딱 두번만 사용했다. 두번째 malloc()에서, 배열의 크기를 width*height 로 한번에 크게 할당받았다.
그리고 이후에 for문을 통해 연결만 해주었다.

해제하는 방법도 간단하다.

free(arr[0]);
free(arr);


 

'☆C언어' 카테고리의 다른 글

c언어 꿀팁  (0) 2014.10.14
조건부 컴파일 #if #elif #else #endif  (0) 2013.10.09
2차원 배열 포인터  (0) 2012.09.18
exe의 작동이 중지되었습니다.  (0) 2012.05.12
Visual Studio 디버깅 단축키들  (2) 2012.03.25