// 3x3 행렬을 나타내는 두 개의 2차원 배열 s와 d를 인수로 받아서
// s의 전치 행렬을 d에 저장하는 다음 함수를 작성하고 이 함수의 동작을 확인하시오.
// 전치 행렬은 행렬의 행과 열을 교환한 행렬이다.
// void transpose(int s[3][3], int d[3][3])

#include <stdio.h>

사용자 삽입 이미지

void transpose(int s[3][3], int d[3][3]);

main(void){

 int from[3][3] = {
  1,2,3,
  4,5,6,
  7,8,9
 };

 int to[3][3];
 int k, l;

 transpose(from,to);

 for(k=0; k<3; k++){
  for(l=0; l<3; l++)
   printf("%d ", to[k][l]);
  printf("\n");
 }
 return 0;
}

void transpose(int s[3][3], int d[3][3]){
// 1 2 3   1 4 7
// 4 5 6    ->  2 5 8
// 7 8 9   3 6 9

 int i,j;

 for(i=0; i<3; i++){
  for(j=0; j<3; j++)
   d[j][i] = s[i][j];
 }
}

<문자열 길이에 관한>
#include <stdio.h>
#include <string.h>
#define praise "My sakes, that's a grand name!"

int main(void)
{
 char name[40];

 printf("What's your name? \n");
 scanf("%s", name);
 printf("Hello, %s. %s\n", name, praise);
 printf("Your name of %d letters occupies %d memory cells. \n", strlen(name), sizeof name);
 printf("The phrase of PRAISE has %d letters ", strlen(praise));
 printf("and occupies %d memory cells. \n", sizeof praise);
}
== run ==
What's your name?
Sungjo (Enter)
Hello, Sungjo. My sakes, that's a grand name!
Your name of 6 letters occupies 40 memory cells.
The phrase of PRAISE has 30 letters and occupies 31 memory cells.
Press any key to continue
 

by Joe & Soohy 2007. 1. 16. 00:32

#include <stdio.h>
#include <string.h>

typedef enum conticode {asia, africa, america, europe, oseania} cc;
typedef struct {char cnm[30]; double lsz; cc ctnt; double preci;} ctrytype;

char conti_names[5][30] = {"asia", "africa", "america", "europe", "oseania"};
int convert_cname_ccode (char name[]);

void main () {

사용자 삽입 이미지

 ctrytype nations[200] = {
  {"Korea", 44.5, asia, 1534.7},
  {"Naizria", 6.7, africa, 675.9},
  {"USA", 203.4, america, 1230.4},
  {"Japan", 103.5, asia, 1590.7}
 };
 
 
 int i, ccode;
 char cname[30];
 do{
 
  printf("대륙이름을 입력하시오> ");
  scanf("%s", cname);
  ccode = convert_cname_ccode(cname);
  if(ccode == -1)
   printf("그런 대륙은 존재하지 않습니다. \n");
  else
   for (i=0; i<4; i++){
    if(nations[i].ctnt == ccode)
     printf("국가=%s, 강수량=%8.2f \n", nations[i].cnm, nations[i].preci);
   }
 }while(cname[0]!='$');
}

int convert_cname_ccode (char name[]){
 int i;
 for(i=0;i<5;i++)
  if(strcmp(conti_names[i], name) == 0) return i;
 return -1;
}


제 9장: 포인터

[포인터]: 메모리의 주소
- 변수의 포인터 = 변수의 주소
  변수를 선언하면 메모리 공간이 할당됨
  변수의 포인터: 변수의 값이 저장되는 메모리의 주소(시작주소)

- 주소연산자 &

사용자 삽입 이미지

  &v : 변수 v의 주소

  일반적으로 하나의 □ 당 4byte

[예} 주소 출력하기
- 변수의 주소를 출력
  #include <stdio.h>
  int p, q = 100;
  main()
  {
      int a, b;
      printf("address of a, b = %p, %p\n", &a, &b);      .... 지역변수
      printf("address of p, q = %x, %x\n", &p, &q);      .... 전역변수
      printf("address of of a string = %x\n", "univ");    … 문자열상수
   }

   형식 지정자 %p : 포인터 출력용 (16진수로 출력)
   포인터 출력은  부호 없는 정수 출력용인  %x, %o, %u를 사용해도 됨

[포인터 변수]: 포인터(메모리 주소)를 저장하는 변수
사용자 삽입 이미지

- 포인터 변수 선언: 포인터 변수는 가리키는 곳에 저장된 자료형을 함께 선언함
   int *p; .... 정수에 대한 주소의 자료형이 p라는 변수에 저장된다.
   char *q;
   double *r;

   보통 자료형과 함께 선언 가능
   int a, p*;
사용자 삽입 이미지

   (변수 a와 p를 잡는다. a는 int자료형, p는 int*형(정수를 저장하는 공간에 대한 주소))

   자료형(data type)    자료를 저장한 공간      변수
   int                          92486                        a (a라는 공간안의 값은 정수형)
   char                       'm'
     
[간접 연산자 *]
- 간접 연산자
  *p : 포인터 변수가 가리키는 곳에 저장된 값(간접참조)
  (cf) 단순 변수 a는 변수에 저장된 값을 나타냄 (직접 참조)
  간접연산자 *는 주소연산자 &의 반대 역할

   int a,  *p;
   …
   p = &a;  … p에 변수 a의 주소 저장
   이 때에 *p의 값은 a와 같음  
사용자 삽입 이미지







[포인터 변수의 초기화]
사용자 삽입 이미지

- 포인터 변수는 초기화 한 후에 간접연산자를 사용해야 함
   int a=100, b=200;
   int *p;

   a = *p;  … 잘못됨 
   *p = b;  … 잘못됨

   p = &a;  … 포인터변수 초기화
   b = *p;  … b = a 와 같음
   *p = b;  … a = b 와 같음

- NULL 포인터
   p = NULL;  … 포인터 p가 가리키는 곳이 없음을 명시함
                        NULL은 <stdio.h>에서 0으로 정의된 기호 상수



invalid-file

수업내용 약간 첨가한 ppt파일



주말과제:
학사정보:

학생정보:
  학생 한명: 이름(char sname[30]),
      수강과목:

교과목정보:
  과목 1개: 이름(char cname[20]),
            학정번호: enum hak {c0, c1, c2, c3, c5, c5})
            강사(char iname[30]),
            학점수: int(1~4)

typedef enum ec{c0,c1,c2,c3,c4,c5} hakjung;

typedef struct {char sname[30];
                hakjung courses[4];} stutype;

typedef struct {char cname[20]; hakjung hcode;
               char iname[30]; int credit; } coursetype;

// 학생들
stutype students[20] ={
   {"park", {c0,c3,c5}},
   {"kim", {c1,c2,c4}},
   .....
   }; //13명 정도를 넣을 것

coursetype courses[6] = {
  {"math1", c0, "tom", 4},
  ...
  }; // c0~c5까지 넣을 것

문제1: 학생의 이름을 입력 받는다
          이 사람이 듣는 과목의 강사명들을 모두 출력한다

문제2:  이 학생과 같이 과목을 듣는 모든 학생의 이름을 출력

by Joe & Soohy 2007. 1. 12. 09:57

#include <stdio.h>
#include <string.h>

int main(void)
{
 char country[10][8] = {"Korea","Japan","China","America","England","Spain","Germany","Italy","Swiss","France"};
 int land[10] = {100000, 99999, 90001, 87654, 78901, 64210, 55555, 40000, 32123, 21000};
 int peo[10] = {45, 120, 1500, 1010, 60, 32, 18, 21, 3, 11};
 char i[256];
 int j, k;
 
 do
 {
 
 printf("궁금하신 것은? (Land/People number) ex)Land 99999 : ");
 scanf("%s %d", &i, &j);
 
 if(strcmp(i, "End") == 0 && j <0) break;
 
 if(strcmp(i, "Land") == 0){
  for(k=0; k<10; k++){
   if(land[k] >= j)
    printf("국가명: %-8s  국토면적: %7d㎢  인구수: %5d백만명\n", country[k], land[k], peo[k]);
  }
 }
 
 else if(strcmp(i, "People") == 0){
  for(k=0; k<10; k++){
   if(peo[k] >= j)
    printf("국가명: %-8s  국토면적: %7d㎢  인구수: %5d백만명\n", country[k], land[k], peo[k]);
  }
 }
 
 else continue;
 
 }while(1);
 
 return 0;
}

사용자 삽입 이미지

by Joe & Soohy 2007. 1. 10. 12:00

8장 구조체



[구조체]
- 구조체: 여러 개의 임의의 자료형의 값들의 모임을 나타내는 자료형

- 예) 여러 사람의 학번, 이름, 학과를 저장하는 변수 선언
  구조체를 사용하지 않은 경우
  int id1, id2, id3;
  char name1[10], name2[10], name3[10];
  int dept1, dept2, dept3

  구조체를 사용한 경우
  struct student{
  int id;
  char name[10];
  int dept;
  };
  struct student p1, p2, p3;

[구조체 정의]
- 1. 구조체의 자료구조를 정의
- 2. 변수를 선언

- 구조체 정의
사용자 삽입 이미지

  struct student{
  int id;
  char name[10];
  int dept;
  };               .... ' ; ' 빠뜨리지 않도록 주의
※ student 구조체 이름, 태그이름
    id, name, dept  구조체 원소, 필드, 멤버

- 구조체 정의 후 변수 선언
   struct student person;
   struct student p1, p2;

- 구조체 정의와 함께 변수선언
  struct student{
  int id;
  char name[10];
  int dept;
  }p1, p2;


[구조체 멤버 접근]
- 구조체 멤버 접근: 구조체변수.멤버이름(멤버 연산자.)
   person.id           person.name              person.dept
      
- 예) person.id = 20030134   ... 학번 초기화
        gets(person.name);   ... 문자열 입력
        scanf("%d", &person.dept); ... 학과코드 입력

[중첩된 구조체]
- 중첩된 구조체
   구조체의 멤버로서 다른 구조체를 사용할 수 있음
   struct triangle{
      struct point.a;
      struct point b;
      struct point c;
   };

[구조체의 초기화]
- 구조체의 초기화 : 배열과 같이 { }를 사용하여 서언과 함께 초기화 가능

    struct test {
        int a;
         double f[2];      ...5개의 초기값이 필요
         struct point p;
     };

     struct test s1 = {1, 2.1, 4.5 , 5, 7 };
     struct test s2 = {1, 2.1, 4.5 , 5 };  … s2.p.y = 0
     struct test t1 = { 1, {2.1, 4.5}, {5, 7} };
     struct test t2 = { 1, {2.1}, {5, 7} };  … t2.f[1] = 0.0

    초기값이 멤버 수 보다 적으면 나머지는 0으로 간주됨


[구조체의 치환과 비교]
- 구조체의 치환은 허용됨: 구조체의 모든 멤버들이 복사됨(배열은 치환 불가)
- 구조체의 비교는 허용되지 않음: 개별적으로 멤버 비교해야 함

    struct point p1 = {4.0, 10.0};
     struct point p2;
 
     p2 = p1;    /* 구조체 치환 */
     printf("p2: x = %f, y = %f\n", p2.x, p2.y);

     if (p1.x == p2.x && p1.y == p2.y) /* 구조체 비교: 멤버 별로  */
         printf("두 점 p1과 p2는 같다.\n");

[구조체와 함수]
- 구조체는 함수의 인수 및 반환 값으로 사용 가능함
   ★ 인수 및 반환값은 복사되어 전달됨
   구조체의 크기가 큰 경우에는 비효율적

예)
학생 데이타에 대한 구조체:
  학번, 이름, 나이, 성적

struct student{
   int sno;
   char[30] name;
   int age;
   double gpa;
};

학생이 여러명일텐데, 배열을 선언해보자 (5명)
struct student boys[5] = {
  {1012, Kim, 21, 3.45},{1009, Lee, 20, 3.91}, {1023, Park, 25, 2.92), (1030, Jung, 22, 3.14}, {1002, Choi, 20, 4.03}
};

Double compute_average(struct student pers[]);

다섯명의 학생의 평균을 구하라
void main(){
 struct student boys[5] = {
  {1012, Kim, 21, 3.45},{1009, Lee, 20, 3.91}, {1023, Park, 25, 2.92), (1030, Jung, 22, 3.14}, {1002, Choi, 20, 4.03}
  };
  double avg;
  avg = compute_average(boys);
  printf("average of 5 students = %5.2f \n", avg);
} //main.

Double compute_average(struct student pers[]){
 double total = 0;
 int i;
 for(i=0;i<5;i++) total = total + per[i].gpa;
 return total/5;
} // compute_average

=== 프로그래밍 ===

사용자 삽입 이미지

#include <stdio.h>

struct student{
   int sno;
   char name[30];
   int age;
   double gpa;
};


double compute_average(struct student pers[]);


int main(void){
 double avg;
 struct student boys[5] = {
  {1012, "Kim", 21, 3.45}, {1009,"Lee", 20, 3.91}, {1023, "Park", 25, 2.92}, {1030, "Jung", 22, 3.14}, {1002, "Choi", 20, 4.03}
  };
 
  avg = compute_average(boys);
  printf("average of 5 students = %5.2lf \n", avg);
 return 0;
} //main.

double compute_average(struct student pers[])
{
 double total = 0;
 int i;
 for(i=0;i<5;i++) total = total + pers[i].gpa;
 return total/5;
} // compute_average
===

== 프로그램 ==

사용자 삽입 이미지

#include <stdio.h>
#include <string.h>

struct student{
   int sno;
   char name[30];
   int age;
   double gpa;
};

struct student find_student(struct student pers[], char na[]);

int main(void){
 
 struct student boys[5] = {
  {1012, "Kim", 21, 3.45}, {1009,"Lee", 20, 3.91}, {1023, "Park", 25, 2.92}, {1030, "Jung", 22, 3.14}, {1002, "Choi", 20, 4.03}
  };
 char aname[30];
 struct student astu;

 do{
 printf("이름은? : ");
 scanf("%s", aname);
 astu = find_student (boys, aname);
 if(aname[0] == '$') break;
 printf("sno=%d age=%d gpa=%5.2f \n", astu.sno, astu.age, astu.gpa);

 }while(1);
 return 0;
} //main.

struct student find_student(struct student pers[], char na[])
{
 int i;
 for(i=0;i<5;i++)
  if(strcmp(pers[i].name, na) == 0) return pers[i];
 na[0] = '$';
 return pers[0];
}
==

==과제==
위의 구문을 손봐서 만들기~....
학점을 받아서, 그 학점보다 더 잘 받은 사람을 찍어줘라...
학번 이름 나이 학점학점에 음수를 처주면 종료

by Joe & Soohy 2007. 1. 10. 09:47
Korea            20000                   45
Japan            12022                  120
America         32323
England
Brazil
Spain
Germany
France
Swiss
China

국가명           Land(Km^2)           인구(백만명)

궁금하신것은? Land 30000
or
궁금하신것은? Popu 100

그럼 그 이상의 값을 같는 결과를 각각 출력할 것

계속 반복되도록, 빠져나가는 것은 End -1(음수)을 입력하도록...
(기타 처리는 하지 않아도 됨)
by Joe & Soohy 2007. 1. 9. 12:55

7장 문자열
§ 7장의 학습목표: 문자의 배열(char의 배열)

[문자열과 배열]
- 문자열
   문자열: 문자들이 메모리의 연속적인 위치에 배치됨
   널문자('0'로 종료됨 (널문자는 문자열 끝을 의미)
   "korea" ->k o r e a \0      ....\0 : 00000000 (8bits)

- 문자열과 배열
   문자열은 문자배열에 저장 가능
   (문자배열의 크기 >= 문자 개수+1) 이어야 함
   문자배열에 저장된 문자들이 '\0'으로 끝나지 않으면 문자열이 아님

[문자 배열 초기화]
- 문자열을 사용하지 않는 초기화
   1. char s[4];
      s[0] = 'd'; s[1]='a'; s[2]='y'; s[3]='\0';
   2. char s[4] = {'d','a','y','\0'};

- 문자열 상수로 초기화
   char s[5]="day";     .... 배열크기는 문자 개수보다 1이상 커야 함
   char s[]="day";       .... 배열크기가 문자열 저장에 필요한 크기로 됨 = 4

- strcpy() 함수를 사용한 초기화
   #include <string.h>
   char s[4];            ... strcpy()함수 원형 선언 포함
   ...
   strcpy(s, "day")    ... 프로그램 내에서 문자배열에 문자열 복사

- 잘못된 예
  s = "day";               ... 배열이라 절대 불가능하다

[문자열 입출력]
- 문자열 입출력
   입력: scanf(), gets()
   출력: printf(), puts()

- 문자열 입력
사용자 삽입 이미지
※ 배열인 경우에는 scanf("%s",a);     ... &a 로 붙이지 마라!!!!

- 문자열 출력
사용자 삽입 이미지

[문자열 처리 함수]
- 인수로 문자열을 사용하는 함수 : 문자열 끝이 널문자로 끝나므로 배열 크기 인수 불필요

- 예) 문자열 길이 계산 함수
   널문자는 문자열 길이에 포함되지 않음
   널문자의 첨자가 문자열 길이와 같음

   int strlen(const char s[])
사용자 삽입 이미지

   {
        int i = 0;
        while (s[i] != '\0')
                i++;
        return i
    }

- 예) 문자열 복사 함수
   void strcpy(char s1[], const char s2[])
   {
       int i;
       for (i=0; s2[] != '\0'; i++);
            s1[i] = s2[i];
       s1[i] = '\0';
    }
사용자 삽입 이미지

[문자열 라이브러리 함수]
- 문자열 라이브러리 함수
   표준 라이브러리 함수에서 문자열 처리 함수 제공
   헤더파일: #include <string.h>

    strcpy(s1,s2)              문자열 s2를 문자열 s1으로 복사
    strcat(s1,s2)               문자열 s2를 문자열 s1뒤에 연결하여 붙임
    strcmp(s1,s2)              문자열 s1과 s2를 사전식 비교
    strlen(s1)                   문자열 s1 길이
    strncpy(s1, s2, n)        문자열 s2를 최대 n 문자까지 문자열 s1으로 복사
    strncat(s1,s2,n)           문자열 s2를 최대 n 문자까지 문자열 s1뒤에 붙임
    strncmp(s1,s2,n)         문자열 s1과 s2를 최대 n 문자까지 사전식 비교

- 예) strcat() 함수를 사용한 문자열 연결하기
   char s1[13] = "pretty";
   char s2[7] = "girl";
사용자 삽입 이미지

연습문제
연산 이름과 연산을 할 두 정수를 입력 받아서 주어진 연산 결과를 출력하는 프로그램 작성
연산 이름: add  sub  mul  div(몫) mod(나머지) power(거듭제곱)
  입력 형식
  add    1   2  출력: 3
  power  3   4  출력: 81

== 코딩 ==
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
 int i, j;
 char s [20];
 double res;

 printf("연산자와 두 정수를 입력하시오. ex)mod 4 3\n");
 printf("(사용 가능 연산자: add, sub, mul, div, mod, power)\n");

 scanf("%s %d %d", s, &i, &j);

사용자 삽입 이미지

 while(strcmp(s, "$") != 0){
  if(strcmp(s, "add") == 0)
   res = i + j;
  else if(strcmp(s, "sub") == 0)
   res = i - j;
  else if(strcmp(s, "mul") == 0)
   res = i * j;
  else if(strcmp(s, "div") == 0)
   res = (double)i / j;
  else if(strcmp(s, "mod") == 0)
   res = i % j;
  else if(strcmp(s, "power") == 0)
   res = pow(i,j);
  else
   continue;
 
  printf("%4d %s %4d = %10.2f\n", i, s, j, res);
  scanf("%s %d %d", s, &i, &j);
 
 }

 return 0;
}
====

by Joe & Soohy 2007. 1. 9. 09:39

사용자 삽입 이미지
/* 0점부터 100점 사이에 분포된 성적 자료들을 받아서
 * 10점 단위로 빈도를 구하여 출력하는 프로그램을 작성 */

#include <stdio.h>

int main(void)
{
 int i,j,k;
 int count[10]={0};
 int freq[20];
 
 printf("성적을 입력하세요\n");
 
 for(i=0;i<20;i++)
  scanf("%d",&freq[i]);
   
 for(k=0;k<20;k++){
  if(freq[k]/10 == 10)
   count[9]++;
  else
   count[freq[k]/10]++;
 }
 
 for(j=0;j<9;j++)
  printf("%2d ∼ %3d 점 : %2d 명\n",10*j,10*j+9,count[j]);
 printf("90 ∼ 100 점 : %2d 명\n", count[9]);

 return 0;
}


by Joe & Soohy 2007. 1. 8. 21:08

제 6장



맨 아래에 '숙제'있음

[배열]
- 배열(array): 여러개의 같은 자료형의 값들의 모임을 나타내는 자료형

- 예) 5명의 성적 표현
  배열을 사용하지 않는 경우
  int grade0, grade1, grade2, grade3, grade4;    ....개별적으로 선언

  배열을 사용한 경우
  int grade[5];    ..... 변수 grade는 5원소로 구성된 배열
                              1개의 이름으로 5원소 나타냄

- 자료구조(data structure)
   함수는 프로그램을 조직화하는 방법을 제공
   자료구조는 자료를 조직화하는 방법을 제공

[배열선언]
- int grade[5];   ... grade[0],  int grade[1], int grade[2], int grade[3], int grade[4]  .... 정수 배열 선언
  char s[80];    .... 문자 배열 선언
  int a[10], b[5], c;

- 배열 원소 접근: 첨자(index)는 0부터 n-1까지

- 첨자는 정수식으로 표현가능, 첨자가 유효한 범위 내에 있어야 함
  grade[2]    grade[k]    grade[3*k+2]    .... k는 정수형 변수

[배열의 치환과 비교]
- 배열 전체를 비교하거나 치환 할 수 없음
   int a[10], b[10];
   ...
   a=b;                                                  ... 틀렸음: 배열 치환 불가
   if(a=b) printf("두 배열은 같습니다\n");   ... 틀렸음: 배열 비교 불가

- 배열의 치환과 비교는 원소 단위로 수행해야 함
  for (i=0; i<10; i++)       .... 배열의 치환
  a[i] = b[i]

  same = 1;
  for (i=0; i<10; i++)
       if (a[i] != b[i]){same 0;  break;}
   if same==1) printf("두 배열은 같습니다\n");

[배열의 초기화]
- 배열 원소도 선언을 할 때에 초기화 할 수 있음
   int a[4] = {10,20,30,40};
   int a[4] = {10,20);     -> int a[0]=10, int a[1]=20, int a[3]=0, int a[4]=0
   int a[] = {10,20,30,40};

[다차원 배열]
- 다차원 배열: 1개의 첨자에 의해서 원소가 구분됨
   1차원 배열: 1개의 첨자에 의해서 원소가 구분됨
   2차원 배열: 2개의 첨자에 의해서 원소가 구분됨
   n차원 배열: n개의 첨자에 의해서 원소가 구분됨

- 다차원 배열 선언
   int a[4];                  .... 1차원 배열, 4원소
   int b[2][4];              .... 2차원 배열(2행 4열), 2 x 4 = 8원소
   int c[3][2][4];         .... 3차원 배열(3면 2행 4열), 3 x 2 x 4 = 24원소

- 배열 원소 접근
  b[0][3]     .... 첨자는 행 0~1, 열 0~3까지 사용 가능 (행을 먼저 써준다)
  c[p][q][r] .... 첨자는 정수식 사용가능

[배열의 기본장소 배치] => 초보자는 궂이 알 필요가 없다

[다차원 배열 초기화]
- 초기값은 기억장소 배치 순서대로 지정됨
   int b[2][4] = {{1,2,3,4},{5,6,7,8}   (권장)
   int b[2][4] = {1,2,3,4,5,6,7,8}        (가능)

사용자 삽입 이미지

[배열과 함수]
- 배열은 함수의 인수로 사용될 수 있다.
   베열의 크기는 지정할 필요가 없음
   double average(double data[])      .... 배열의 크기 지정하지 않음
   {
    ...
    }
   인수로 전단되는 배열은 호출하는 측에서 선언되어 있음
   배열의 크기를 함께 선언해도 무방하지만 아무런 의미가 없음
   double averge(double data[])   .... 임의의 크기의 배열에 사용 가능
   {
    ...
    }
   배열은 함수 반환값으로 사용할 수 없음

[예) 배열을 인수로 사용하는 함수]

사용자 삽입 이미지
사용자 삽입 이미지

[다차원 배열 인수]
- 다차원 배열 인수: 첫번째 첨자를 제외한(첫번째도 지정 가능) 나머지 첨자의 크기는 지정해야 함
   double max_elem(int a[][3])
   {
    ...
    }

[배열 인수와 보통 인수의 차이
- 보통인수: 함수에서 형식 인수의 값이 바뀌더라도 이 함수를 호출한 측에서 실 인수로 사용된 변수에는 영향없음
- 배열인수: 함수에서 사용되는 배열은 이 함수를 호출한 측에서 실 인수로 사용된 배열과 같은 배열임

사용자 삽입 이미지


[변수의 접근 수정자] => 일반 사용자에게는 별 의미없다]

[선택정렬(sorting)]
- 정렬: 자료를 순서대로 나열하는 것

- 선택정렬
   n개의 자료 중 가장 작은 자룔르 찾아서 첫째 원소와 교환
   나머지 n-1개 자료 중 가장 작은 자료를 찾아서 둘째 원소와 교환
   이러한 방식을 1개 자료가 남을 때까지 반복 수행

사용자 삽입 이미지

사용자 삽입 이미지

== 실습시간 ==
사용자 삽입 이미지


#include <stdio.h>

int main(void)
{
 int monthday[12] = {31,30,31,30,31,30,31,31,30,31,30,31}; /* 한 달의 날 수 */
 int year, month, day;
 int count, i;
 int isleep;

 printf("연 월 일을 다음의 형식으로 입력하시오. (2006 4 10) >\n");
 scanf("%d %d %d",&year,&month,&day);

 count = 0;
 for (i=1;i<month;i++)        /* 전 월까지의 날 수 계산 */
  count = count + monthday[month-1];    /* 해당 전 월까지의 날 수를 구함 */
 count = count + day;        /* 전 월 날수 + 해당 월 일자수 */
 isleep = (year%4==0 && year%100 !=0 || year%400==0); /* 윤년 확인 */
 if(isleep && month>2)        /* 윤년이고 2월이 넘었다면 1일 더함(29일) */
  count++;
 printf("올해의 %d 번째 날입니다. \n", count);   /* 출력 */
 return 0;
}

연구과제
/* 지정하는 다음 함수를 작성하고 이 함수의 동작을 확인하시오
 * void transpose(int s[3][3], int d[3][3];
 * 1 2 3          1 4 7
 * 4 5 6    ==>   2 5 8
 * 7 8 9          3 6 9 */

#include <stdio.h>

void transpose(int s[3][3], int d[3][3]);

int main(void)
{
 int a, b;
 int s[3][3];
 int d[3][3] = {1,2,3,4,5,6,7,8,9};
 for(a=0; a<3; a++){
  for(b=0; b<3; b++){
   printf("%d", s[a][b]);
 putchar('\n');
 }
 return 0;
}

void transpose(int s[3][3], int d[3][3])
{
 int i, j;
 
 for(i=0;i<3;i++){
  for(j=1; j<3; j++)
   s[j][i] = d[i][j];
 }
}
====

사용자 삽입 이미지
by Joe & Soohy 2007. 1. 8. 09:45

1. while 반복문을 사용하여 십진수를 입력하면 그것을 ASCII 값으로 하는 문자를 출력하는 프로그램을 작성하라. (단, 끝날때는 999를 입력한다고 하자.)

/* while 반복문을 사용하여 십진수를 입력하면
 * 그것을 ASCII 값으로 하는 문자를 출력하는 프로그램을 작성하라.
 * (단, 끝날때는 999를 입력한다고 하자.) */

#include <stdio.h>

int main(void)
{
 int digit;
 printf("숫자를 입력해주세요. (종료시엔 999 입력) : ");  
 scanf("%d",&digit);            /* 십진수 입력 */
 
 while(digit != 999){           /* 999가 입력되지 않았을 경우는 연산, 999 입력시 종료 */
  putchar(digit);            /* 십진수에 해당하는 문자열 출력 */
  putchar('\n');            /* 개행 */
  printf("숫자를 입력해주세요. (종료시엔 999 입력) : ");
  scanf("%d",&digit);           /* 새로운 십진수 입력 */
 }
 return 0;
}


2. 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과 평균을 구하는 프로그램을 작성하라.

/* 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과 평균을 구하는 프로그램을 작성하라. */

#include <stdio.h>

int main(void)
{
 int data;    /* 자료의 개수 */
 double sum;    /* 자료들의 합 */
 double average;   /* 자료들의 평균 */
 
 int i;
 double j;    /* 자료 입력 */

 sum = 0.0;    /* 합의 초기화 */

 printf("자료의 개수를 입력하세요: ");  /* 자료의 개수를 입력 */
 scanf("%d",&data);       /* data에 저장 */

 for(i=1; i<=data;i++){      /* 자료 개수만큼 반복 */
  scanf("%lf",&j);      /* 자료의 값 입력 */
  sum += j;        /* 자료의 값을 더함 */
 }
 average = sum/(double)data;     /* 평균 값을 계산 */

 printf("합은 %f 입니다.\n", sum);   /* 합 출력 */
 printf("평균은 %.2f 입니다.\n", average); /* 평균 출력 */
 
 return 0;
}

invalid-file

과제 제출 VC++ 프로젝트 파일

by Joe & Soohy 2007. 1. 8. 00:00

중간고사 익일 10시 30분 창조관 447호

12p 부터 시작

test1.c                                   test2.c
------                                   ------
int a;                                     extern int a;                      ..... test1.c, test2.c 공유
static int b;                            static int b;                        ..... 독립적인 저장공간 사용
main()                                   func()
{                                          {
...                                         ...
   func();                               }
...
}

사용자 삽입 이미지


사용자 삽입 이미지
사용자 삽입 이미지

<- 직접 재귀 함수

                                                  간접 재귀 함수 ->







하노이의 탑
#include <stdio.h>

void hanoi(int n, char a, char b, char c);

int main(void)
{
 /* 3개의 원반을 옮기는 하노이 탑 문제 */
 /*초기막대 a, 작업막대 b, 목표막대 c */
 return 0;
}

void hanoi(int n, char a, char b, char c)
{
 if (n<1)
  printf("invalid number of discs\n");
 else if ( n==1 )
  printf("원반 %d : %c ==> %c\n", n, a, c);
 else {
  hanoi(n-1, a, c, b);
  printf("원반 %d : %c ==> %c\n", n, a, c);
  hanoi(n-1, b, a, c);
 }
}


==== 실습시간 ====
1. nCr 구하기
#include <stdio.h>

double factorial(int k);

int main(void)
{
 int a, b;
 double c;

 printf("nCr을 구해봅시다!\n");
 printf("n의 값을 입력하세요 : ");
 scanf("%d",&a);
 printf("r의 값을 입력하세요(n값보다 작게) : ");
 scanf("%d",&b);

 c=factorial(a)/(factorial(b)*factorial(a-b));
 printf("결과는 %g 입니다.",c);

 return 0;
}

double factorial(int k)
{
 int i;
 double j;
 j=1.0;

 for(i=1;i<=k;i++)
  j *= i;
 return(j);
}

또는

#include <stdio.h>

double factorial(int k);

int main(void)
{
 int a, b;
 double c;

 printf("nCr을 구해봅시다!\n");
 printf("n의 값을 입력하세요 : ");
 scanf("%d",&a);
 printf("r의 값을 입력하세요(n값보다 작게) : ");
 scanf("%d",&b);

 c=factorial(a)/(factorial(b)*factorial(a-b));
 printf("결과는 %g 입니다.",c);

 return 0;
}

double factorial(int k)
{
 int i;
 double j;
 j=1.0;

 for(i=k;i>=1;i--)
  j *= i;
 return(j);
}

p139 (5.3.2)
#include <stdio.h>

사용자 삽입 이미지

void print_star(int k, int n);

int main(void)
{
 int a,b;

 scanf("%d",&a);
 for(b=1;b<=a;b++)
  print_star(b,b);
 
 return 0;
}

void print_star(int k, int n)
{
 int i,j;

 for(i=1;i<=k;i++)
  putchar(' ');
 for(j=1;j<=n;j++)
  putchar('*');
 putchar('\n');
}

p.139 연습문제 5.3.2.b

사용자 삽입 이미지

#include <stdio.h>

void print_star(int k, int n);

int main(void)
{
 int a,b;

 scanf("%d",&a);
 for(b=1;b<=a;b++)
  print_star(a-b,2*b-1);

 return 0;
}

void print_star(int k, int n)
{
 int i,j;

 for(i=1;i<=k;i++)
  putchar(' ');
 for(j=1;j<=n;j++)
  putchar('*');
 putchar('\n');
}

by Joe & Soohy 2007. 1. 4. 09:44


#include <stdio.h>
사용자 삽입 이미지

#define N 10

int main(void)
{
 int a,b,c;

 for(a=1; a<=N; a++){
  for(b=N-a;b>0;b--)
   putchar(' ');
  for(c=0;c<a;c++)
   putchar('*');
  putchar('\n');
 }
 return 0;
}


5장 함수



[함수] 어떠한 일을 수행하는 프로그램의 부분
- 문제 해결 방법
   문제를 여러개의 작은 문제로 나누고 작은 문제를 해결하는 함수들을 작성: 모듈화
   이 함수들을 사용하여 문제를 해결
   함수의 반복 사용(재사용) 가능

- C 프로그램은
  하나 이상의 함수로 구성
  main 함수를 반드시 포함하며, main 함수부터 실행함
  함수는 인수를 받아서 함수의 프로그램을 실행하고 실행 결과를 반환값으로 돌려줌


[함수 소개]
void welcome(void)
리턴값이 없다  이름 welcome  인수값이 없다

예)
사용자 삽입 이미지

#include <stdio.h>

int add(int a, int b);   /* 함수 add()의 원형 선언 */

int main(void)
{
 int sum;

 printf("begin main\n");
 sum = add(10, 20);    /* 함수 add() 호출 */
 printf("sum = %d\n", sum);
 return 0;

}

int add(int a, int b) /* 함수 add()의 정의 */
{
 printf("welcome! fuction add\n");
 return a + b;   /*함수의 계산결과를 반환 */
}


예제

사용자 삽입 이미지

#include <stdio.h>

void char_print(char a, int b);

int main(void)
{
 char_print('*',10);
 char_print('-',5);
 return 0;
}

void char_print(char a, int b)
{
 int i;

 for(i=0; i<b; i++)
  putchar(a);
 putchar('\n');
}


[함수 원형 선언과 함수 호출]
- 함수 원형(prototype) 선언
  함수를 사용하기 전에 함수의 반환값과 매개변수들의 자료형을 선언하는 것
    void print_char(char, int) 또는
    void print_char(char c, int n);
  하뭇 호출할때에 잘못 사용하는 것을 컴파일러가 알 수 있도록 함

- 함수의 호출
  함수에게 인수값을 제공하여 함수를 실행시키고 결과를 반환 받음
    함수(인수값1, 인수값2, ...)
  호출하는 함수는 앞에 함수 원형 선언 또는 함수 정의가 있어야 함

사용자 삽입 이미지

#include <stdio.h>

사용자 삽입 이미지

#include <math.h>
#define N 20

int main(void)
{
 int a,b;
 double c,d,f;
 d = 1.0;
 f = 1.0;

 for(a=1; a<=N; a++)
 {
  c = 1.0;
  for(b=a; b>=1; b--)
   c = c * b;
  d = 1.0/(double)c;
  f = f+d ;
 }
 printf("%.15g\n", f);
 printf("%.15g\n", exp(1.0));
 return 0;
}

by Joe & Soohy 2007. 1. 3. 09:38

숙제 - 조교한테 E-mail로 낼 것

1. while 반복문을 사용하여 십진수를 입력하면 그것을 ASCII 값으로 하는 문자를 출력하는 프로그램을 작성하라. (단, 끝날때는 999를 입력한다고 하자.)

2. 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과 평균을 구하는 프로그램을 작성하라.

작성한 프로그램 파일 폴더 통째로 Zip 저장해서 일요일까지 제출
──────────────────────────────────────────────────

[while문]
- while (조건식) ....조건식이 참인 동안
     문장                 문장 반복 실행

- white (조건식){
     문장
     문장
     ...
     }

- 예) 음수 또는 0이 입력될 때까지의 입력된 정수의 합을 계산
   sum = 0;                          /* 합의 초기 값 */
   scanf("%d",&number);      /* 정수 입력 */
   while (number > 0){
   sum = sum + number;
   scanf("%d",&number);      /* 다시 정수 입력 */
   }

[반복 제어 변수] ... 반복문에서 루프를 도는 횟수를 제어하겠다.
- 예) 1부터 10까지의 정수의 합 계산
   sum = 1 + 2 + 3 + ... + 10
     ↓
   sum = 0;
   sum = sum + 1;
   sum = sum + 2;              i는 1~10에 대해서 다음 문장 반복수행
    ...                               sum = sum + i
   sum = sum + 10;
     ↓                               변수 i가 반복제어변수
   sum = 0;                        합의 초기값은 0
   i = 1;                             초기화
   while (i <= 10){              검사
   sum = sum + i;
   i = i + 1;                         갱신
   }                                  ※ 반복제어변수
                                           - 반복할 때마다 값이 변화
                                           - 변수 값에 따라서 반복수행 여부결정

예) 1~20까지의 합 구하기

#include <stdio.h>

int main(void)
{
 int sum, i;
 sum = 0;
 i = 1;

 while (i<=20){
  sum = sum + i;
  i = i + 1;
 }

 printf("%d",sum);
 return 0;
}

== sum ==
210
=========

예) 실수 r의 n제곱을 계산 (n은 정수)
  - 곱의 초기값 = 1 (곱셈 항등원)
  - 반복제어: n을 초기값에서 시작하여 반복할 때마다 1씩 감소시켜서 
                  n이 0이 될 때까지 반복하면 n의 초기값 횟수만큼 반복 수행

[for문]
- for문
  for(수식1; 수식2; 수식3)             .... 수식2가 참인동안 반복
       문장
- 반복제어변수를 사용하는 경우에 적합
  수식1: 초기화
  수식2: 조건식
  수식3: 갱신
- 예) N번 반복 실행
  1. for(i=1;i<=N;i=i+1)                  .... 1부터 N까지
      문장
  2. for(i=0; i<N; i=i+1)                 .... 0부터 N-1까지
      문장

- 예) 1부터 10까지의 정수의 합 계산
  for (i=1; i<=10; i=i+1)
       sum = sum + i;

- 예) 

수열 an = 2an-1 – 1 (a1=3) a10 구하기

   a = 3;
   for (i=2; i<=10; i=i+1)
        a = 2*a - 1;

- 예)
 

Fibonacci수열 Fn = Fn-2 + Fn-1 (F1=0, F2=1) F20 구하기

    a = 0; b = 1;

사용자 삽입 이미지

    for (i=3; i <=20; i=i+1){
        c = a + b;
        a = b;
        b = c;
    }


==== 프로그래밍 ====
#include <stdio.h>

int main(void)
{
 int a, b, c, d, i;
 a = 0; b= 1;

 printf("항 번호를 입력하시오: ");
 scanf("%d",&d);

 for(i=3; i<=d; i=i+1){
  c = a + b;
  a = b;
  b = c;
 }
 
 printf("결과값은 %d 이다\n",c);

 return 0;
}
=== run ===
항 번호를 입력하시오: 20
결과값은 4101 이다
===========


[무한 루프와 공문]
- 무한루프
   반복조건이 항상 참인 반복문

   for (  ;  ;  )             .... 수식2가 생략되면 참(true)으로 간주함
   문장

   while(1)                 .... 조건식 1은 참(true)이다
   문장

   무한 루프인 반복문은 내부에서 반복문을 종료할 수 있어야 함
    -> break

- 공문(null statement): ; 만으로 이루어진 아무 동작도 하지 않는 문장
   while(조건식);

   while(조건식)      -> 무한루프 발생 가능
   ;

[반복문 설계]
- 반복 자료 입력을 종료 시키는 방법
  입력 자료 수를 먼저 입력하여 이 횟수 만큼 반봅 입력
  정상적으로 사용되지 않는 자료(보초)를 마지막에 잆력
  입력 함수의 파일 끝(EOF) 반환 기능 이용 (Ctrl-Z 또는 Ctrl-D 입력)

- EOF를 만날 때 까지 정수를 입력하여 평균 계산

사용자 삽입 이미지

== 프로그램 ==
#include <stdio.h>

int main(void)
{
 int count, sum, number;

 count = 0;
 sum = 0;

 while(scanf("%d",&number) != EOF){
  sum = sum + number;
  count = count + 1;
 }
 
 printf("The number of inputs = %d\n", count);
 
 if(count >0)
  printf("average = %f\n", (double)sum/count);
 
 return 0;
}
== run ==
1(enter)
2(enter)
3(enter)
4(enter)
5(enter)
^Z (ctrl+Z)
The number of inputs = 5
average = 3.000000
=========

예) 네제곱표 만들기
 #include <stdio.h>
  main()
  {
      int a;
      for(a=1; a<=13; a=a+2)
           printf("%d %d \n", a, a*a*a*a);
   }
문제점: 각 열이 나란하게 출력되지 않음 -> 해결책: 출력의 각 필드 폭(자릿수)을 일정하게 함


[잘못된 입력 처리하기]
- scanf()함수의 반환 값
   scanf() 함수는 성공적으로 입력된 변수의 개수를 반환함

- 정수가 아닌 입력에 대해서 반복 종료 (프로그램 종료)
  while ( scanf("%d", &number) = 1){
  sum = sum + number;
  count = count + 1;
  }
  반복문에서 EOF를 1로 바꾸면 파일 끝뿐만 아니라 정수가 아닌 입력에 대해서도 반복을 종료함

- 정수가 아닌 입력을 무시하고 계속 입력
  scanf("%*s")를 사용
하면 잘못된 입력을 무시하고 다음 자료 입력 (프로그램 계속 돈다)
   while ( (n =scanf("%d",&number) ) != EOF){
   if ( n == 1){
      sum = sum + number;
      count = count + 1;
   } else
      scanf("%*s);
   }


[형식지정 출력]
- 필드 폭과 정렬: 출력 공간의 크기 (우정렬, 좌정렬, 필드폭보다 크면 글자가 잘림)

- printf 함수의 형식지정자

사용자 삽입 이미지


== 화씨 섭씨 계산 프로그램 ==

#include <stdio.h>

int main(void)
{
 int f;
 float c;

 printf("%4s %6s\n", "화씨", "섭씨");
 
 for(f=0; f<=100; f=f+5){
  c=(f-32.0)*5.0/9.0;
  printf("%4d %6.1f\n", f, c);
 }

 return 0;
}
== run ==

사용자 삽입 이미지

========

[증감 연산자]
- 증감 연산자
   증가 연산자: i++        <- i = i + 1
   감소 연산자: i--        <- i = i - 1

- 증감 연산 수식의 값
   사전증감: ++i, --i는 먼저 증감 -> 증감이후의 값을 사용
   사후증감: i++, i--는 나중에 증감 -> 증감이전의 값을 사용
   예) i = 5;
        a = ++i;      ---------> i++; a = i;
        결과: i=6, a=6

        i = 5;
        a = 1++       ---------> a=i; i++;
        결과: i=6, a=5


[복합 치환 연산자]
- 복합 치환 연산자
   var op = 수식 (변수 연산자 = 수식)          <- var = var op 수식
     op: 산술연산자(+ - * / %), 비트연산자(11장)

- 예)  치환연산자 사용                      복합치환연산자 사용
         a = a + 2                                a += 2
         count = count - 1                    count -= 1
         sum = sum + j                         sum += j
         d = d / 12                               d /= 12
         n = n * (k+1)                           n *= k+1      .... 괄호 불필요

예) 다음과 같은 수열의 20항까지 출력, 20항까지의 합 출력
      1  2  4  7  11  16  ...

사용자 삽입 이미지

숙제 - 조교한테 E-mail로 낼 것

1. while 반복문을 사용하여 십진수를 입력하면 그것을 ASCII 값으로 하는 문자를 출력하는 프로그램을 작성하라. (단, 끝날때는 999를 입력한다고 하자.)

2. 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과 평균을 구하는 프로그램을 작성하라.

작성한 프로그램 파일 폴더 통째로 Zip 저장해서 일요일까지 제출

[do - while문]
- do=while문
  do
     문장                   ..... 조건에 관계없이 문장이 적어도 한번은 실행됨
  while (조건식)
;       ..... 세미콜론(;)으로 끝남에 주의

  do {
      문장;
      문장;
      ...
      } while (조건식);

- 예) 정상적인 메뉴 입력이 들어올 때까지 반복 입력
   do {
        printf("menu select (1-5): ");    /* 입력 안내문 */
        scanf("%d", &menu);              /* 문자 입력 */
   } while (menu < 1 }} menu > 5);
   printf("you choose menu %d\n", menu);


[중첩된 반복문] .. 반복문이 여러개 중첩
- 예) 다음과 같은 구구단 표 출력
  for (a = 2; a <= 9; a++) {
      for (b = 1; b <= 9; b++)
           printf("%dΧ%d = %2d   ", a, b, a*b);
      printf("\n");
  }

[p125 디버깅]
디버깅: error는 없는데 값이 이상할 경우, 어느 부분에서 잘못 되었는지 딱 집어서 확인해볼 수 있는 툴
=> 선언했던 변수가 어떤 값을 갖는지를 확인

== 프로그램 ==
#include <stdio.h>

void main()
{
 int a, inc, i, sum;
 
 sum = 0; a = 1; inc = 1;

 for(i=0; i <= 20; i++)
 {
  printf("%d   ", a);
  sum += a;
  a += inc;
  inc++;
 }

 printf("\n 수열 합 = %d\n", sum);
}

디버깅 할때에는 에러가 없어야 된다.

해당줄에 손을 클릭하면 왼쪽에 이 생긴다.

F5키를 누르면 디버그 모드로 들어가고,
F10키를 누르면 한 줄씩 내려가고,
왼쪽 하단 창을 내려보면 값을 볼 수 있다.
오른쪽 하단 창에 name에 변수를 넣으면 해당 변수의 값을 볼 수 있다.

뒤에 cmd창에 실행 값이 실시간으로 등장한다.

by Joe & Soohy 2007. 1. 2. 09:57

어제 이어서...
[난수 생성 함수]
- 난수 생성 함수
  함수를 호출할 때마다 임의의 숫자를 생성하여 반환하는 함수
  임의의 데이터를 필요로 할 때에 유용
- 난수생성함수 rand()
  #include <stdlib.h>
   ...
   i = rand();                       .... 0부터 RAND_MAX 사이의 임의의 정수 반환
                                             (RAND_MAX는 32767 또는 더 큰 정수로 디폴트)
   i = rand() % N + 1 .....  1부터 N사이의 정수 난수 생성
   d = (double)rand() / (RAND_MAX + 1)    ... 0과 1사이의 실수 난수 생성
- 난수생성 초기화 함수 srand()
   #include <stdlib.h>
   #include <time.h>
    ...
   srand(seed)       ..... 난수생성함수 seed 값 지정
   srand(time(NULL))  .... 현재시간을 seed 값으로 사용

   예제
   #include <stdio.h>
   #include <stdlib.h>
   #include <time.h>

   int main(void)
   {
      int a,b,c;
      double x,y,z;
     
      srand(time(NULL));

      a = rand();
      b = rand();
      c = rand();
      printf("%d %d %d\n", a,b,c);

      a = 1 + rand() % 100;
      b = 1 + rand() % 100;
      c = 1 + rand() % 100;
      printf("%d %d %d\n", a,b,c);

      x = (double)rand() / (RAND_MAX + 1);
      y = (double)rand() / (RAND_MAX + 1);
      z = (double)rand() / (RAND_MAX + 1);
      printf("%g %g %g\n", x,y,z);

      return 0;
    }
==== run ====
14478 16323 23275
91 49 35
0.501465 0.452911 0.260132
=============
※ 실행시킬때마다 늘 새로운 값이 나오는 것을 확인하였다.
=====================================================


4. 제어문: 인위적으로 프로그램을 내가 컨트롤 하겠다.
    선택문: if문, if-else문, switch문
    반복문: while문, for문, do-while문
    연산자: 관계 연산자와 논리 연산자, 증감 연산자, 복합치환연산자, 컴마연산자
    분기문: break, continue, goto

[문장과 실행 순서]
- 문장
   단문: 수식 한 줄 (한 줄의 소스코드, 명령문)
   제어문: 프로그램의 실행순서를 제어
   복합문: 단문들을 여러개로 묶은 단위. 문법적으로는 한 문장으로 취급({ }로 묶음)
- 문장의 실행순서
   기본적으로 순차적으로 수행 (위에서 아래로, 좌에서 우로)
   제어문을 사용하면 순차적인 흐름을 바꿀수도 있다. (선택실행 또는 반복실행 가능)

[if 문]
- if (조건식)  ....조건식이 참일때만
  문장               문장을 실행 (거짓일때는 문장을 생략하고 넘어감)

- 복합문을 사용한 if문 ....조건식이 단문이 아니라면 { }로 묶어서 복합문으로 사용
   if (조건식) {
   문장
   문장
    ...
   }

[관계 연산자]
- 조건식과 연산자
   조건식은 대개 값들의 비교로 이루어짐
   값의 비교에 관계 연산자논리 연산자가 주로 사용됨

- 관계 연산자
   연산자      의미                  예
   >             크다                  x > 100
   <             작다                  y < 0
   >=            크거나 같다       a >= b
   <=            작거나 같다       a <= 500.0
   ==            같다                  c == 'y'
   !=             같지 않다           c != EOF (cf. End of File)

[C언어에서의 참, 거짓]
- C언어에서의 참, 거짓
  nonzero 수식   -> 참
  zero 수식        -> 거짓
  ※ 0이면 거짓, 이외에는 무슨 값이든 참

- 관계 연산 수식의 값
   참이면 1
   거짓이면 0

   printf("%d %d \n", 100 > 50, 100 < 50);

- 조건식으로 임의의 수식을 사용할 수 있음
   1. if (a)                         .... a가 0이 아니면 (참이면)
      printf("nonzero\n");    .... 출력
   2. if (a = 5)                    .... 수식 a = 5 의 값은 5이므로 항상 참
      printf("a is five\n");    .... (잘못된 예: =는 ==으로 고쳐야 함)
   수정. if (a == 5)
      printf("a is five\n");

[논리 연산자]
- 논리 연산자
   연산자       의미
   &&            논리곱(AND) - 두 피연산자가 모두 참일 때 결과가 참이다.
   ||             논리합(OR) - 두 피연산자 중 한 개 이상이 참일 때 결과가 참이다.
    !              부정(NOT) - 피연산자의 참, 거짓 값의 반대 결과를 제공한다.

- 연산자 우선 순위 (외워라..)
   1. 괄호
   2. 단항연산자
   3. 곱셈, 나눗셈
   4. 덧셈, 뺄셈
   5. 관계연산자   >  >=  <  <=
   6. 동등연산자   ==  !=
   7. 논리곱         &&
   8. 논리합         ||
   9. 치환연산자

예제
  a가 0이상, 100미만이다.                      a>=0 && a<100
  a가 0미만이거나 100이상이다.              a<0 || a>=100
  x.y.z 중이서 x가 가장 작은 수이다.       z <= y && x <= z
  a와 b의 합이 c와 d의 차보다 작다         a + b < c - d

  if ( a >= 0 && a < 100)
  print("a is between 0 and 100\n");

예제2: 문자 c가 영문자가 아니면 에러메시지 출력
  if( ! ( c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') )
  printf("c is not alphabet\n");
      또는
  if( ! ( c >= 'A' && c <= 'Z') && ! (c >= 'a' && x <= 'z') )
  printf("c is not alphabet\n");

[논리 연산의 단축평가]
  나머지 수식의 결과에 관계없이 연산 결과를 알 수 있을 때에 나머지 수식의 평가를 하지 않는다.

   수식1 && 수식2    -> 수식1이 거짓이면 (수식2에 관계없이) 연산결과가 거짓
   수식1 || 수식2     -> 수식1이 참이면 (수식2에 관계없이) 연산 결과가 참

    if (a! = 0 && b / a >10)  --> a가 0이 아닐때만 b/a >10을 계산한다.

[if - else 문]
- if (조건식)
  문장1     .... 참일 때 수행
  else
  문장2     .... 거짓일 때 수행

- y를 x로 나눈 몫을 출력
  if(x==0)
     printf("0으로 나눌 수 없습니다.\n);
  else
     printf("몫 = %d\n", y/x);

[조건 연산자]
- 조건 연산자: ? :        .... 조건식이 참이냐?
   조건식 ? 수식1 : 수식2      .... 참이면 수식1 선택, 거짓이면 수식2 선택
   3항 연산자: 피연산자가 3개
   조건식: 참    -> 수식값 = 수식1
   조건식: 거짓 -> 수식값 = 수식2

- 두 수의 a, b의 최대값을 max에 저장
   1. max = (a > b)? a : b;
   2. (a>b)?(max = a) : (max = b);   .... 뒤의 두 관호는 반드시 필요함
   3. if (a > b)
         max = a;
       else
         max = b;
※ 조건식을 주고 if-else로 바꾸거나 반대인 경우 모두 할 수 있어야 한다.

예제: 연도를 입력 받아서 평년과 윤년을 판단하는 프로그램
       (윤년: 4로 나누어지고 100으로 나누어지지 않는 연도 / 400으로 나누어지는 연도)

#include <stdio.h>

int main(void)
{
   int year;
   int isleep;

   printf("연도는 ? ");
   scanf("%d",&year);
   isleep = (year%4==0 && year%100 !=0) || (year % 400 == 0);
   if(isleep)
      printf("%d년은 윤년입니다. \n", year);
   else
      printf("%d년은 평년입니다. \n", year);
}
=== run ===
연도는 ? 2006(enter)
2006년은 평년입니다.
===========
연도는 ? 2004(enter)
2004년은 윤년입니다.
===========

[중첩된 if문]
- 중첩된 if문
   if와 else의 목표문으로 if 또는 if-else문을 사용한 것

- 예) 변수 a, b의 부호에 따라서 다음 표와 같이 출력
   a       b       출력
   a>=0  b>=0  Group1
   a>=0  b<0    Group2
   a<0    b>=0  Group3
   a<0    b<0    Group4

   if (a >= 0) {
      if ( b >= 0) printf("Group1\n");
      else printf("Group2\n);
   } else {
      if ( b >= 0) printf("Group3\n");
      else printf("Group4\n");
   }

[중첩된 if문 - 다단계 if문]
- 다단계 if문
  if (조건식)
     문장1
  else if (조건식2)
     문장2
      ......
  else if (조건식n)
     문장n
  else
     문장 n+1

예제: 점수에 따른 등급 부여
        (A: 90점 이상, B: 80점 이상, C: 70점대, D: 60점대, F: 60점 미만)

int score    /*점수*/
int grade    /*등급*/
   ...
if(score >= 90) grade = 'A';
else if(score >= 80) grade = 'B';
else if(score >= 70) grade = 'C';
else if(score >= 60) grade = 'D';
else grade ='F';

프로그램으로 만들기
-------------------

#include <stdio.h>

int main(void)
{
 int score;
 char grade;

 printf("점수를 입력하시오 ex)최대값 100 :");
 scanf("%d",&score);

 if (score >= 90) grade = 'A';
 else if (score >= 80) grade = 'B';
 else if (score >= 70) grade = 'C';
 else if (score >= 60) grade = 'D';
 else grade = 'F';

 printf("당신의 학점은 %c 입니다.",grade);

 return 0;
}
=== run ===
점수를 입력하시오 ex) 최대값 100 :0(enter)
당신의 학점은 F 입니다.
===========

[switch 문]
- switch (정수식)   .... 정수식의 값에 따라 선택 실행
  {
      case 값1 : 문장1; ...
                      break;                .... break: switch문 종료 / break가 없으면 다음 문장 실행
      case 값2 : 문장2; ...
                      break;
            .....
      case 값n : 문장n; ...
                      break;
      default : 문장 n+1; ...
   }

   정수식 값에 해당하는 case의 문장부터 실행
   해당하는 case가 없으면 default의 문장부터 실행

예제: 점수에 따른 등급부여

switch(score / 10)
{
    case 10:                  ..... break가 없으므로 다음 문장을 실행
    case 9: grade = 'A'; break;
    case 8: grade = 'B'; break;
    case 7: grade = 'C'; break;
    case 6: grade = 'D'; break;
    default: grade = 'F';   ..... 밑에 아무것도 없기에 break를 안써도 됨
}
※ break를 하나도 안썼다면, 모든 학점은 F다.

프로그램으로 만들기
-------------------
#include <stdio.h>

int main(void)
{
 int score;
 char grade;

 printf("점수를 입력하세요 :");
 scanf("%d",&score);

 switch (score/10)
 {
 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';
 }

 printf("학점은 %c 입니다.\n", grade);
 return 0;
}
=== run ===
점수를 입력하세요 :79(enter)
학점은 C 입니다.
===========

더 배워보기

switch(ch)                  -> 문자로 지정하면..
{
    case 'A': .....           -> '  ' 붙여야 인식
    case 'B': .....
}

예제: 소득에 따른 세금 계산

사용자 삽입 이미지



실습시간
문제 1
 
srand 함수와 time 함수를 사용하여 rand함수의 seed 값을 지정하고 1에서 10사이의 정수 난수 5개를 생성하여 출력하는 프로그램을 작성하시오. 프로그램을 여러 실행하여 결과를 비교해 보시오


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 int a,b,c,d,e;

 srand(time(NULL));

 a = 1 + rand()%10;
 b = 1 + rand()%10;
 c = 1 + rand()%10;
 d = 1 + rand()%10;
 e = 1 + rand()%10;

 printf("%d %d %d %d %d", a,b,c,d,e);

 return 0;
}

사용자 삽입 이미지

#include <stdio.h>
#include <math.h>

int main(void)
{
 int a,b,c,d;
 double x,y,z;

 printf("계수 a를 입력하세요(단, a는 0이 아님) :");
 scanf("%d",&a);
 printf("계수 b를 입력하세요 :");
 scanf("%d",&b);
 printf("계수 c를 입력하세요 :");
 scanf("%d",&c);

 d=b*b-4*a*c;

  if(d>0)
  {
   x=(-b+sqrt(d))/(2*a);
   y=(-b-sqrt(d))/(2*a);
   printf("근은 %f와 %f 이다.",x,y);
  }
  else if(d<0)
  {
   x=-(b/(2*a));
   z=+(sqrt(-d)/(2*a));
   y=-(b/(2*a));
   printf("근은 %f+%fi와 %f-%fi이다.", x,z,y,z);
  }
  else
  {
   y=-b/(2*a);
   x=y;
   printf("근 x와 y는 각각 %f, %f 이다.", x,y);
  }
 return 0;
}

by Joe & Soohy 2006. 12. 29. 09:52

입출력문과 라이브러리 함수

[라이브러리 함수]
- 라이브러리: 미리 작성된 함수들을 모아놓은 것
- ANCI-C에서는 : C언어 문법 + 표준 라이브러리 함수를 정의
- 표준 라이브러리 함수의 종류
   입출력 함수     ->    #include <stdio.h>
   수학 함수        ->    #include <math.h>
   문자열 및 문자함수   .... 문자를 복사시키고...뭐 기타등등 #include <string.h>
   동적 메모리 관리 함수 .... 필요한 양의 메모리를 동적으로 할당 ...#include <mem.h>
   기타 함수

[출력함수 printf()]
#include <stdio.h>
main()
{
     int a = 10;
     float x = 5.5;
     printf("a is %d and x is %f. \n, a, x);
}

- 제어문자열
  1. 출력할 문자열
  2. 출력 인수에 대한 형식 지정자

[출력함수 형식 지정자]
- 정수 형식 지정자
   형식지정자            출력 형식                                            출력 예
   %d                      10진수(부호있는 정수)                           -32536
   %u                      10진수(부호없는 정수)                            33000                ....int unsigned x;
   %o                      8진수                                                   100350               .... 옥탈 -> o
   %x                      16진수(소문자 a~f 사용)                         12fe                   .... heXa decimal -> x
   %X                      16진수(대문자 A~F 사용)                       12FE
   %ld                      long 자료형                                                                 .... long d
   %hd                     short 자료형                                                                .... short d
   ※ int가 32비트인 겨우에 short 자료형은 %hd, %hu를 사용함

- 실수형식 지정자
   형식지정자            출력 형식                                            출력 예
   %f                       보통의 실수 표기(지수없음)                    123.456000     ....float, double 출력
   %e                      과학용 표기 (소문자 e사용)                    1.23456e+02
   %E                      과학용 표기 (대문자 E사용)                    1.23456E+02
   %g                      %e와 %f 중 더 짧은 표기
   %G                      %E와 %f 중 더 짧은 표기

-  문자/문자열 형식 지정자
   형식지정자            출력 형식                                            출력 예
   %c                      문자                                                    a                   .... character
   %s                      문자열                                                 korea             .... string
   %%                     문자 %를 출력                                      %

사용자 삽입 이미지

1번
#include <stdio.h>

main()
{
 printf("%o %x\n", 500, 500);
}
===결과값===
764 1f4
============

2번
#include <stdio.h>
main()
{
 double r = 123.45678;
 double s = 12340000.0;
 printf("%f %e %g\n", r,r,r);
 printf("%f %e %g\n", s,s,s);
}
====결과값====
123.456780 1.2345678e+002 123.457
12340000.000000 1.234000e+007 1.234e+007
==============

3번
#include <stdio.h>
main()
{
 printf("%s and 100%%","C language");
}
=== 결과값 ===
C language and 100%
==============

4번
#include <stdio.h>
main()
{
 char c = 'A';
 printf("%c의 코드: 10진수 %d, 8진수 %o, 16진수 %x", c,c,c);
}
===결과값===
A의 코드: 10진수 65, 8진수 101, 16진수 241fe4
============

연습문제1
다음 두 출력문의 결과값을 비교하시오.
printf("%c %d \n", 'c','c');
printf("%c %d \n", 67, 67);
------------------
#include <stdio.h>
main()
{
 printf("%c %d \n", 'C','C');
 printf("%c %d \n", 67, 67);
}
====결과값====
C 67
C 67
==============

[입력함수 scanf()]
#include <stdio.h>
main()
{
      int a;
      float f;
      scanf("%d %f", &a, &f);                /* 입력 */
      printf("%d %f \n", a, f);               /* 입력 변수를 출력 */
}

[입력함수 형식 지정자]
- scanf() 형식 지정자
   형식지정자            입력자료형                   입력 형식                        출력 예
   %d                      정수                             10진수                           -123
   %u                      부호없는 정수                10진수                            30000
   %o                      부호없는 정수                8진수                             644
   %x                      부호없는 정수                16진수                            5f5a, 5F5A
   %ld                     long 자료형
   %hd                    double 자료형
   %f, %e                실수(float)                     임의의 실수 표기              1.23, 3.1e-2
  %lf, %le          실수(double)            임의의 실수 표기
   %c                      문자
   %s                      문자열

[라인버퍼 방식 입력]
- 라인버퍼 방식 입력
   키보드에서 [Enter]가 입력될때에 줄 단위로 버퍼에 저장됨
   scanf()함수는 버퍼에서 입력받음
   입력 12   3.4[enter]  567  a[enter]
   버퍼 12  3.4 \n 567 a \n
   scanf(   .......   )     .... 4개를 입력주면 12 3.4 567 a 가 인풋으로 들어가지만, 2개를 입력주면 12 3.4만 인풋. 나머지는 소멸된다.

 - 예제
   1. 형식지정자 사이에 공백이 없어도 무방(숫자만 해당)
       scanf("%d%f%lf", &i, &f, &d);    ....문제는 없으나..
       scanf("%d %f %lf", &i, &f, &d);  ....권장함
   2. (예외) 문자입력              .....입력 a b 인 경우에
       scanf("%c %c, &x, &y);  .....x = 'a', y = 'b' 입력
       scanf("%c%c, &x, &y);  ..... x = 'a', y = ' ' 입력
   3. 제어문자열에 특별한 경우가 아니면 다른 문자 사용하지 않음
       scanf("%d\n",&a); (x)     ....잘못된 예
       scanf("%d : %f", &i, &f);   .... 정수와 실수 사이에 입력    ex) 5 : 12.2 --> 키보드로 입력을 똑같이 해줘라.

[문자 입출력]
- 문자입출력
   getchar()       한 문자를 입력하여 반환
   putchar(ch)   문자 ch를 출력

   char ch;            ....... int ch;를 사용하는 것이 더 일반적임
   ch = getchar();   ....... 라인 버퍼 방식 입력 사용
   putchar(ch);

- getche() 함수   ... 표준 함수가 아니고 일부 PC용 컴파일러 함수
   PC용 컴파일러에서 제공하는 함수
   문자를 입력한 즉시 프로그램에 입력 됨    ....getchar는 입력을 받으면 라인버퍼안에 저장이 되고 이를 뽑아오는 것이고, getche는 입력을 하는 즉시 반영되고 명령어의 역할은 끝이 난다.
   #include <conio.h>
   ....
   ch = getche();     ....즉시입력, 버퍼를 거치지 않는다.

연습문제2
(1) 다음 프로그램을 키보드 입력: ab, abcd, a에 대해 실행해 보시오.
#include <stdio.h>
main()
{
 int c;
 c=getchar();
 putchar(c);
 c=getchar();
 putchar(c);
}
== 결과값 ==
ab[enter]
ab
============
abcd[enter]
ab
============
a[enter]
a
============
a b[enter]
a
============

<getche 써보기>
#include <conio.h>
main()
{
 int c;
 c=getche();
}
=== 결과 ===
c[enter] 하는 순간,
cPress any key to continue ...라고 나온다
============

<같이 써보기>
#include <conio.h>
#include <stdio.h>

main()
{
 int c;
 c=getche();
 putchar(c);
}
== 결과 ==
c[enter] 하는 순간,
ccPress any key to continue ...라고 나온다
==========

[표준입출력 방향 전환] ...파일로 입력하고 파일에다 출력 (텍스트 파일: .txt)
- 표준입출력의 방향전환(redirection)
   표준 입력과 표준 출력 장치를 변경하는 것
       표준입력 방향전환: 표준입력을 키보드 대신에 파일로 변경
       표준출력 방향전환: 포준출력을 화면 대신에 파일로 변경
   DOS 또는 UNIX/Linux에서 제공되는 기능
       C> program < infine            ..... 표준입력 방향전환(infile)
       C> program > outline          ..... 표준출력 방향전환(outfile)
       C> program < infile >outfile  ..... 표준입출력 방향전환(infile, outfile)
- 방향전환 기능을 사용하면
  파일에 저장된 내용으로부터 입력을 받고
  출력을 파일에 저장할 수 있음

※ 실행파일 저장되는 장소: project > settings > debug 탭

사용자 삽입 이미지

#include <stdio.h>
main()
{
 int x, y, z;     
 scanf("%d %d %d", &x, &y, &z);
 printf("Sum is %d\n", x + y + z);
}

사용자 삽입 이미지

사용자 삽입 이미지

[수학용 라이브러리 함수]
- 수학 라이브러리 함수
   #include <math.h>

   삼각함수:                 sin(x), cos(x), tan(x)
   역삼각함수:              asin(x), acos(x), atan(x), atan2(y.x)
   쌍곡선함수:              sinh(x), cosh(x), tanh(x)
   지수/로그함수:         exp(x), log(x), log10(x), pow(x,y)
   기타함수:                 fabs(x), sqrt(x), ceil(x), floor(x), fmod(x,y)
                                 x를 넘는 가장 큰 정수(ceil), x를 넘지 않는 가장 큰 정수(floor), fmod(실수에 대한 나머지 연산 가능), 루트(sqrt)
   대부분의 수학 함수는 double 자료형을 사용함. (output이 double이다!!)
   삼각함수의 각도는 radian 단위

   scanf에서 %lf을 써도 printf에서는 %f를 쓴다!

[난수 생성 함수]
- 난수(random number) 생성 함수
   함수를 호출할 때마다 임의의 숫자를 생성하여 반환하는 함수
   임의의 데이터를 필요로 할 때에 유용
- 난수생성함수 rand()
   #include <stdlib.h>
   i = rand();                 .... 0부터 RAND_MAX사이의 임의의 정수 반환 (RAND_MAX는 32767또는 더 큰 정수로 정의)
   i = rand() % N + 1      .... 1부터 N사이의 정수 난수 생성
   d = (double)rand() / (RAND_MAX + 1)     .... 0과 1사이의 실수 난수 생성

- 난수생성 초기화 함수 srand()    .... 계속 다른 숫자로 만들어주기 위해...
  #include <stdlib.h>
  #include <time.h>
  srand(seed)       ..... 난수생성함수 seed값 지정
  srand(time(NULL)) ... 현재시간을 seed 값으로 사용

사용자 삽입 이미지
1번
#include <stdio.h>

main()
{
 int a, b, c, d, e;
 printf("년월일시를 입력해주세요. ex)2006/12/25 10:10\n");
 scanf("%d/%d/%d %d:%d",&a,&b,&c,&d,&e);
 printf("%d년 %d월 %d일 %d시 %d분", a,b,c,d,e);

}


2번
#include <stdio.h>
#include <math.h>

int main(void)
{
 int a,b,c,d;
 double e;
 
 printf("좌표1을 입력하세요 ex) (2,2)일경우 2,2로 입력 : ",a,b);
 scanf("%d,%d",&a,&b);
 
 printf("좌표2을 입력하세요 ex) (2,2)일경우 2,2로 입력 : ",c,d);
 scanf("%d,%d",&c,&d);

 e=sqrt(pow((a-c),2)+pow((b-d),2));
 printf("두 좌표간의 거리는 %f 입니다.\n",e);
 return 0;
}

3번
#include <stdio.h>
#include <math.h>

int main(void)
{
 float p,q;
 int y;

 printf("연산자 p의 값을 입력하세요 :");
 scanf("%f",&p);
 printf("연산자 q의 값을 입력하세요 :");
 scanf("%f",&q);

 y = floor(p)+ceil(q-1);
 printf("결과는 %d 입니다.",y);
 return 0;
}


by Joe & Soohy 2006. 12. 28. 09:57

2장 C언어의 기초

[식별자]
- 식별자 : 변수, 함수, 상수와 같은 프로그램 구성 요소의 이름
- 식별자 생성규칙
   규칙: 영문자, 숫자, 밑줄문자로 구성, 숫자로 시작하지 않음
   옮은 예: sum, x2000, tax_rate1, Table
   잘못된 예: 4th(숫자로 시작안됨), "x"("로 시작), tax-rate(-안됨), id@host(@안됨)
- ANSI 표준은 31자까지 구별, 일부 컴파일러는 8자까지 구별
   tax_rate1과 tax_rate2는 일부 컴파일러에서는 같은 식별자로 인식(9자라서 뒤에 숫자부분은 짤림)
- 권장사항
   의미를 알 수 있게 부여할 것
   두 단어를 결합한 식별자는 밑줄문자 또는 대문자로 구분함

[예약어]
- 예약어: C언어에서 특별한 용도로 미리 예약된 이름, 키워드, 식별자로 사용 불가능
- 예약어의 예
   자료형: char short int long unsigned float double struct union typedef enum void const signed
   제어문: if else switch case default for while do break continue goto return
   기억장소: auto register static extern volatile
   연산자: sizeof
- 일부 컴파일러에서 사용하는 예약어
  ada, fortran pascal asm
  entry near far huge

[자료형]
- 자료형: 정수, 실수, 문자
   cf) 정수 1과 실수 1의 컴퓨터 내부 표현은 다르다. 문자는 컴퓨터 내부에서 정수로 표현된다.
- C언어의 기본 자료형
  int         정수
  char      문자
  float      실수(보통 정밀도) - 4byte - 32bit
  double  실수(2배 정밀도)   - 8byte - 64bit
  ex) double x;    ... 64bit까지 표현 가능한 실수로 표현
        char c;      .... 문자 변수

[자료형의 표현범위]
- int 자료형
  컴퓨터와 컴파일러에 따라서 16bit 또는 32bit로 표현됨 (우리가 쓰는 컴퓨터는 보통 32bit이다)
  16bit 정수: -32,768(2^15) ~ 32,767(2^15-1)
  32bit 정수: -2,147,483,648(2^31) ~ 2,147,483,647(2^31-1)
- float, double 자료형(실수 표현)
                                 유효숫자        지수범위                   ※ 유효숫자 x 10^지수
  float(32-bit 실수)          6자리          -38 ~ 38
  double(64-bit 실수)      15자리         -308 ~ 308
-char 자료형 (책 409p - ASCII Code; 대문자 A: 65, 소문자 a: 97)
  문자는 8-bit 표기   cf)한글은 16bit
  char 자료형은 8bit 정수 표기에 사용가능
  8 bit 정수: -128 ~ 127

[자료형 수정자]
- 자료형 수정자(modifier)
  자료형 앞에 붙여서 자료형의 표현 범위를 변경
  long int                 긴 정수(32-bit)    ...20년전 컴파일러에는 유용. 16bit 컴퓨터에서 표현이 안되면...
  short int                짧은 정수(16-bit) ... 요즘 컴퓨터는 디폴드가 32bit이기 때문에 적은 자료형 표현에 good
  unsigned int          부호 없는 정수 -> 양수의 표현 범위 2배 증가
  unsigned long int   부호 없는 긴 정수(32-bit)
  unsigned short int  부호 없는 짧은 정수(16-bit)

  자료형 수정자와 함께 사용하는 int는 생략 가능
  long int a;   =   long a;
- unsigned 정수의 표현 범위
  16bit unsigned
  32bit unsigned

사용자 삽입 이미지
연습문제1
현재 자신의 PC가 지원하는 int, char, long, short, float, double 자료형의 크기가 몇 바이트인지 확인해보는 프로그래밍을 해보시오
hint.: sigeof() 함수를 이용하시오

#include <stdio.h>

int main(void)
{
 printf("Size of int is %d \n",sizeof(int));
 printf("Size of char is %d \n",sizeof(char));
 printf("Size of long is %d \n",sizeof(long));
 printf("Size of short is %d \n",sizeof(short));
 printf("Size of float is %d \n",sizeof(float));
 printf("Size of double is %d \n",sizeof(double));
 return 0;
}

====== 결과 값 ======
Size of int is 4
Size of char is 1
Size of long is 4
Size of short is 2
Size of float is 4
Size of double is 8
Press any key to continue
====================

[상수]
- 상수(constant): 편하지 않는 명시적인 자료
- 정수상수: 12   056(8진수)   0x4f(16진수)
- 실수상수: 3.14   1.0    1.5e5
- 문자상수: 'A'    '1'(문자 1이 되면 ASCII값을 같는다)    '\n'    '@'    '한'(한글은 2byte라서 쓰면 안된다)
- 문자열상수: "Korea"    "대한민국"    "한"
   cf) 컴파일러가 "KOREA"를 저장할때  'K''O''R'"E''A''\0' 이렇게 들어간다.

[정수 상수]
- 정수 상수
  10진수: 1~9로 시작하여 표현
  8진수: 0으로 시작하여 표현
  16진수: 0x 또는 0X로 시작하여 표현
  정수 상수는 기본적으로 int형으로 표현됨
  정수 상수가 int형 표현 범위를 넘어서면 컴파일러 판단에 의해서 unsigned 또는 long 형으로 표현됨
- 정수형 지정 접미사 U,L
   1234           int형 정수
   1234L         long형 정수
   40000U       unsigned형 정수
   40000UL     unsigned long형 정수

[실수 상수]
- 실수 상수
   소수점을 포함한 숫자
   3.14
   1.0    =   1.
   0.12   =    .12
  
   과학용 표기법
   6.2e3(=6.2x10^3)  =   6.2E3
   4e-2(=4x10^-2)
 
   실수 상수는 기본적으로 double형으로 표현됨

- float형 지정 접미사 F
   6.2       .....double형 실수
   6.2F     ..... float형 실수

[문자 상수]☆★
- 문자상수: 영문자, 숫자, 특수문자를 작은 따옴표('  ')로 묶어서 표시
- ASCII코드
  문자에 대응되는 정수값을 정한 미국 표준 코드
  ASCII코드는 8-bit 정수로 표현
  ASCII코드의 순서는 숫자와 알파벳 순서와 같음
  '0'과 0은 다르다.    '0'은 정수 48과 같음

연습문제2
하나의 문자를 입력받아 그 문자의 ASCII 코드를 출력하는 프로그램을 작성해 보시오.
hint: scanf()를 이용하여 문자를 입력 받으시오

#include <stdio.h>

int main(void)
{
 char ch;
 printf("ASCII코드로 변환할 문자를 입력해주세요 : ");
 scanf("%c",&ch);
 printf("%c의 ASCII 코드는 %d 이다.\n",ch,ch);
 return 0;
}

======= 결과 값 ========
ASCII코드로 변환할 문자를 입력해주세요 : a
a의 ASCII 코드는 97이다.
Press any key to continue
=======================

[백슬래시 코드]
- 백슬래시 코드 (탈출순서 표시)
  제어용 문자와 문자 표현에 특수한 용도로 사용되는 문자는 backslash(\)와 함께 나타냄   ex)'\n' '\t'
  컴퓨터 내부적으로는 한 문자로 표현됨
- 화면에 출력되지 않는 제어용 문자
  \n      new line: 개행문자(다음줄로)
  \r       줄 처음으로
  \t       tab
  \b      backspace
  \0      null문자(정수 0에 대응되는 문자)
- C언어에서 특수한 용도로 사용되는 문자
  \"      큰 따옴표"
  \'      작은 따옴표'
  \\    backslash \
- 8, 16진수 코드값 표기
  \101  8진수 코드로 표현된 문자(10진수 65 'A')
  \x42  16진수 코드로 표현된 문자(10진수 66 'B')

연습문제3
백슬래쉬 코드와 printf()함수를 이용하여 Mr Kim said " a \ is a backslach."를 출력하는 프로그래밍을 해보시오.

#include <stdio.h>

int main(void)
{
 printf("Mr Kim said \" a \\ is a backslash.\"\n");
 return 0;
}
======= 결과 값 =======
Mr Kim said " a \ is a backslach."
Press any key to continue
======================

[문자열 상수]
- 문자열 상수: 연속된 문자들은 큰 따옴표로("  ")로 묶어서 표시
   ex) "Korea"
- 문자열의 표현: 문자열은 컴퓨터 내부에서 null 문자로 끝나는 연속적인 문자들로 표현
   ex) "Korea" -> 'K''o''r''e''a''\0'
- 주의사항
   "a"는 'a''\0'으로 구성되므로 'a'와 같지 않음
   null 문자열 ""은 '\0'만으로 구성되는 문자열임

[기호 상수]
- 기호상수
  상수에 부여한 이름
  #define을 사용하여 기호상수 정의
  여러 번 사용하는 상수나 값이 바뀔 수 있는 상수에 대해서 유용함

[변수] : 메모리 할당이다!
- 값을 저장할 수 있는, 이름이 부여된 기억장소
- 변수의 선언
   변수를 사용하기 전에 반드시 변수의 자료형을 선언해야 함.
   int p;
   float a, b, c;    ..... 여러 개의 같은 자료형의 변수 선언
   변수를 선언하면 변수의 메모리 공간이 확보됨
   변수 선언 위치: 함수의 시작 부분(다른 위치는 나중에 다룸)
   int main(void)
   {
       변수선언
       프로그램 실행문
    }
   (cf) C++ 언어에서는 변수를 사용하기 전에만 변수 선언을 하면 됨

[변수의 초기화]
- 변수는 초기값을 지정한 다음에 사용해야 함
   int a;
   ...
   b = a;  (X) .... a의 값이 정의되지 않았으므로 잘못

- 실행문에서 초기화
   int a;
   ...
   a = 25;

- 변수의 초기화 선언
   int a = 25;
   float data, sum = 0.0, average;     ...sum만 초기화(권장하지 않음: data와 average에 대한 초기화를 안하고 까먹을 수도 있다.)

[주석]
- 주석(comment)
   /* 코딩과는 관련없고 개발자가 이해하기 쉽도록 남기는 글 */    ..../*   */로 둘러쌓인 부분
   설명문으로서 컴파일러에 의해서 무시됨
   프로그램 저작권, 수정이력, 동작 설명 등의 문서화 용도로 사용
   ex)
   /* hello.c
   * 내용: 자료를 순서대로 나열한다.
   * ver 0.0: 03/6/10 작성자: 홍길동
   */
   int sum;    /* 자료들의 합 */
   int max;    /* 최대값 */
- C++ 주석
  // C++ comment                     ...// 부터 시작하여 줄 끝까지가 주석
  ex) int sum;    //자료들의 합

[수식]
- 수식: 상수, 변수, 함수 호출 또는 이들과 연산자와의 조합
  10          ... 상수
  x            ... 변수
  sin(x)     ... 함수호출     -> x는 라디안 값.  적용전에 #include <math.h>(?)를 헤더에 넣어야 함
  x + 10*y  ...  이들과 연산자와의 조합
- 수식의 값
  대부분의 수식은 값을 가짐, (예외) 반환 값이 없는 함수 호출
  수식의 연산들은 정해진 순서대로 수행하며 수식의 최종 연산 결과가 수식의 값이 됨

[치환문]
- 치환문
   c = a + 10;        ... 오른쪽 수식의 값을 왼쪽 변수에 저장  ('='이 중요)
- 치환 연산자 '='
   C언어에서는 =도 연산자로 취급
   =을 치환연산자 또는 배정 연산자라고 함
   =는 수학적 등호가 아님
   k = 5;
   k = k+1;      .....k에 6이 저장됨
- 치환 수식
   치환 수식: 치환 연산자를 포함한 수식
   왼쪽 변수에 저장되는 값이 치환 수식의 값이다.
   k = 10 + 5;    .....k 값에 15가 저장됨

[연산자]
- 연산자
   변수, 상수, 함수 호출 값(피연산자: 연산의 대상)에 대해서 연산을 수행하여 결과를 제공
   연산은 기본적으로 같은 자료형에 대해서 수행함
       정수들 간의 연산 결과 --> 정수
       실수들 간의 연산 결과 --> 실수
- 산술연산자
   + 덧셈
   - 뺄셈
   * 곱셈
   / 나눗셈        ..... 11/4 = 2         11.0/4.0 = 2.75
   % 나머지       ..... 11%4 = 3
   나머지 연산은 정수에 대해서만 사용 가능

[연산 우선순위와 결합성]
- 연산 우선 순위
  수식에 두 종류 이상의 연산자가 포함되어 있을 때에 연산을 평가하는 순서
   ex) a + b * c  ....b * c 우선 계산
- 결합성
   같은 우선 순위의 연산자에 대한 연산 실행 순서
   좌결합성: 앞(왼쪽)에서 부터              ....a+b-c  -> (a+b)-c
   우결합성: 뒤(오른쪽)에서 부터           .... a = b = c ->a = (b = c)
주요 연산자의 우선순위와 결합성
우선순위    연산자     결합성
     1          괄호()      좌
     2           단항 -        우
     3          * / %       좌
     4           +  -         좌
     5             =             우

[여러가지 수식과 다중 치환문]
pow(a,b) = a^b
- (예) 수학식에 대한 C언어 수식
    b^2-4ac ------> b*b-4.0*a*c
    2x + 1/2 y - 1/z^2  ----> 2.0*x + y/2.0 - 1.0 / (z*z)
- 다중치환문
   x = y = 5     ---> y= 5  ---> x = 5  ---> x, y에 5 저장

[자료형 변환]
- 자료형 자동 변환
   1.0 + 2 -> 1.0 + 2.0 = 3.0     ..... 자료형을 같도록 한 후에 연산 수행
- 수식에서의 자료형 변환
   먼저 작은 정수는 보통 정수로 형 변환
   char, short                               -> int
   unsigned char, unsignedshort    -> unsigned
- 이항 연산의 피연산자는 둘 중 큰 자료형으로 변한됨
   int < unsugned < long < unsigned long < float < double
   ex) s/i+f /d -> i / i + f /d = i+f/d ->i + d/d = i+d -> d+d=d  ====> 결과치가 double로 나온다.
        (s: short, i: int, f:float, d:double)

사용자 삽입 이미지


[형 변환 연산자]
- 수식의 값의 자료형을 명시적으로 변환하는 연산자
   (double)num
   (double)(a+b*c)
- 형 변환 연산자(type)은 단항연산자 우선순위
   (double) a/4 -> ((double)a) /4     ....형 변환 후 나눗셈
   (double)(a/4)                             .... 나눗셈 후 형 변환


사용자 삽입 이미지
1번
#include <stdio.h>
int main(void)
{
 float a,b;
 printf("C = 5/9*(F-32)\n");
 printf("화씨 온도를 입력하세요 : ");
 scanf("%f",&a);
 b = 5.0/9.0*(a-32);
 printf("환산된 섭씨 온도는 %f 입니다. \n",b);
 return 0;
}

2번
#include <stdio.h>
int main(void)
{
 int a,b,c;
 printf("분(minute)을 입력하시오 :");
 scanf("%d",&a);
 b=a/60;
 c=a%60;
 printf("%d분은 %d시간 %d분 입니다.\n",a,b,c);
 return 0;
}

3번
#include <stdio.h>
int main(void)
{
 float a,b,c,d;
 printf("이제부터 실수 a,b,c에 대한 합을 계산합니다.\n");
 printf("먼저 a의 값을 입력해주세요.");
 scanf("%f",&a);
 printf("다음으로 b의 값을 입력해주세요.");
 scanf("%f",&b);
 printf("마지막으로 c의 값을 입력해주세요.");
 scanf("%f",&c);
 d=a+b+c;
 printf("입력하신 실수 %f, %f, %f의 합은 %f입니다.\n",a,b,c,d);
 return 0;
}

by Joe & Soohy 2006. 12. 27. 09:39

교재: C언어 프로그래밍
출판사: 홍를과학출판사
평가기준: 시험 35%, 실습 10%, 출석 5% (중간까지 - 5장까지, max 6장)
강의자료: http://viscom.yonsei.ac.kr/zeroboard/zboard.php?id=lect_6_comp
조교: 최종훈(창조관 252호 / 760-2293/ 공1육-9팔팔7-73오6/ cjhun78@empal.com)

C언어의 장점: 하드웨어를 컨트롤 할 수 있다.

1장. C언어 소개
[C언어 역사]
B언어를 계승하는 언어, 그래서 C언어다.
AT&T의 장비 분사회사: 루슨트 테크놀리지

K&R C언어: 호환성의 문제 발생 > ANSI C언어

[C언어 특징]
이식성: OS가 바뀌어도 소스코드 수정이 필요없음
간결함: 동일한 명령을 소스코드로 작성해도 타 언어보다 간결하고 강력하다
모듈성: 함수를 통한 모듈화가 가능하다 - 많은 사람들이 함께 소스코드르 짜는 것이 가능해졌다.
효율적: low level 프로세싱 가능
작은언어: 적은 수의 키워드를 정의(키워드: C언어에서 고유하게 쓰이는 명형어)
포인터: 메모리를 직접 제어가능(메모리의 중요성 - 데이터를 저장할 수 있는 기본적인 공간이 메모리)
컴파일형 언어: 바이너리 코드 생성 가능(인간이 이해하는 언어(C언어) -> 컴퓨터가 이해하는 언어(바이너리))
cf. 인터프리터 언어: 해석기 -> 해석해서 출력해 줌 : 속도가 느림   ex) 베이직

[간단한 C 프로그램]
#include <stdio.h>    ..... 표준 입출력용 header 파일  (많이 쓰는 함수가 정의)

main()  ...... 반드시 포함
{     .... 프로그램 본체는 {}내에 작성
    printf("Programming in C is easy. \n";  ......출력문
}

- 대소문자 구분
- \n : 개행문자(new line)
- 문장 끝은 semicolon(;)으로 종료
- printf("....")는  출력을 위해서 미리 작성된 프로그램으로서 library 함수라고 함

[C프로그램 개발 과정]
프로그램 개발 과정
텍스트 편집기 -> 원시파일(.c) -> 컴파일러 -> 목적파일(.obj) --- +라이브러리 -->링커 -> 실행파일(.exe)

프로그램 실행
입력 -> 실행파일 -> 출력

[프로그램 작성 및 실행]
프로그램 개발 도구
- 명령어 방식: 개별 명령어를 사용하여 각 단계 수행
                                   DOS                       UNIX
      편집                   edit start.c               % vi start.c
      컴파일&링크        bcc start.c               % cc start.c
      실행                   start                        % a.out

- 통합 개발 환경
      한 프로그램에서 편집, 컴파일, 링크, 실행 기능을 모두 제공

[통합개발환경을 사용한 프로그램 개발]
Visual C++ 프로그램 실행

새 프로젝트 파일 생성
  - [File] - {New] 메뉴 선택
  - Project 탭에서 Win32 Console application 을 선택하고
    Project name: 어쩌구 저쩌구, Location: 프로젝트 생성될 디렉토리 ....그리고 OK 누르면 시작

C 소스코드 만드는 과정
   Files 탭에서 C++ source file을 선택하고
   어쩌구저쩌구 선택해서 file탭에 실행 파일명을 써주고 OK

프로그램 작성시 Ctrl + S를 눌러서 저장
bulid 버튼을 누르면 컴파일과 링킹이 같이 됨
run파일을 누르면 실행

컴파일 & 링크: 탄축키 F7
 0 error(s), 0 warning(s) 라고 나와야 실행이 가능

종료 [file] - [save all] 메뉴 선택


2장 C언어의 기초
[프로그램과 표준 입출력]
- 프로그램: 입력 -> 프로그램(처리) -> 출력
- 표준입출력(standard input and output: stdio)
   표준입력: 키보드 입력
   표준출력: 모니터 또는 터미널로 출력

[출력 프로그램]
int -> 함수의 자료형이 정수형이다.
int를 써주고 마지막에 return 0;을 써주지 않으면 warning이 뜬다.
main() = main(void)
\n -> new line, 즉 enter의 의미다.

[계산을 하는 프로그램]
#include <stdio.h>

int main(void)

{
 int x, y, z;
 x = 500; y=125;
 z = x+y;

 printf("Sum is %d",z);
 return 0;
}

[입력을 포함한 프로그램]
- 변수 값 입력
   scanf("%d", &a);  ....a = (정수입력)   ......베이직의 input = 값 입력의 기능이네~
   scanf("%f", &x); ......x = (실수 입력)  ......float(실수)는 4byte

------------------- &a 에 대해 ----------------
컴파일러 등이 a를 위해 잡아놓은 첫 번째 공간을 &a라고 한다
그 장소에 키보드로 입력받은 값을 &a가 있는 메모리 안에 저장하겠다
주소의 위치를 컴파일러에게 알려주기 위해 &가 붙는다.
----------------------------------------------
#include <stdio.h>

int main(void)

{
 float r,s;
 
 printf("원의 반지름을 입력하세요:");
 scanf("%f",&r);
 s = 3.14159*r*r;
 printf("원의 면적은 %f 입니다. \n",s);
 printf("원의 지름은 %f 입니다. \n",2*r);
 return 0;
}

======== 결과 값 ===========
원의 반지름을 입력하세요: 4
원의 면적은 50.265440 입니다.
원의 지름은 8.000000 입니다.
Press any key to continue
===========================

by Joe & Soohy 2006. 12. 26. 10:19
| 1 |