블로그 이미지
송시혁

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

9구단 프로그램.


#include <stdio.h>
int main()
{
  unsigned int uiCnt;
  unsigned char ucdan;
  ucdan =2;
  uiCnt =1;
  
  while(ucdan<=9)
  {
  
  
    
    
    printf("%d단\n", ucdan);
    printf("\n");
    while(uiCnt<=9)
    {
     

     printf("%d * %d= d\n",ucdan, uiCnt, uiCnt*ucdan);
     uiCnt = uiCnt +1;
    
    }
    ucdan = ucdan +1;//단수를 한 단계 높인다. 2,3,4....
    uiCnt =1; // uiCnt를 초기화.
  printf("\n");
  
  }
  return 0;
}


출력은 너무 길어서 생략. 프로그램을 구성시에는 반드시 하나 하나 따져본다. 이 변수의 값을 지정하면 어떤값이 들어가는지 하나하나 따져보면서 하자. 필자도 솔직히 고생많이 했다. 본론으로 가자면,  while문내부에 while문을 중첩해서 썼다. 와일문 내부는 어제 정리했던 5구단을 옮겨온것이다. 이것은 제껴두고 생각한다.(기억안나면, 3월13일것 참고)

먼저 2구단. 2구단은 아홉번이 나오고 다음 3구단으로 넘어가야한다. 그러나 아래와 같은 소스를 짜면, 넘어가지 않는다. 

while(ucdan<=9)
  {

while(uiCnt<=9)
    {
      printf("%d * %d= %d\n",ucdan, uiCnt, uiCnt*ucdan);
      uiCnt = uiCnt +1;
    
    }
    ucdan = ucdan +1;
 
  
  }

위의 소스에서 내부while은 일단 없다고 가정한다. ucdan에서 1을 증가시키는 것을 썼는데도 출력은 2구단만 출력된다. 그 이유는 바로 메모리 저장형태를 잘 생각해보자. while문에서 ucdan이 초기값2는 프린트문에 들어가서 출력된다. 그러나, 다음 ucdan은 2를 아래 선언한 ucdan = ucdan +1; 에 저장이되어 3이된다. 그러나 3단은 나오지 않는다. 그 이유는 uiCnt에 있다. uiCnt는 내부while문에서 9를 넘으면 10의 값이 바깥으로 나가게된다.여기서 10은 메모리를 말한다. 그러니깐 2단수로 따지자면,

2*1, ~2*9까지 실행한후 10의 값은 원래는 2*10이 되나, 조건에서 uiCnt<=9이므로 조건을 만족시키지 못한다. 그래서 화면에는 2*9까지만 출력이 된다. while(안쪽)문이 실행을 멈춘다.

그래서 밖에 while문에 선언된  ucdan = ucdan +1; 에 값은 3은 들어가지만 정작 곱해야하는 수인 uiCnt는 출력되지 않으므로 실행되지 않는다. 그래서 따로 초기값을 설정한다!!

이것이 이 프로그램에 핵심이다. 안쪽 while문을 실행한 다음, while문에 uicnt =1;이라고 초기화 시켜야한다. 그래야 uicnt가 내부 while문에서 9까지 실행한 다음에 초기값에 의해 1이 되고 3단을 출력한다.

while(ucdan<=9)
  {

while(uiCnt<=9)
    {
      printf("%d * %d= %d\n",ucdan, uiCnt, uiCnt*ucdan);
      uiCnt = uiCnt +1;
    
    }
    ucdan = ucdan +1;

uiCnt = 1; // 여기에 초기화 값 넣는다.
 
  
  }



while 조건이 <=9이므로 9단까지 출력이 되는 것이다.





홀수구구단 3,5,7,9







#include
 <stdio.h>
int main()
{
  unsigned int uiCnt;
  unsigned char ucdan;
  ucdan =3;
  
  
  
  while(ucdan<=9)
  {
    uiCnt =1;
    while(uiCnt<=9)
      
    {  
      
      printf("%d * %d= %d\n",ucdan, uiCnt, uiCnt*ucdan);
      uiCnt = uiCnt +1;
    
    }
      ucdan = ucdan +2;// 단수를 +2를 하여 3,5,7....
    
  }       
  return 0;
}

간단하다


 그러나 다른 형식으로 홀수 프로그램 소스.


#include <stdio.h>
int main()
{
  unsigned int uiCnt;
  unsigned char ucdan;
  ucdan =2;
  
  
  
  while(ucdan<=9)
  {
    if(0==ucdan%2)
    {
      
      ++ucdan;  
      continue;
      


  
    }
    uiCnt =1;
    while(uiCnt<=9)
      
    {  
      
      printf("%d * %d= %d\n",ucdan, uiCnt, uiCnt*ucdan);
      uiCnt = uiCnt +1;
    
    }
      ucdan = ucdan +1;
    
  }       
  return 0;
}
while문안에 if문을 사용하여 홀수 프로그램을 구성한 것이다.

if에 조건은 ucdan을 2로 나눈 나머지가 0과 같다면, ucdan은 1증가된다. 그리고 continue에 의하여 if문에서 위에 while문으로 올라가서 다시 실행된다. 즉 if문이 참이면 그 값이 아래 while문으로 가는 것이 아니라 if문 아래 ++ucdan;이 실행되고  continue;에 의해 if문으로 다시 올라가 조건을 따지게 된다. 여기서 continue는 현재위치에 다시 올라가서 반복을 하게 해주는 명령문이다. 그래서
ucdan<=9로 값이 가서 다시 조건을 따진다.

2%2= 0(나머지) 이므로 uiCnt가 1증가하여 다시 if문으로 가서 조건을 따진다.

3%2 =1(나머지) 나머지가 1이므로 if문은 실행되지 않고 while문으로 내려가 실행된다. 그래서 3단이 출력되고 다음에 5단 ,7단이 출력이 되는 것이다.




#include <stdio.h>
int main()
{
  unsigned int uiCnt;
  unsigned char ucdan;
  ucdan =2;
  
  
  
  while(ucdan<=9)
  {
    uiCnt =1;
    while(uiCnt<=9)
      
    {  
      
      printf("%d * %d= %2d ",ucdan, uiCnt, uiCnt*ucdan);
      uiCnt = uiCnt +1;
        
        if(0==(uiCnt-1)%3)
        {
      
          putchar('\n');  
                


  
        }

    
    }
      ucdan = ucdan +1;
      putchar('\n');
    
  }       
  return 0;
}


출력을 잘보면 답이 나온다. 이번에는 내부에 while문에 if문을 썻다. if문에 의해 나머지가 0이 아니면 거짓이므로 if문 소스는 실행되지 않는다. 그래서 내부while문만 실행된다. 하지만, 나머지가 3이 되는 순간, if문이 실행되고 '\n'에 의해서 줄바꾸기가 실행된다. 그상태에서 계속 반복하여 3줄씩 출력된다. 이것은 보는것 보다 직접 입력해서 컴파일 하면 쉽게 이해 할 수 있다.

다음은 글자수를 알려주는 프로그램.

#include <stdio.h>
int main()
{
  char ch;
  int count = 0;
  
  printf("Please enter characters <q for quit>: ");
  ch = getchar();
  while (ch !='q')
  {
    count = count +1;
    ch = getchar();
  }
  printf("the number of character is %d\n", count);
  printf("This is the end of program.\n");
  return 0;

}
  

while조건문 ch !='q'를 주목한다. !=와 같이 않으면 참이라는 뜻이다. q와 같지 않으면 실행된다. 그래서 q를 누르기 전까지 한 없이 반복되고 count에 의해 숫자가 늘어난다. 즉 a를 쓰면 1번, ab를 쓰면 2번 .... 이런식으로 값이 메모리에 저장하다고 q를 누르는 순간 멈추고 가장 아래 프린트문을 출력한다.

 


 p3-14예제

#include <stdio.h>
int main()
{
  int number;
  long sum = 0;
  number = 100;
  while(number != 0)
  {
    sum += number; // sum = sum + number;
    printf("Please enter an integer <0 to quit> : \n");
    scanf("%d"&number);
  }
  printf("The sum of numbers is %1d.\n", sum);
}
  

 number가 0과 같지 않으면 while문이 실행된다.

그래서 scanf로 키보드 숫자를 입력받아서 조건에 만족하면 계속 반복한다.

그러다가 0을 입력하면 실행을 멈추고 이때까지 입력했던 number를 더한다.

아래 9.2.3.100을 입력하다 0을 입력하니 바로 실행이

 멈춤고(while문 멈춤) 214라는 값이 출력되었다. 214는 필자가 임의로 입력

한 것을 더해서 계산된 값이다.

 

 

 

 

 

p3-15예제

위와 비슷한 프로그램. 여기에서는 초기화를 scanf로 한 것 뿐이다.

#include <stdio.h>
int main()
{
  int number;
  long sum = 0;
  
  printf("Please enter an integer <0 to quit> : ");
  scanf("%d"&number); //제어변수 초기화
  
  while(number != 0//반복여부를 결정하는 논리식
  {
    sum += number;
    printf("Please enter an integer <0 to quit> : \n");
    scanf("%d"&number); //제어변수 값의 변경
  }
  printf("The sum of numbers is %1d.\n", sum);
  return 0;
}

scanf로 키보드로 받은 값이 초기값으로 설정되고 while문이 실행된다. 실행되는 방법은

위의 소스와 동일하다. 단 이프로그램에서는 초기화를 scanf로 한것 뿐이다.

 

 

posted by 송시혁

문자입출력함수

getchar() - 한글자 읽을 때 사용

putchar() - 한글자 출력할 때 사용


#include <stdio.h>
int main()
{
  printf("hello\n");
  getchar();
  return 0;
}



#include <stdio.h>
int main()
{
  char ch;
  printf("Please enter any character: ");
  ch = getchar();
  putchar (ch);
  printf(" is a letter you typed.\n");
  fflush (stdin);
  printf("Please enter any character:");
  scanf("%c"&ch);
  printf("%c is a letter you typed.\n", ch);
  return 0;
}



출력화면에서 보듯이 d를 입력하고 엔터를 쳐야 해당 프린트문이 생성된다.

즉, 버퍼를 기다리고 그것을 실행한다.

여기서 fflush는 보이지 않는 버퍼를 없애버린다. 여기서 보이지 않는 값은  엔터 키이다. 버퍼를 지움으로서 그 다음 문장인 printf("Please enter any character:");를 기다리게 하는 기능이다. 그러니깐 먼저, d is a letter you typed. 먼저 실행되고 입력을 받을 때까지 기다리다 문자를 입력하면 비로소 Please enter any character: 에 문자를 입력해야 a is a letter you typed가 생성된다.


#include <conio.h>// getch(), getch(), putch()
#include <stdio.h> printf()
int main()
{
  int ch;
  printf("Please enter any character: ");
  ch = getche();
  putch (ch);
  printf(" is a letter you typed:\n");
  
  printf("Please enter any character: \n");
  ch = getch(); //입력문자는 화면에 출력되지 않음.
  putch(ch);
  printf(" is a letter you typed.\n");
  return 0;
}

conio.h는 콘솔입출력 함수.
getch()는 출력화면 입력시 아예 보여주지 않는다. 리눅스 패스워드
getche() 는 값을 출력이 되나, 값과는 다른 형태로 출력. 예) 패스워드:*******
putch() 출력

a를 입력하면 엔터키를 치지 않아도 화면에 출력이 된다.


반복문

while(정지조건) -> 논리값

while(참) 정지, 그렇지 않으면 무한반복

프로그램 정지시키는 법 ctrl + break, ctrl + c 가능하면 ctrl + break를 
쓴다 컨트롤 시는 안먹힐 때가 있다.

형식

while()

{

명령문

}


#include <stdio.h>
int main()
{
  int num;
  num = 0//제어변수 n의 초기화
  while(num <=5//반복여부를 결정하는 논리식
  {
    printf("%d\t", num); //\t tab건너뛰다. num = num +1;으로 6이되면 탈출.
      num = num +1// 제어변수의 값의 변경
  }
  printf("\n");
   return 0;
}




#include <stdio.h>
int main()
{
  unsigned int uiCnt = 490;
  
  while(1)
  //while(500 >=uiCnt)

  {
    if(uiCnt>500)
    {
      break;
      
    }
    printf("%u he\n", uiCnt);
    ++uiCnt;

  }  
  
/*      
  while(1)
  {
  }
*/

  
   return 0;
}
while문에 uiCnt가 500이 되었을때 실행을 멈춘다. 그전에는 조건을 계속 만족시켜

 반복적으로 실행이 된다.그래서 490 he, 491 he....가 차례대로 실행된다.

여기서 주의 할것은 아래 출력화면을 보면 500 he까지 출력되는 것을 확인 할 수 있다.초기값 490에서

500이 넘으면 실행이 되지 않다고 조건을 걸고 있으나, 실제로

실행하는 횟수는 11번이다.그래서 500 he까지는 출력이 되고 501 he가 되면

 정지가 되어 실행되지 않는다.



5단 구구셈

#include <stdio.h>
int main()
{
  unsigned int uiCnt;
  unsigned char ucdan = 5;
  uiCnt = 1;// 여기에 초기값을 선언해야한다.
  
  while(uiCnt<=9)
  {
    printf("%d * %d= %d\n",ucdan, uiCnt, uiCnt*ucdan);
    uiCnt = uiCnt +1;
  }
  

  
    
   return 0;
  
}




posted by 송시혁

if문 예제p3-5

 

#include<stdio.h>
int main()
{
  int num1;
  int num2; 
  int bigger;

  printf("Please enter two integers: ");
  scanf("%d %d"&num1, &num2);
  bigger = num1;
  if(num1 < num2) 
  {
    bigger = num2;
  }
  printf("The larger number is : %3d\n", bigger);


}

swap = 바꾸는것, 예를 들어 bigger = num1이 였는데 아래에 if문에 조건이 맞아

 bigger = num1이 되는데 이렇게 프로그램내부에서

 값이 변하는 것을 스왑(swap)이라한다.

2줄이상은 반드시 중괄호를 해야한다. 그러나 1줄을 생략가능

if문으로 큰 수 나오게 입력하기

어제 공부했듯이 if문은 참일 때만 실행된다.

if(num1 <num2)에서 num1이 num2보다

 작을 경우 참이 되므로 num2는 bigger에 대입된다.

 그래서 10, 20을 입력했을 때 20이 num2에

저장되므로 출력된다.

20 10으로 입력된경우 넘1이 넘2보다 더 크므로

 if의 조건은 거짓이 된다. 그래서 num1이

그래도 20이라는 값을 가진다.

그래서 아래 프린트문에 출력된다.

프린트문은 if과 관게없는 관계로 무조건 출력된다.












if else문 예제 p3-6


#include <stdio.h>
int main()
{
  int num1;
  int num2;
  int bigger;
  int smaller;
  
  printf("Please enter two integers: ");
  scanf("%d %d"&num1, &num2); 
  if(num1 < num2)
  {
    bigger = num2; 
    smaller = num1;
  }

  else //if의 조건이 맞지 않는경우 아래와 같이 실행.
  {  
    bigger = num1;
    smaller = num2;
  }
  printf("%d is larger than %3d\n", bigger, smaller);

  return 0;
}

 위와 마찬가지로 if문에 조건이 맞으면 그래도 bigger = num2에 정장.

smaller = num1이다. 그러난 조건이 거짓이면,

 else문으로 넘어가 num1이 bigger에 대입되고

 num2가 smaller가 된다.  그리고

printf문으로 출력된다.

주의할 점은 if, if else에서는 들여쓰기가 중요하다.

들여쓰기

만약에 if(조건) { 명령문, 명령문,~~~~

길게 이어쓸수 있지만, 시각적으로 좋지 않기

 때문에 프로그램이 장문인 경우 좋지 않다. 그래서


int main()

{

if(조건)

{

명령문

}

}



이런식으로 {}중괄호를 쓰면, if의 명령문이 어디까지인지

 보기가 좋고 나중에 에러가 떴을 때 쉽게

 수정해나갈 수 있다.


 





p3-7 if와 else if

#include <stdio.h>
int main()
{
  int score;
  char grade = 'X';
  
  printf("Please enter examination score: ");
  scanf("%d"&score); //90을 치면 10을 나눠 9를 만든다.
  if((score <= 100)&&(score >=90)) //9
  {
    grade = 'A';
  }
  else if((score < 90)&&(score >=80))
  {
    grade = 'B';  
  }
  else if((score < 80)&&(score >=70))
  {
    grade = 'C';
  }
  else if((score < 70)&&(score >=60))
  {
    grade = 'D';
  }
  else if((score < 60)&&(score >=0))
  {
    grade = 'F';
  }
  else 
  {
    printf("Wrong score\n");
  }
  printf("The grade is %c\n", grade);

  return 0;
}

위에서 else가 뭐하는지 알았다.

 

그런데 여기에서는 마지막 빼고는 else if를 썻다.

 

그이유는 else는 중첩해서 쓸수 없기 때문이다. 

 

마찬가지로 if문이 조건을 만족시키지 못하면

elseif가 차례대로 실행된다. 예를 들면 90을 입력한다.

 90의 조건에 맞는 첫번째 if문에 참값이 된다.

 그리고 나머지 엘스 이프~~~엘스를 건너뛰어  

출력을 하게 된다. 만약에 68이라면 

 

else if((score < 70)&&(score >=60))문에 만족시킴으로

 

참값이 되고 아래를 건너뛰어 출력이 D로 출력된다.

 

위 프로그램에서 else가 없어도 결과는 같다.

 

하지만,엘스가 없다고 가정하자.
100을 입력하면, 처음 if문이 참값으로 받아들여도

 

아래 if문을 건너뛰지 않고 따지게 된다.

 

즉, 처리속도가 느려서 문제가 발생할 수도 있다.

 

따라서, elseif를 쓴것이다.


if

스위치문(swich).

바꾸다, 변환하다라는 뜻.

case 형식: case 정수(정수중에서 상수) ; 


p3-8

#include <stdio.h>
int main()
{
  int score;
  char grade;
  
  printf("Please enter examination score: ");
  scanf("%d"&score);
  score = score / 10;
  switch (score)
  {
    case 10:
    case 9
      grade = 'A'
      break;
    case 8
      grade = 'B'
      break;
    case 7
      grade = 'C'
      break;
    case 6
      grade = 'D'
      break;
    default
      grade = 'F'
      break;
  }
  printf("The grade is %c\n", grade);
}
break;는 실행을 멈추는 역할 case문이

 실행되면 그것을 정지하여 default값에 보내어진다.

만약에 90이라 입력하면 score에서 연산/을 하여 9가 된다.

 9가 되면, case 9: 의 값이 들어가고 A가 출력된다.

'A'는 아스키코드. 끝에 확장자 %c이기 때문에 그대로 A출력된다.

elseif- 범위지정

swich - 값을 일일이 지정해야한다.

 예를 들어 99를 입력하면 case99:~~~~

 이렇게 적어놓아야 한다.

위의 소스는 score =score /10을 하여 10을 나눔으로서

 일의 자리로 값을 나누게 된다. 99를 9.9로 되고 .9를 날려서

 9의 값을 가지고 case 9:에 실행된다. 

elseif는 범위지정을 하고 프로그램을 짤때

 유리하고 swich(case)문은 값이 명확할때 유용하다.






break문을 주석처리


#include <stdio.h>
int main()
{
  int score;
  char grade;
  
  printf("Please enter examination score: ");
  scanf("%d"&score);
  score = score / 10// 77을 입력하면, 7.7 소수버리고 case7로 간다.
  switch (score) // ()에는 정수변수
  {
    case 10//케이스 정수중에서 상수
    case 9
      grade = 'A'// 들여쓰기
      //break;
    case 8
      grade = 'B'//case:
      //break;
    case 7
      grade = 'C'//        명령;
      //break;
    case 6
      grade = 'D'//  위의 주석문 형태로 케이스 들여쓰기.
      break;
    
    default: grade = 'F'

       //break;
  }
  printf("The grade is %c\n", grade);
}

이경우 어떠한 수를 넣어도 F가 출력한다.

break는 조건을 만족시키면 정지시키고 printf문으로 바로

출력할 수 있게 한다. 그러나, 모두  break를 주석처리

 했기때문에 멈추지 않아 결국 default값으로 저장된다.


p3-9


#include
 <stdio.h>
int main()
{
  char ch;
  printf("Please enter a number between 0 to 9:");
  scanf("%c"&ch);
  switch(ch)
  {
    case'0':
          printf("Input Number is zero.\n");
        break;
    case'1':
          printf("Input Number is one.\n");
        break;
    case'2':
          printf("Input Number is two.\n");
        break;
    case'3':
          printf("Input Number is three.\n");
        break;
    case'4':
          printf("Input Number is Four.\n");
        break;
    case'5':
          printf("Input Number is five.\n");
        break;
    case'6':
          printf("Input Number is six.\n");
           break;
    case'7':
          printf("Input Number is seven.\n");
        break;
    case'8':
          printf("Input Number is Eight.\n");
        break;
    case'9':
          printf("Input Number is Nine.\n");
        break;
    default : printf("wrong number\n");
  }
  return 0;
}


0에서 9범위안에 숫자를 넣으면 해당 프린트문이출력된다.





posted by 송시혁