'Programming/C'에 해당하는 글 22건

변수명

대문자와 소문자를 구분한다.
문자와 숫자로 이루어지는데 첫 번째 숫자는 반드시 영문이어야 한다.
밑줄 "_"도 문자로 취급되는데 변수명이 길 때 알기 쉽게 하는 장점이 있다.
변수 이름을 밑줄 "_"로 시작하면 라이브러리 이름과 중복되므로 사용하지 않는다.
C언어에서 관습적으로 변수명에는 소문자를, 상수명에는 대문자를 사용한다.
변수명은 사용 목적에 관계된 이름을 붙여야 오타를 방지할 수 있다.
지역변수(local varialbe), 특히 순환문에는 짧은 이름을 쓰고, 외부 이름에는 긴 이름을 쓴다.


데이터 형과 크기
  • char - 1 Byte 문자
  • int - 정수, 기종에 따라 크기가 다름
  • float - 단정도(single-precision) 부동소숫점
  • double - 배정도(double-presision) 부동소숫점
  • short - 16 Bit 정수형 한정사(qualifier)
  • long -  32 Bit 정수형 한정사(qualifier)
  • signed(부호형) - 문자형, 정수형 한정사(qualifier)
  • unsigned(무부호형) - 문자형, 정수형 한정사(qualifier)

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

외부변수

Programming/C 2006. 9. 21. 21:08
공통(global) 변수

여러 함수에서 공통으로 사용되는 변수
공통 변수를 정의할 때는 extern 명령어 사용
함수의 바깥에 정의해야 하고, 그 변수를 사용하는 각 함수에서도 정의되어야 한다.
공통변수를 사용하는 함수가 공통변수 선언과 같은 파일에 들어있는 경우에는 함수에서 extern 선언들은 생략할 수 있다.

* 가장 긴 행을 찾는 프로그램 작성 (longest, max, line 변수를 공통으로 사용)

#include <stdio.h>

#define MAXLINE 1000  /* maximum input line size */

int max;  /* maximum length seen so far */
char line[MAXLINE];  /* current input line */
char longest[MAXLINE];  /* longest line saved here */

int getline(void);
void copy(void);
/* print longest input line; specialized version */

main()
{
  int len;
  extern int max;
  extern char longest[];

  max = 0;
  while( ( len = getline() ) > 0 )
    if( len > max ) {
      max = len;
      copy();
    }
  if( max > 0 )
    printf( "%s", longest );
  return 0;
}

int getline( void )
{
  int c, i;
  extern char line[];

  for( i = 0; i < MAXLINE - 1 && ( c = getchar() ) != EOF && c != '\n'; ++i )
    line[i] = c;
  if( c == '\n' ) {
    line[i] = c;
    ++i;
  }
  line[i] = '\0';
  return i;
}

void copy( void )
{
  int i;
  extern char line[], longest[];
  i = 0;
  while( ( longest[i] = line[i] ) != '\0' )
    ++i;
}

  • main의 while문에서 getline 함수를 불러 입력된 문자가 EOF가 아니고, 개행문자가 아니면 line 배열에 입력한다.
  • 개행문자('\n')가 입력되면 파일의 마지막에 '\0'를 입력하고 총 길이를 main의 len에 반환한다.
  • 가장 긴 입력이 들어오면 copy 함수로 저장한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

문자배열

Programming/C 2006. 9. 13. 23:26

* 여러 행을 읽어서 그 중 문자가 가장 긴 행을 출력하는 프로그램을 작성한다.

프로그램 개요
while(읽을 행이 있으면)
  if(지금 읽는 행이 지금까지 가장 길었던 행보다 길면)
    그 행과 행의 길이를 기억
가장 긴 행을 출력

#include <stdio.h>
#define MAXLINE 1000  // 행의 최대 문자 길이 지정

int getline( char line[], int maxline );
void copy( char to[], char from[] );

/* print longest input line */

main(){
  int len;
  int max;
  char line[MAXLINE];
  char longest[MAXLINE];

  max = 0;
  while( ( len = getline( line, MAXLINE ) ) > 0 )
    if( len > max ){
      max = len;
      copy( longest, line );
    }
    if( max > 0 )
      printf( "%d %s", max, longest );

  return 0;
}

/* getline: s배열로 행을 읽고, 길이 반환 */
int getline( char s[], int lim ){
  int c, i;

  for( i = 0; i < lim - 1 && ( c = getchar() ) != EOF && c != '\n'; ++i )
    s[ i ] = c;
  if( c == '\n' ){
    s[ i ] = c;
    ++i;
  }
  s[ i ] = '\0';

  return i;
}

/* copy: from 배열을 to 배열로 복사; 크기가 너무 크지 않은지 확인 */
void copy( char to[], char from[] ){
  int i;

  i = 0;
  while( ( to[ i ] = from[ i ] ) != '\0' )
    ++i;
}
  • main에서 입력받을 line[1000] 배열과 최대허용문자 MAXLINE(1000)의 매개변수로 getline 함수를 호출한다.
  • 배열은 0부터 시작하므로 for문의 i가 최대 배열길이 999를 넘지 않고, 입력받은 문자가 EOF가 아니고, 행바꿈문자가 아니면 입력받은 문자길이만큼 s배열에 저장한다.
  • 행바꿈 문자를 입력받으면 지금까지 입력받은 문자 길이만큼 s배열에 저장하고 배열의 마지막 첨자에 \0을 입력하고 배열의 길이를 반환한다.
  • 반환된 길이가 max 변수보다 크면 max 변수에 그 길이를 저장하고 longest[1000]과 line[i] 배열의 매개변수로 copy 함수를 호출한다.
  • 파일의 끝이 아니라면 longest배열에 line배열을 저장한다.
  • main에서 최대문자수와 가장 긴 행을 출력한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

함수

Programming/C 2006. 9. 13. 21:45
syntax
returnType functionName ( argument )
{
  statement
}

  • argument(actual argument) - 함수를 호출할 때 사용하는 매개변수
  • parameter(formal argument) - 함수를 선언할 때 사용하는 매개변수
  • call by reference - 변수명을 넘겨주는 것
  • call by value - 값을 넘겨주는 것

* x의 y제곱을 계산하는 함수를 작성하고 사용한다.
#include <stdio.h>

int power( int m, int n );

/* test power function */

main()
{
  int i;

  for( i = 0; i < 10 ; ++i )
    printf( "%d %d %d\n", i, power( 2, i ), power( -3, i ) );

  return 0;
}

int power( int base, int n ){
  int i, p;

  p = 1;
  for( i = 1; i <= n; ++i )
    p = p * base;

  return p;
}

x의 y제곱을 계산하는 power() 함수를 생성하고, main() 함수로 사용한다.

int power( int m, int n );  // int power( int, int ); 와 동일

power라는 함수는 정수입력을 두 개 받아 정수값을 리턴한다는 것을 나타낸다.
이런 것을 함수선언이라 한다.

call by value를 사용하면 변수를 적게 사용할 수 있게 되어 더 간결하고 효율적인 프로그램을 작성할 수 있다. power 함수는 다음처럼 더 간결할 수 있다.
int power( int base, int n ){
  int p;

  for( p = 1; n > 0; n-- )
    p = p * base;
  return p;
}


return문
  • 함수의 연산 결과를 나타내는 문장
  • return값으로는 변수, 수식, 0 등이 올 수 있다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

배열(Array)

Programming/C 2006. 9. 13. 20:37
파일을 읽어서 그 파일 속에 각각의 숫자, 빈칸, 그 외의 문자들은 몇 개인지를 세는 프로그램을 작성한다. (0~9까지의 숫자는 배열로 처리)

#include <stdio.h>

/* count digits, white space, others */

main()
{
  // 각 변수 초기화
  int c, i, nwhite, nother;
  int ndigit[ 10 ];
  nwhite = nother = 0;
  for( i = 0; i < 10; i++ )
    ndigit[ i ] = 0;

  // 입력문자 구분
  while( ( c = getchar() ) != EOF )
  if( c >= '0' && c <= '9' )
    ++ndigit[ c - '0' ];
  else if( c == ' ' || c == '\n' || c == '\t' )
    ++nwhite;
  else
    ++nother;

  // 출력
  printf( "digits =" );
  for( i = 0; i < 10; ++i )
    printf( "%d ", ndigit[ i ] );
  printf( ", white space = %d, other = %d\n", nwhite, nother );
}

  • 문자를 입력받을 때마다 숫자인지 빈칸인지 그 외의 문자인지 체크를 한다.
  • 숫자가 입력되면 해당 ndigit[i] 배열 값이 1씩 증가한다.
  • 빈칸, tab, 행바꿈문자가 나오면 빈칸 변수인 nwhite가 1씩 증가한다.
  • 그 외의 문자들이 입력되면 nother이 1씩 증가한다.

if( c >= '0' && c <= '9' )
  ++ndigit[ c - '0' ];

예를 들어 숫자 '3'이 입력되면 c의 실제값은 숫자 3이 아니라 문자'3'의 값이 입력된 것이다.
원하는 숫자를 처리하기 위해서는 c에서 '0'을 빼주면 배열에 올바른 숫자가 할당될 것이다.
  • 문자'3'의 ASCII 값은 51
  • 문자'0'의 ACSII 값은 48

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,