프로그래밍 일주일전 시작했는데 첫번째 벽입니다.

익명 사용자의 이미지

A book on C란 원서를 사서 C언어 공부해 볼거라고 일주일전부터 시작한
사람입니다. 본래 딸리는 영어 실력에다 프로그래밍도 한 번 안 해본 초보입니다. 하지만 첫장 둘째장.. 이해
는 잘 안 되어도 일단 한 번 죽 훑어 볼거라고
보고 있는데 첫번째 벽에 가로 막혔습니다. 아무리 생각해도 이해가 안 되고
저 자신이 생각하는 논리가 전혀 엉뚱한 것은 아닌지 하ㅡ는 의구심이 드는...
그런 예제입니다. 아주 기초적인 예제인 걸로 보이는데 안 되는걸 보니 제가
프로그래밍에 소질이 없어서 이런 것인지 하는 회의감마저 듭니다.
혹시 이 게시물 보시는 분께서는 초보자 한 명에게 좋은 가르침을 좀 주십시오.

일단 프로그램 소스입니다. 5개 숫자를 받아서 소트하고 합과 평균을 내는
소스인데요 특히 소스에서 소트하는 부분... 그러니깐 for문이 중첩된
부분을 도무지 이해할 수가 없습니다. 아시는 분께서는 번거로우시더라도
너그러이 처리 과정을 조금 자세하게 설명해 주시면 정말 감사하겠습니다.
(아... 소스 언제 다 치지;; 리눅스 vi에서 했었는데 A드라이브에 복사하는
방법을 몰라서 다시 쳐야 합니다!)

#include
#define CLASS_SIZE 5

int main(void) <-- 이 부분 무조건 main(){ 이렇게 시작하는줄 알았는데
어떤 의미인지 가르쳐 주세요 ㅡㅜ (void)가 뭔지도 제대로 개념이 안 잡히네요.
{

int i, j, score[CLASS_SIZE], sum = 0, tmp;

printf ("Input %d scores ", CLASS_SIZE);

for (i = 0; i < CLASS_SIZE; ++i){

scanf("%d", &score[i]);

sum += score[i];

}

for (i = 0; i < CLASS_SIZE - 1; ++i) /** 여기 이 부분들이 이해가 안 가네요;;

for (j = CLASS_SIZE - 1; j > i; --j)

if (score[j-1] < score[j]){

tmp = score[j-1];

score[j-1] = score[j];

score[j] = tmp;
}

printf("\nOrdered scores\n\n");

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

printf(" score[%d] = %5d\n", i, score[i]);

printf("\n%18d%s\n%18.1f%s\n\n", sum, "is the sum of all the scores", (double) sum / CLASS_SIZE,

" is the class average"); /** (double)은.. 어떻게 나온 건가요?
return 0;
}

입니다...

고수님들이 보시기엔 정말 보잘것 없는 질문 같지만... 전 오늘 이거가지고 오랫동안 씨름하다가 이렇게

질문을 올리는 것이니... 도와주시면 정말 감사하겠습니다.

익명 사용자의 이미지

자세한 설명을 하자면 한도 끝도 없고, 초보라고 하시니까 적당한 수준의 설명을 드리겠습니다.
책 계속 보시다 보면 더 정확하게 이해할 수 있을 겁니다.

1. main() 함수

소스코드를 컴파일해서 실행 파일을 만들기 위해서는 반드시 있어야 하는 함수입니다.
C 프로그램이 많은 함수들로 이루어져 있다면 실행 파일에서 가장 먼저 실행되는 함수라고
생각하시면 됩니다. 그리고 이 main() 함수에서 다른 함수들을 호출하는 것입니다.

2. void
함수의 인수(argument)가 void일 때는 아무런 인수값이 없다는 뜻이고, 함수의 리턴값이
void일 때는 아무런 값도 반환되지 않는다는 뜻이죠. main(void)는 사실 main()과 같고
후자와 같이 써 주어도 아무 문제가 없지만 void를 꼭 써주는 것이 좋습니다. 컴파일하는
과정에서 함수의 프로토타입 검사를 할 때 달라지기는 하는데 구체적인 이유는 아마
책 뒷 부분에 나올 겁니다.

3. 정렬 알고리즘
버블 알고리즘이라고 아주 간단한 형태의 정렬 알고리즘인 것 같습니다. 예의 경우 5번째
수랑 4번째 수를 비교해서 5번째 수가 크면 자리를 바꿉니다. 그리고 3번째 수랑 4번째
수를 비교해서 또 큰 수를 왼쪽에 놓습니다. 이런 과정을 다섯 번 반복하면 제일 왼쪽 수가
제일 큰 수가 되겠죠. 이게 안쪽 for loop에서 일어나는 일입니다. 그리고 위의 과정을
처음부터 다시 반복해서 이번에는 두 번째로 큰 수를 왼쪽에서 두번째 자리에 놓는 것입니다.
이런 식으로 제일 큰 수가 제일 왼쪽에 오게하는 정렬 알고리즘입니다. 아마 책 뒷부분에
정렬 알고리즘에 대한 설명이 나올겁니다.
이해가 안되면 종이에 "3 4 1 5 2" 이런 식으로 써 놓고 예의 소스코드처럼 한번 움직여 보세요.

4. double
sum도 정수값이고 CLASS_SIZE 도 정수값이니까 나누면 실수 값이 되겠죠.(더 정확하게는
부동소수점 수. floating point number) C에서는 (정수 / 정수) 의 결과를 기본적으로
내림해서 정수 부분만 반환합니다. 그래서 13 / 5라는 식의 값은 2입니다. 그래서 앞에
(double) 이라고 붙여주어 식의 결과값을 실수 형태로 나타내라고 명시적으로 써 주어야
2.6 이라는 실수값을 갖게 되는 것입니다. 이런 것을 casting이라고 합니다.

처음에는 다 어려운 법입니다. 포기하지 말고 힘내세요..

익명 사용자의 이미지

부끄러운 일이지만 아직 감이 안 오네요...

특히 정렬하는 부분... 제가 아까 낮에 연습장에 써 놓고 해봤거든요...

그런데;; 거기서도 안 되었다는데 문제가 있습니다. 그래도 많은 지식을 얻었

으니 내일 다시 해보겠습니다.

정말 감사드립니다. ^^

지금은 군인인데... 복학하면 정말 열심히 해서 님과 같이 다른 사람에게

작은 지식이라도 전해주고 싶습니다.

익명 사용자의 이미지

버블 정렬에 대해서는 아래의 표를 참고하시기 바랍니다. 표 안의 스코어 값들은 옆의
if문이 처리되고 나서 변경된 값입니다. 아래 표를 보시면 아마 쉽게 이해가 되실 겁니다.

처음 값 3 4 1 5 2

i j score[0] score[1] score[2] score[3] score[4] if문
------------------------------------------------------------------------------
0 4 3 4 1 5 2 score[3] < score[4]
0 3 3 4 5 1 2 score[2] < score[3]
0 2 3 5 4 1 2 score[1] < score[2]
0 1 5 3 4 1 2 score[0] < score[1]
1 4 5 3 4 2 1 score[3] < score[4]
1 3 5 3 4 2 1 score[2] < score[3]
1 2 5 4 3 2 1 score[1] < score[2]
2 4 5 4 3 2 1 score[3] < score[4]
2 3 5 4 3 2 1 score[2] < score[3]
3 4 5 4 3 2 1 score[3] < score[4]
4 --> j == i 이므로 for loop가 끝남.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.