구)홈페이지 오탈자 보기
IT CookBook, C 프로그래밍 입문: 프로그래밍을 모국어처럼 유창하게

 

페이지오탈자 내용등록일
32

(p32. [그림1-3])

그림1-3]에서 링킹 후 실행파일을 의미하는 사각형 부분

hello.c
==>
그림1-3]에서 링킹 후 실행파일을 의미하는 사각형 부분

hello.exe

2006-10-251
56

((p56) 음영박스 3번째 줄)

잘된예               |  잘못된예
_total#Money  |  _totalMoney
==>
잘된예               |  잘못된예
_totalMoney     |  _total#Money

2006-10-251
82

(p82) [예제 2-10] 9행)

r2=2.1;
==>
r2=2.1f;

2006-10-251
82

(p82) [예제 2-10] 8행)

r1=3.14;
==>
r1=3.14f;

2006-10-251
82

(p81) [예제 2-9] 8행)

f=3.14;
==>
f=3.14f;

2006-10-251
102

(p102. 연습문제2 11행)

scanf("d", &sec);
==>
scanf("%d", &sec);

2006-10-251
102

((p102) 연습문제 2번 11, 16행)

11 행 : scanf("d",&sec); 
16 행 : printf("d seconds = %d minute %d sec.
", sec, min,left)
==>
11행: scanf("%d",&sec);
16행: printf("%d seconds = %d minute %d sec.
", sec, min,left)

2006-10-251
116

(p116. [그림3-1] for문의 동작과정)

1번과 2번의 화살표 방향이 잘못되어 있음
==>
1번과 2번 화살표 방향이 없어야 함

2006-10-251
117

(p117) [예제 3-5] 10행)

for (i=2; i<values/2; i++)
==>
for (i=2; i<=values/2; i++)

2006-10-251
128

((p.128) 예제 3-11)

<홀수 팩토리얼만 빼고 출력하기>
2,4,6,8,10의 팩토리얼 결과값이 제대로 나오지 않는다. i가 홀수인 경우는 11번째 줄의 if (i % 2 == 1) 에 의해서 건너뛰게 되더라도 factorial 값에는 곱해줘야 실제 반환값이 맞는 값이 나오게 됩니다.13번째 줄 i++; 이 나오기 전에 factorial *= i 라고 써줘야 맞습니다.
==>
08 ...
09 while(i<=limit)
10 {
11 factorial *=i;   <-17행의 factorial 계산을 11행으로 옮겨야함
12 if(i%2==1){
13 ....

2006-10-251
133

((p133) 연습문제 1번 소스 8행)

08  printf("3d[%x] = %c", i, i, i);
==>
08  printf("%3d[%x] = %c
", i, i, i);

2006-10-251
134

((p134) 연습문제 2번 8~9행)

08  printf("nExpression :");
09  scanf("i %c %", &v1, &op, &v2);
==>
08  printf("
Expression :");
09  scanf("%i %c %i", &v1, &op, &v2);

2006-10-251
149

(p149) 소스 코드 3행과 6행)

3행  intadd(int a int b) 
6행  returnn
==>
3행  int add(int a, int b)
6행  return

2006-10-251
164

((p.164) 첫번째 문단 5째줄)

다시 말해 스택 영역은 동적할당을 위한 기억 장소로 활용되고, 힙 영역은 정적할당을 위한 용도로 사용되는 공간이다. 

바로고침->
스택영역은 정적할당을 하기위한 기억장소이며, 힙영역에 비하여 공간이 작다. 그래서 재귀함수같은 경우를 잘못 사용할시에는 스택 오버플로우가 나기도 한다.
힙영역은 동적할당을 하기위한 기억장소이며, malloc 함수등을 사용하여 힙영역을 사용할수 있다. 

기억 클래스 쪽 부분좀 다시 검사해주셨으면 합니다. 
내용이 좀 애매모호 하네요..
==>
프로그램을 작성할 때 int a; float f; int b[30]; 과 같이 컴파일 시간(compile time)에 필요한 메모리의 양을 알려주는 할당을 정적 할당(Static Allocation)이라고 하며 일반적으로 해당 변수는 스택 영역에 위치한다. 스택영역은 이처럼 단순 정수 또는 실수형 변수와 같이 비교적 그 크기가 작은 변수를 할당하기 위해 사용되는 공간이다. 

반면, 동적 할당(Dynamic Allocation)은 정적 할당과는 달리 프로그램이 실행되는 중에(Run Time) 필요한 만큼의 메모리를 할당하는 기법으로 동적 할당된 변수는 힙 영역에 위치한다. 동적 할당의 예로, 특정 파일의 내용 전부를 버퍼에 읽어 들여야 하는 경우를 생각해 볼 수 있다. 이 경우 텍스트 파일의 크기에 따라 버퍼의 크기가 달라지므로 필요한 메모리 양을 프로그램 작성 시 결정할 수 없다. 
결국 이 같은 경우에는 동적할당 기법(malloc과 같은 동적할당 함수를 사용할 수 있다)에 의해 필요한 메모리를 할당받아야 하며 이렇게 할당된 메모리는 힙 영역에 위치하게 된다. 참고로, 일반적인 스택하나의 크기는 64K로 운영체제에 따라 다양한 크기를 갖는 힙(힙의 최대 크기는 요즘과 같은 32bit 머신에서는 2G까지도 가능하다)에 비해 상대적으로 작아서너무 많은 변수를 스택에 할당할 경우 스택 오버플로가 발생할 수 있다.

2006-10-251
189

(p.189) [예제 5-1] 11행)

avg=sum/3;
==>
avg=(float) sum/3.0f;

2006-10-251
190

([예제 5-2] 프로그램 작성&결과 오류)

sum 값을 초기화하지 않아 프로그램 결과값에 오류가 있습니다.

1) sum 값을 초기화하지 않았음 : 05 int i, sum;  
2) 실행 결과 오류 : total = 2326, average = 232.000000
==>
1) sum 값을 초기화함 : 05 int i, sum=0;  
2) 실행 결과 정정 : toal = 870, average = 87.000000

2006-10-251
190

(p.190) [예제 5-2] 5행과 11행)

5행 int i, sum;
11행 avg=sum/10;
==>
5행 int i, sum = 0;
11행 avg=(float) sum/10.0f;

2006-10-251
194

(p194. [그림5-2] 배열 원소의 참조)

배열의 첫째 원소를 가리키는 화살표 시작부분의 score가 score[0]로 잘못표시되어 있음

score[0]
==>
score

2006-10-251
216

((p216) [예제 5-6] 코드 1행)

01     nclude<stdio.h>
==>
01  #include<stdio.h>

2006-10-251
226

(p226) 소스박스 내 39행)

39 printf("%10s %10s %10d %10d %10d %10d₩"...);
==>
₩ -> 

2006-10-251
235

(p235) 위에서 9번째 줄)

[그림 6-2]를 다시 한번 살펴보자. 포인터 변수 p는 메모리 번지 0x1001에 할당되어 있으며, 비록 char형이기는 하지만 그 크기는 2바이트(0x1001~0x1002)다. p가 가리키는 곳을 따라가 보면
==>
[그림 6-2]를 다시 한번 살펴보자. 포인터 변수 pi는 메모리 번지 0x1001에 할당되어 있으며, 비록 char형이기는 하지만 그 크기는 2바이트(0x1001~0x1002)다. pi가 가리키는 곳을 따라가 보면

2006-10-251
238

((p 238) [그림 6-5] 예제)

int *pc;
==>
int *pi

2006-10-251
249

(p249) 4번째 줄)

다차원 배열은 포인터 수식은
==>
다차원 배열의 포인터 수식은

2006-10-251
260

(p260. [그림6-16])

그림 상단 부분이 약간 짤려져 있음
==>
그림 상단 부분이 약간 짤려져 있음

2006-10-251
289

(p289) [예제 7-1] 20행)

sd.avg=(float)(sd.kor+sd.eng+sd.math)/3;
==>
sd.avg=(float)(sd.kor+sd.eng+sd.math)/3.0f;

2006-10-251
291

(p291. [그림7-4] 구조체 변수가 포인터인 경우)

sd = &psd;
==>
psd = &sd;

2006-10-251
295

(p295) [예제 7-2] 23행)

p->avg=(float)(p->kor+p->eng+p->math)/3;
==>
p->avg=(float)(p->kor+p->eng+p->math)/3.0f;

2006-10-251
297

((p.297) 첫번째 문단 후 그림 7-6)

struct STUDENT {
   int no;
   char name[20];
   char sex, tel[15], major[30];
   struct SCORE {
      char date[20];
      int kor, eng, math;
      float avg;
   } 요기 공백인데 변수이름 score;가 빠진듯
} st 1 = ...............이하 생략
==>
누락된 score를 추가 합니다.

struct STUDENT {
  int no;
  char name[20];
  char sex, tel[15], major[30];
  struct SCORE {
  char date[20];
  int kor, eng, math;
  float avg;
  } score; 
} st 1 = ...............이하 생략

2006-10-251
326

(p326) [예제 8-2] 2~4행)

02 #define MAX_RATE  1.3
03 #define MID_RATE  1.2
04 #define MIN_RATE  1.1
==>
02 #define MAX_RATE  1.3f
03 #define MID_RATE  1.2f
04 #define MIN_RATE  1.1f

2006-10-251
341

((p.341) 박스 세번째칸 첫 줄)

#ifdef 매크로명 으로 되어 있는데,
#ifndef 매크로명이 맞음.
==>
ifdef -> ifndef

2006-10-251
342

((p.342) 두번째 문단 소스예제중)

메모리 사정에 따라 이후 예제

#if SYSTEM_EMEORY >= 512
    #define MAX_PROCESS 100
#elif SYSTEM_EMEORY <= 512 <--요부분 이상 그냥 < 512일듯
    #define MAX_PROCESS 50
#else
    #define MAX_PROCESS 10 <--else에 해당하는 부분이
                                                있나요???
#endif
.....이하 생략

예문 자체가 제가 이해를 못하겠는 512이면 어떻게 되는건지
크거나 작거나 그 이외인 else에 해당되는 경우가 있는지?
==>
다음과 같이 정정합니다.

#if SYSTEM_EMEORY >= 512
#define MAX_PROCESS 100
#elif SYSTEM_EMEORY < 512
#define MAX_PROCESS 50
#endif

2006-10-251
354

(p354. 연습문제 5번)

PRINT(i, j)
==>
PRINT(i * j)

2006-10-251
399

((p.399) 7번째 줄)

3. 서식화된 파일 입출력함수의 설명 첫 줄(399쪽의 7째 줄)에서
현재는 "fscanf()와 printf() 함수는 입출력 대상이...."라고 되어 있으나
여기서 printf()가 아니라 fprintf()여야 맞다.
==>
printf() -> fprintf()

2006-10-251
404

((p.404) 예제 9-11중 12line)

char name[20];
요 변수 사용이 안되는 듯
구조체 안에 이미 선언이 되어 있는데 
다시 또 선언을 ;;;
==>
선언만 해두고 사용 안하고 있는 변수이므로 삭제해도 됩니다.

2006-10-251
408

((p.408) 예제 9-12중 2 , 3Line)

함수 원형 선언
void add();
void search();
==>
int add();
int search();

2006-10-251
423

(p423. 연습문제 2번)

프로그램 조건이 누락
==>
[조건] 
-화면 디자인은 옆의 화면과 같아야 한다.
(1)은 학생 자료의 입력을 할 수 있도록 insert_student() 함수를 만들어 놓고 호출되게 해야 한다. 입력된 자료는 반드시 파일의 끝에 추가되어야 한다.

(2)는 저장된 학생 데이터를 수정하기 위한 것으로 update_student()를 호출해야 한다. 수정할 학생의 번호와 함께 입력된 데이터는 기존 자료를 갱신해야 한다.

(3)은 delete_student()를 호출하며 학번을 입력하면 학생데이터를 파일에서 삭제해야 한다.

(4)는 search_student()를 호출하고 학번을 입력하면 해당 학생의 데이터만 화면에 보여주어야 한다.

(5)는 list_all()을 호출하고 한 줄에 한 명씩 모든 학생의 데이터를 화면에 출력한다. 이때, 한 화면을 넘어갈 경우는 멈추었다가 아무 키나 누르면 계속 진행하도록 해야 한다.

(6)을 누르면 모든 작업을 끝내고 종료해야 한다.
학생 데이터 파일의 이름은 student.dat 로 한다.
최대 입력 가능한 학생의 수는 100명으로 가정한다.
주석은 최대한 자세하게 기록해야 한다.

2006-10-251
454

((p.454) 이진트리 코드)

1.
038 BINTREE *temp, *p 인데
038 BINTREE *p 로 바꿔야 하지 않을까요?

2.
120번째 줄부터
void in_order(BINTREE *tree)
{
if(tree != NULL){
post_order(tree->left);
printf(" %d ", tree->data);
post_order(tree->right);
}
}
이렇게 된것을 post -> in
void in_order(BINTREE *tree)
{
if(tree != NULL){
in_order(tree->left);
printf(" %d ", tree->data);
in_order(tree->right);
}
}
로 해야 하지 않을까요?
제 말이 맞다면 실행 결과 그림도 잘못 된것 같습니다.

Pre-order :  100  50  30  80  150  120  200  450
In-order :  30  80  50  100  120  450  200  150
Post-order :  30  80  50  120  450  200  150  100
200 is exist...

880 is not exist...

3.
131 BINTREE *mytree, data; 을
131 BINTREE *mytree;  로 해야하지 않을까요?
==>
[답변]
1. *temp는 선언만 해두고 사용하지 않으니까 지우는게 좋겠습니다.

2. in_order() 함수 내의 post_order()를 in_order()로 바꾸고 결과도 아래와 같이 정정합니다.

<수정후>
Pre-order :  100  50  30  80  150  120  200  450
In-order :  30  50  80  100  120  150  200  450
Post-order :  30  80  50  120  450  200  150  100
200 is exist...

880 is not exist...

3. data는 선언만 해두고 사용하지 않으니까 지우는게 좋겠습니다.

2006-10-251
480

(p 480 [그림 11-12])

WORDRESS
==>
WORDREGS

2006-10-251