The C programming Language(1)

rgbi3307의 이미지

안녕하세요? 아래의 C코드는
화씨(F)를 섭씨(C)로 변환하여 결과를 표시하는 프로그램입니다.

메인함수안에 문장들이 10개로 구성되어 있는데,
이것을 단3개로 줄일 수 있으신가요?
한번 시도해 보세요~

#include "stdio.h"
main()
{
    float fahr, celsius;
    float lower, upper, step;
    lower = 0;      /* lower limit of temperatuire scale */
    upper = 300;    /* upper limit */
    step = 20;      /* step size */
    fahr = lower;
 
    while (fahr <= upper) {
        celsius = (5.0/9.0) * (fahr-32.0);
        printf("%3.0f %6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
}

힘드시다구요?
그럼 아래 연결의 C언어 강좌에 참여해 보세요~
http://www.kernel.bz/sr/sr04.htm

Forums: 
mirr187의 이미지

고도의 광고글인가...;;

freestyle의 이미지

그냥 광고글...
----------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

sisuc의 이미지

C는 잘 모르지만

혹시

1.화씨;
2.화씨를섭씨로바꾸는함수(1);
3.2출력;

...

위대한 한글

rgbi3307의 이미지

재미가 없을것 같아 내일까지 기다려 보렵니다.
KLDP에 C언어를 잘하시는 분들이 많고, 엄청난 내공을 가지신 분들도 여럿 봤습니다.
(C언어가 아니어도 다들 프로그래밍 많이들 하시잖아요? 왜그래요? 다들 표정이.. 않하시는 것처럼..(^^))

한가지 힌트를 드리면 while 루프를 for 루프문으로 변경하면 되는데,
단, 메인함수 안에서 3개의 문장으로만 해결해야 합니다.
다른 부가적인 함수 호출은 하지 않습니다.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

ymir의 이미지

#include &lt;stdio.h&gt;
 
int main(void)
{
    double f=0, u=300, s=20, d=(5.0/9.0);
    for (f-=s; (f+=s)<=u; printf("%3.0f %6.1f\n", f, d*(f-32.0)));
    return 0;
}

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

rgbi3307의 이미지

3개의 문장으로 해결한 접근방식은 맞습니다.(결과 데이터도 맞게 나옵니다)
그러나, 코드의 간결성과 가독성 면에서는 좋지 않습니다.
코딩을 할때 아래 원칙을 지키는 것이 좋습니다.
1. 간결하게 작성한다.
2. 가독성 있게한다.
3. 기억장소 낭비를 하지 않는다.
4. 쉬운 방식으로 문제의 핵심만 작성한다.

for 루프문의 제어변수들을 되도록 이면 쉽게 표현해야 하는데,
왜 저렇게 하셨는지 모르겠군요.
문제는 화시를 섭씨로 변환하는 것이므로 float 형의 자료형으로도 충분한데,
왜 double 형을 사용하셨는지요?
그리고, double형 변수를 4개나 사용하셨으므로, 기억장소 낭비가 있고, 실행속도도 떨어집니다.

int형 변수 하나만 사용해서 for 루프문을 아래와 같이 제어하면서
실수형(float,doulbe) 데이터를 산출할 수 있습니다.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

ymir의 이미지

main 의 return type 은 int 이고 명시적으로 작성을 해줘야 합니다.
main 의 return type 이 없다는 것과..
main 에서 아무것도 리턴하지 않았다는 워닝이 두 개 뜰겁니다.
return 0; 을 추가하면 남은 조건은 두 줄이니.. 거기에 다 넣어야죠.. =)

변수를 여러개 쓴 것은 일종의 #define macro 대용입니다.
코드 안에 매직 키워드가 들어가는 건 별로 좋아하지 않아서.. =)
변수명 간단히 쓴 건 typing 하기 귀찮아서.. -.-;;
double 은 일종의 버릇입니다.. ㅎㅎ (핑계 좋군요.. ㅋ~)

5. prototype 을 정확히 작성하고, warning 을 제거한다.
(잠재적인 type error 및 coding miss 를 줄여줍니다.)
6. 가급적 code 안에 magic keyword 를 넣지 않는다. (유지보수에 쥐약)

추가>
int farh; 를 사용하면 implicit type-cast overhead 로 더 손해를 볼 것 같은데..
다른 분들 의견은 어떠신지 모르겠네요...?

float vs double 속도 관련 글 추가
http://stackoverflow.com/questions/417568/float-vs-double-performance

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

rgbi3307의 이미지

좋은 주제로 토론이 이루어지는듯 합니다.

문제의 핵심은 CPU가 실수형(소숫점이 있는) 연산을 어떻게 하는가인데요.
CPU안에 FPU(Floating Point Unit)이 내장되어 있다면, float 나 double 모두 빠르게 처리됩니다.
그러나 과거의 CPU(8086, 80286, 80386)은 FPU가 내장되어 있지 않고,
따로 실수형 연산을 위한 소켓(8087, 80287, 80387)을 만들었습니다.
즉, FPU가 없는 CPU에서는 int, float, double의 실행속도 차이가 많이나고,
기억장소 사용에도 차이가 납니다.
요즘의 x86 CPU는 80486 이상으로 되면서 FPU를 기본적으로 내장합니다.
그런데, 임베디드 CPU는 FPU가 없는 경우가 있습니다. 그래서 파이프라인 기술을 사용하기도 합니다.
참고로, int 데이터형은 CPU안의 레지스터 크기를 따라가므로, 이것이 제일 좋다고 봅니다.
float가 double에 비해서 기억장소 크기는 적게 차지 한다고 알고 있구요,
실수형 연산 크기는 10바이트(80비트)를 사용한다는군요.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

guybrush1의 이미지

이런 말도 안되는...

Quote:

그런데, 임베디드 CPU는 FPU가 없는 경우가 있습니다. 그래서 파이프라인 기술을 사용하기도 합니다.

FPU랑 파이프라인이랑 어떻게 관련이 있는건가요? 파이프라이닝이 뭔지는 아세요?

이거 무슨 statement 갯수 줄이는게 뭐 대단한 일인양 적는것도 그렇고 완전 어이가 없네요.

prio의 이미지

C에서 suffix가 붙지 않은 floating point constant는 '대개' double 형으로 해석됩니다.
(제 기억으로는 '항상'인데, 표준 찾기 귀찮아서 '대개'라고 붙였습니다. -_-)

5.0 / 9.0 역시 double 연산이니,
rgbi3307님도 "왜 double 형을 사용하셨는지요?" 에 대한 대답을 하셔야 하겠네요;;

intel에서 double 형을 사용하는 것의 이득은,
'float과 double의 성능 차이가 없으므로 정수-실수 간 conversion을 하지 않아도 된다.'
라는 게 있겠습니다.

변수 4개 중 상수인 3개는 웬만한 컴파일러라면 constant propagation으로 제거됩니다.

rgbi3307의 이미지

main()
{
    int fahr;
    for (fahr = 0; fahr <= 300; fahr = fahr + 20)
        printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}

From:
*알지비 (메일: rgbi3307(at)nate.com)
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

세벌의 이미지

fahr = fahr + 20 을 fahr += 20 으로 고치면 더 낫겠네요.

http://sebul.sarang.net/

planetarium의 이미지

main()
{
    for (int fahr = 0; fahr <= 300; fahr += 20)
        printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}

이렇게 안 쓰신 이유는 뭔가요? 두 문장으로 줄어드는데...

rgbi3307의 이미지

그런데 위의 코드는 C컴파일러에서는 오류가 납니다.
C#에서는 괜찮구요.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

lateau의 이미지

c99 옵션 주고 컴파일하면 문제 없는 소스같은데요.
그리고 C컴파일러라고 해도 종류가 많으니 문제와 함께 명시하는게 더 나을 수도 있지 않나 싶네요.
제각각 다른 컴파일러를 쓰면서 그거 틀렸네요라고 하는 것도 좀 우습지 않나요...

- Why don't you come in OpenSolaris? I hope you come together.

--
I think to myself...what a emerging world.

lifthrasiir의 이미지

C99 옵션을 주더라도 for 문 괄호 안에 선언을 넣을 수는 없습니다. C++ 코드거나 컴파일러 확장(GCC는 없는 걸로 기억하는데... 글쎄요)을 쓰는 코드거나 하여튼 표준 C 코드는 아닙니다.

(물론 그렇다고 C#에서 컴파일이 된다는 건 아닙니다. rgbi3307 씨가 쓴 글은 도무지 저의를 알 수 없군요.)

planetarium의 이미지

생뚱맞은 글에 반박할 자료 한참 찾았습니다. 예제가 나와있는 경우가 은근히 없네요.
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=215
Scope of for-Loop Variables 항목 읽어보세요. 표준 c99 에 포함된 항목입니다.
(C++ Reference Guide 카테고리에 있는 글이라 오해하실 수 있지만 해당 글은 c99에 대해 다루고 있습니다)

실제로 gcc 4.4 에 아래 코드를 넣어보면

#include <stdio.h>
 
int main()
{
	for (int i=0; i<5; i++)
		;
	return 0;
}

아래와 같이 알려줍니다.
test.c: In function ‘main’:
test.c:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
test.c:5: note: use option -std=c99 or -std=gnu99 to compile your code

달리나음의 이미지

ISO C 99에서 6.8.5의 1을 확인하면 다음과 같습니다.

while ( expression ) statement
do statement while ( expression ) ;
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement

참고로 C++ 98의 정의는 아래와 같습니다.

for ( for-init-statement conditionopt; experssionopt ) statement

참고로 의아한 부분이 있으면 구글링 보다 먼저 스펙을 보는게 더 적은 노력으로 큰 결과를 얻을 수 있습니다.

prio의 이미지

심심풀이로 short coding 이라는 책을 보며 깔깔거리던 기억이 나네요.

그런데 코드 줄이는 건 just for fun 이고

정작 인생에 도움되는 것은 함수의 타입을 정확히 지정하는 것 일 듯.

원래 코드는 가독성 면에서 훌륭하네요. :)

ddoman의 이미지

강좌게시판보단
토론게시판이나 자유게시판이 어울릴듯

russell의 이미지

나 참...강좌 게시판이 무슨 광고 혹은 심심풀이 게시판으로 변질 되어 가는거 같네요. 자유게시판이나 질문답으로 게시물을 옮기는게 좋을 듯. 이런 글에 댓글 달면서 말려들지도 않는게 좋을 거 같네요. ;;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.