과학

c언어를 배워보자. (구구단 프로그램) (비전문성. 누가좀 도와줘!)

 

게이들 오랫만임.

가급적 꾸준히 글 올릴려고 했었는데 그러지 못하게 되었다.

거의 한달만에 글을 쓰는거 같은데

처음 구구단 프로그램 만들때 무슨 오류가 생겨서 몇번 해봐도 안되서 잠시 멈추고

1주일쯤 있다 다시 만들려고 했을때는 씨플 프로그램 정품코드를 받아라고 하는거 귀찮아서 또 1주일 패스

여러가지 변명같은 사정이 있다가 오랫만에 무료한주말(학교를 쨈)을 맞이해서 다시 글을 올려본다.

 

1달전 쯤에 약속했던 구구단프로그램

원래 반복문과 함수개념을 이용해서 짤막하게 만들어 보려고 했으나 열심히 책을 들여다 보면서 해도 응용하는것에 실패

결국 복붙 신공으로 scanf함수와 printf 함수만 알면 누구든지 만들 수 있는 구구단 프로그램을 급한대로 짜봄.

이글 마지막에 내가 원래 하려던 소스캡쳐해둔게 있으니까 전문가 형들이 손좀 봐주면 감사하겠음

 

일단 급한대로 만든 구구단프로그램

 

 

1.PNG

 

여기서 사용된 c언어의 기능은 크게 4가지

 

변수선언

printf 함수

scanf 함수

주석기능

으로 나눠볼게 (내가 어느정도 이해하고 있고 중요하다고 생각하는 기준에서 뽑아봣음)

 

 변수선언은 c언어에 있어서 아주 중요한것이야(사실 c언어에 있어서 모든 기능 하나하나가 감초같은 기능이긴 하지만)

우리가 수학공부를 할때는 그냥 공책에 별생각없이 x=1, a=10 이런식으로 식을 적으면 되지만 c언어에선 일일이 변수를 만들어서 사용해야하는거지

예를들어 프로그래밍을 할때 x라는 변수를 쓰게 될거 같으면 그때그때 x=1 이렇게 지정하면 안되고 함수의 앞부분에서 미리 x라는 변수를 만들어 놓고

나중에 사용하는 식이지.

 

변수에는 여러가지 종류가 있어.

정수형,실수형,문자형,논리형 변수가 있어.

 

하지만 여기서는 일단 정수형과 실수형만 알바보자.

c언어는 정수와 실수를 뚜렷하게 구분하고 있어

예를들어 정수형 변수 a를 선언 했는데 여기에 1.5를 입력하면 실수에 해당하는 0.5는 날라가고 1만 저장되는 거지.

왜 이렇게 구분을 해놧냐면 정수와 실수를 함께 사용하면 0.00001의 오차조차도 치명적인 오류를 낼 수 있는 프로그램을 작성할때 실수형 변수를 잘못 사용하면

나는 정수 100을 입력했는데 소수한참 뒷부분쯤에 가면 난대없이 0.000....001 처럼 딱 떨어지지 않게 일어나는 경우가 있다는 거지.

만약 여기서 정수형 변수를 사용했으면 100에서 오차는 하나도 없이 딱 100이 되지만 실수형 변수를 사용하면 위의 경우가 일어날 수 있다는거야.

실수를 사용할 일이 생길때는 실수형 변수를 사용하면 되겠지.

 

변수를 선언하는 방법은

 

(자료형) (변수이름);

 

예를 들면  자료형이 int인 dogdrip이라는 이름의 변수를 선언하기 위해서는

int dogdrip; 라고 써주면 되지.

자료형에 관해서는 밑에서 설명할게

변수의 이름을 설정하는데도 몇가지 지켜야할 규칙이 있어

이름의 맨앞에는 숫자가 와서는 안되고  _를 제외한 대부분의 특수문자는 변수이름에 사용할 수 없다는점

그리고 int, char, long 같은 자료형의 이름이나 각종 함수의 이름이나 아무튼 c언어에서 사용하는 핵심기능같은 것들의 이름은 변수의 이름으로 설정 할  수 없지.

또 C언어에서는 변수의 이름에서 대소문자를 각각 구분하는 기능이 있어.

Dog  와 dOg 와  doG 라는 변수는 서로 다르다는 거임

 

ex) 옳은 변수이름의 예 : X, x, number, dog, drip, d_rip, drip3

     잘못된 변수이름의 예 : 1dog, 공대생, d-rip, %dog, C++, int

 

 

 자료형에 관해서 설명해 보자면

정수형변수와 실수형 변수 안에서도 여러가지 자료형이 있어.

정수형에서는 char, short, int, long 형이 있고

실수형에서는 float, double, long double 형이 있지

이렇게 자료형이 많은 이유는 각각의 자료형이 사용하는 데이터의 크기가 다르기 때문이야.

 

만약 우리가 1만큼의 용량이 필요한 물건을 저장할때 용량이 1인 가방이 있으면 남는 공간의 낭비도 없이 좋겠지.

하지만 1만 있으면 되는 물건을 굳이 6나 10씩 되는 용량을 가진 가방에 넣으면 5나 9씩 되는 공간이 낭비가 되는거지

(안타깝게도 C언어에서는 변수 하나당 정수 하나만 설정 할 수 있어서 남는공간에 다른걸 넣으면 된다는 발상은 불가능하다 ㅠㅠ)

이렇게 낭비되는 공간을 줄이기 위해 여러가지 자료형을 만들어 놓고 사용하고 있어

아래는 각각의 자료형이 사용하는 공간과 표시할 수 있는 데이터의 범위야

 

 1_speciallive.jpg

여기서 int형과 long형의 차이를 아는 게이는 댓글로 부연설명 부탁

[사진 출처 : http://kazikai.tistory.com/30]

 

여기서 필요한 용량만큼의 자료형을 알맞는곳에 골라서 쓰면 낭비되는 공간이 크게 줄겠지.

 

변수선언에 있어서 중요한 것은 변수는 항상 함수의 앞부분에서 선언해야 한다는점

이 말은 함수중간에 갑자기 변수를 선언할 수 없다는 뜻임

항상 함수의 맨 앞부분에서 변수를 선언해주는게 중요하다.

또 변수를 선언하는것과 동시에 변수값을 0으로 초기화 하는것도 필요하지.

0으로 초기화 하지 않을경우에는 컴퓨터에서 자기맘대로 임의의값을 대입하기 때문에 초기화 없이 바로 덧셈이나 곱셈같은 계산을 하면

터무니 없는 숫자가 나올 수 있지.

초기화는

int x;

x=0;

처럼 변수를 선언하고 밑에서 초기화 하는 방법이나

int x=0; 처럼 선언과 동시에 초기화하 할 수 있어.

 

 

 

 

 

2번째는 알고보면 존나 심오한printf함수

깊게 파면 머리 터지니까 비기너즈들은 간단하게 http://www.dogdrip.net/37312885 여기 중간쯤에서 사용하는 방법만 대강 파악해두자.

위의 게시글은 아직 잘 모를때 썻던거라서 빠진 설명이 있는데,

#include <stdio.h> 에는 stdio.h라는 파일을 첨부하라 라는 뜻이 있고

stdio.h에는 printf() 함수가 int printf(const char *,...); 라는 식으로 선언되어 있다고 하는데,

 아직 내가 보기에는 난이도가 너무 높다.

 

3번째는 scanf함수와 주석기능을 함께 설명할게

 

scanf함수는 사용자로부터 수치를 입력받는 기능을 담당하는 함수야.

앞에서 변수를 선언해준다음 선언한 변수에 수치를 입력하는 식으로 하는건데

 

#include <stdio.h>

 

main (void)

{

           int X = 0; // X라는 변수 선언 및 초기화

           scanf("%d ", &X) // %d는 정수출력을 의미

 

/*

&에는 X라는 값에

앞에서 입력한 %d의

값을 저장하라 라는

뜻이 있다.

*/

 

}

 

위에서 보면 //라는 기호와 /* */ 기호가 보일거야

이게 주석기능인데

내가 만든 짧은 프로그램말고 엄청 복잡한 프로그램의 소스코드 같은 경우는 다른사람은 둘째 치고라도 만든 본인도 몇일이나 몇주가 지나면 어느함수가

무슨뜻인지 까먹는 경우가 프로그래밍하는 사람들 사이에서 자주 일어난다고 해.

그래서 그 옆에 그 함수가 무슨 기능을 하고 무슨 뜻인지 설명하는 꼬리표같은 역할을 해주는게 주석이야

//  뒤에 쓰이는 1줄이 주석처리 되고

/* 와 */ 사이에 들어있는 몇줄의 글이 주석처리 되지.

여기서 주석처리한 문장은 프로그래밍에 어떤 영향도 주지 않아.

보통 소스코드 프로그램으로 주석처리를 하면 주석처리된 문장이 초록색으로 표시되서 나와.

 

그럼 짧은거 같으면서도 긴 오랫만의 글이 끝났어. 여기까지 읽어줘서 고맙다.

 

 

마지막으로 전문가들 형에게 도움을 요청하려고 해.2.png

위의 소스코드가 원래 내가 만들려고 했던 구구단 프로그램인데 어디가 문제인지 좀 파악해서 손봐주면 고맙겠음.

 

아래는 컴파일할때 나오는 오류

1>------ 빌드 시작: 프로젝트: rnrneks.c, 구성: Debug Win32 ------
1>  rnrneks.c
1>c:\users\DG\documents\visual studio 2010\projects\rnrneks.c\rnrneks.c\rnrneks.c(10): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(304) : 'scanf' 선언을 참조하십시오.
1>c:\users\DG\documents\visual studio 2010\projects\rnrneks.c\rnrneks.c\rnrneks.c(15): error C2449: 파일 범위에 '{'가 있습니다. 함수 헤더가 없는 것 같습니다.
1>c:\users\DG\documents\visual studio 2010\projects\rnrneks.c\rnrneks.c\rnrneks.c(28): error C2059: 구문 오류 : '}'
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========

 

 

 

  

 

 

28개의 댓글

2013.10.13
함수 정의할때 즉 main 아래있는 함수 할때
int gopf(int value) {
...
}
세미콜론 없다.

왠만하면 main 은 int main () {} 으로 해줘라. 프로그래밍은 협엽과정이니까.
for(i=1;i<=9;i++)
두번쨰 인수랑 세번째 인수 사이에 세미콜론이 없다.

gopf 안에 변수 X가 선언되지 않았다.
printf("%d x %d = %d \n", x, i, result) printf의 인수 선언이 잘못되었다.
for문 안에있는건 로직이 이상한것 같은데 뭘 하고싶은지 네 생각을 몰라서 뭐라 안하겠음.
그리고 함수는 정의만 되어있지 main안에서 호출되지도 않았네.
0
2013.10.13
함수 만들어놓고 메인함수에서 만들함수 호출을 아예안했잖아

1. gopf함수 안에 X변수 선언안되었고 X 이름으로 변수를 쓸려면
int gopf(int value) -> int gopf(int X) 이렇게 고쳐야지

2. 메인함수에서 gopf함수 호출안함

3. 함수선언할때 함수 끝에 세미콜론 붙이는건 맞는데
밑에서 함수정의할때는 세미콜론 붙이면 안돼
int gopf(int value); --> int gopf(int value)

4. 그리고 gopf변수 안에 프린트문은 for문 안에 들어가야지
우리가 1~9까지 곱하는 걸 프린트할꺼 잖아? 그럼 9개 프린트해야하니까 같이 반복해줘야해

5. gopf함수에서는 return 0가 맞는거야 자세히 설명할려면 길게 써야되는데 필요하면 말해
설명해줄께
0
2013.10.13
먼가 이상한데 내가 한번 코드 짜봄
0
2013.10.13
으 첫짤 혐
역시c언어는 정리를 잘해야해
0
2013.10.13
http://codepad.org/6KPWekb4
0
2013.10.13
@돋아오른다.
너가 원하는 대로 한번 해봤다.
0
@돋아오른다.
오 졸신기
딱맞네 감사 이거 참조하면서 다시 만들어 봐야겠네
0
2013.10.13
@돋아오른다.
으앗 땡큐 안그래도 이 사이트 찾고 있었는데! 찾질 못해서 헤메다가 여기서 다 보네
0
2013.10.13
개드립에 코드게이 많나보네 10분도 안되서 댓글이....

아무튼 글쓴이 공부열심히 하라는 의미에서 ㅊㅊ
0
2013.10.13
추가로 printf와 scanf에 대해 말하자면 ( 나도 허접이라 잘 모른다.)
pritnf는 대표적인 가변인수 함수지. 즉 인수의 개수가 임의적이라는 거야
printf(const char * , ...)
...에 1개나 3개, 아무갯수나 들어가지.
const char *은 char형 포인터를 말하는 거다.
C에서 string은 char의 배열이기 때문에 그 배열을 받기 위해 char *을 사용. 그리고 const 를 붙은건 그 값은 변경시키지 않겠다는 거지.
...에 들어가있는 인수들은
va_start, va_arg등의 함수를 통해 불러내어 적절히 처리한다.

scanf도 비슷한 구조로 이루어져 있는데
scanf(const char * format [,address...]); 가 원형이다
보면 알 수 있듯이 주소값을 받지 scanf는 변수의 메모리에 직접 저장하지 않고 포인터를 통해 저장하기 때문에, 변수에서 주소값을 읽어내기 위해 '&'를 붙인다.
0
@돋아오른다.
설명 보니까 소름이 돋아오른다 ㄷ
훌륭한 설명 감사함
0
2013.10.15
@공대생이된문과생
위에 녀석 설명이 좀 이상한거 같아서 쓰는글인데

변수를 선언하면 거기에 방이하나 생긴다고 생각하면되, 그 방의 종류는 int, char 등의 변수형으로 선언하고 방의 이름은 변수명, 그 방의 크기는 변수형에따라 다르지(기본적으로 char 1byte, int 4byte 등). 한종류의 방을 여러게 연결하면 배열이되고, 여러종류를 섞어서 여러개 연걸하면 구조체가 되는거야.

근데 이 방은 이제 저장될곳 (힙영역)에 저장되는데, 이녀석이 힙영역 어디에 있는줄 알아야겠지? 그래서 이녀석이 저장된곳에 작대기꼽고 표하시는게 주소임. 즉 값이 저장된곳을 가리키는것이 주소인거지.

한줄로 정리해주면 값을 저장할수있는 방이 변수고, 방의 이름은 변수명. 방의 위치는 주소인거야.

(너 c언어쓸때 #include<stdio.h>쓰지. 여기서 std가 standard input, output, 표준 입출력의 약자임. 즉 표준 입출력함수를 정의해놓은 헤더파일을 인클루드해서 거기에 정의된대로 쓰겟다 이뜻임. stdio.h가보면 printf 함수가 정의되어 있는거지 )

printf함수는 요구하는것이 방의이름인거지. 방의 이름을 지정해주면 printf함수가 힙영역에서 그 방의 이름을 찾아서 안에 들어있는 값을 보여주는거임.

scanf함수는 요구하는것이 방의 위치임. 방의 위치를 지정해주면 scanf함수가 힙영역에서 그 방의 위치를 찾아서 그안에 값을 넣는거고.
0
DSP
2013.10.13
초보자는 책하나 구해서 차분히 예제 때라하며 하는게 효과가 좋다고 생각한다.

명품 C언어프로그래밍 -안기수 저

이런 책처럼 쉽게따라할수있는 책 많다. 근처도서관에서 빌려도좋고 하나 사는것도 나쁘지않다.

연습문제를 풀다가 안됬을때 도움을 구하기보다 좀더 심화된 내용의 책을 따라가는것도 한 방법.
프로그래밍은 누군가의 도움보다는 본인이 얼마나 시간을쓰냐에따라 실력이 쑥쑥 향상되니까.
0
2013.10.13
나도 C를 오래 만지긴 했지만 진짜 함수가독성 썩는 걸론 최상급임.......
돈 벌 목적 아닌 다음에야 취미로 프로그래밍 접하는 애들은 일치감치 C는 클래식 삼아서만 하고 파이썬이나 리습해라
리습은 이론적 토대를 만드는데 최고고, 파이썬은 애초에 답이 하나밖에 없는게 모토라 배우기에 쉬움
0
2013.10.14
Int main() 은 콘솔에서 해당 프로세스에 인자를 넘겨줄때 쓴다 리턴은 제대로 수행했음을 알리는데 쓰고
가변인자는 조금 쓰기 애매한데 왠만하면 하지말고 자료구조형으로 넘기고
C를 알아야 다른 언어배우기가 쉽다 이건 진리임
0
2013.12.27
@URA!!
int main(int argc, char* argv[])
0
2013.10.14
C 정말 맨 처음 배울 때 하나하나 만들면서 좋아했더랬지.
그 시절 감정이입돼서 ㅊㅊ
0
2013.10.14
사실 c몰라도 다른언어 하나만 익히면 나머지 언어 다 쉬움여.
0
2013.10.14
개발 하겠다는 애가...캡쳐해서 올려두고.....도와 달라고 하면 어떻해..

코드 손봐주고 싶어도 타이핑 하기 싫어지잖어.
0
2013.10.14
이런글 자주 올라오네 혹시 여기서 안드로이드 개발 관심있는 사람들 있어?? 있으면 간단한 프로젝트를 가지고 만들면서 강의글을 하나 써볼까 해서.... 원하는 사람 있으면 한번 해볼께.. ㅋ 허접 하지만.. 관심있는 사람들이 좀 있을까 해서..
0
2013.10.14
@내별명은비밀
써봐라 모르는건 도와줄게.
이거 제목보고 들어왔다가 댓글달기가 참 애매해서 안달았다..


잘못된 정보가 많네..

안드로이드 강의쓰면 내가 ㅊㅊ 눌러줌
0
2013.10.14
나 컴공 지원했는데 C언어 많이 어려움?
0
2013.10.14
@바클러
적성에 맞다면 재미있다!
0
2013.10.14
난 화공쟁이래 C++배우긴 했어도, MATLAB이 주전공이라 LOGIC은 이해하겠는데 명령어가 차이있어서 뭐라 말 못하겠어..
0
1. 함수 정의 이상하게 되어 있음

세미콜론 빼야댐

int gopf(int value) {

~~~~
}

2. for 문 조건식 지정 잘못댐

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

~~~
}


3. 함수 선언은 되어있는데 main에서 쓰이질 않음


* 추가로 함수 이름같은건 gopf처럼 알아보기 힘든것보다 명시적으로 지어주는게 나음
- 팀 프로젝트 뿐만 아니라 개인 프로젝트 할 때도 상당히 도움 됨.

printf, scanf, for 이런것만 봐도 얘가 뭘 하는앤지 알 수 있지.
0
2013.10.15
auto lamda = [](int a)->int{std::cout << "Hello World" << std::endl; return 0};
0
2013.12.27
정작 int와 long은 아무도 안짚어줬네 ㅋㅋㅋ
long은 4byte이다.

여기서 혼선을 준건 int가 4byte여서 그런것인데,
윤성우 C 열혈강의 동영상 강의를 보면 나오지만, int는 예전엔 2byte였고 현재엔 8byte가 되기도 한다.
16bit CPU -> 16bit (2byte)
32bit CPU -> 32bit (4byte)
64bit CPU -> 64bit (8byte)
0
2013.12.27
Error:
C2449: 이 에러는 네가 "int gopf(int value);" 라는 구문을 "#include" 밑에 쓴걸 보니 함수의 선언에 대한 지식이 있는거같은데, 함수 정의 부분에서 ; 때문에 이 문장을 함수의 정의가 아닌 선언으로 컴파일러는 인식을 하고 밑에 {}라는 문단이 나오게되니 해당 문장이 무엇을 위한 문단인지 이해하지 못해서 나온 에러메시지다.
(컴파일러가 똑똑해서 함수 헤더가 없는 것 같습니다. 라는걸 알려준다)

C2059: C2449와 연관된 에러다. 필요한 문단이 아니니 "{"와 짝인걸 알리도없고 "}"는 그냥 의미없는 단어라고 생각한것.

그외에도 함수의 정의부분을 이해하지 못해서 발생조차 안한 에러들이 있다.
for구문은 for(선언부; 조건부; 증감문) {} 로 이루어져있다. 이 말을 생각하고 다시 네 for문을 봐라.

printf함수의 사용도 문제가 있다.
함수가 인자를 받기 위해서 구분자로서 사용되는 단어가 "," 이다.
X, I, result는 각각 다른 변수 이자 함수로서는 다른 인자이다. 이 말을 생각해보며 printf의 사용법을 다시 봐라.
(X는 해당 함수 내에서 전혀 선언조차 되지 않은 변수이다.)

gopf 라는 함수는 다양한 문제가 있다.
내가 보기에 함수에 대한 이론적인 지식이 없는 상태로 구성한것 같네,
다시한번 보길 추천한다
(변수의 지역성 관련 한 부분도 보고..)


위에서 에러들을 잡아주긴 했는데 설명을 달아주고 싶어서 남긴다..
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
563 [과학] 경계선 지능이 700만 있다는 기사들에 대해 34 LinkedList 12 2024.04.14
562 [과학] 번역)새들은 왜 알을 많이 낳는가? - 후투티의 형제살해 습성... 7 리보솜 3 2024.03.23
561 [과학] 학계와 AI, 그리고 Bitter Lesson (쓰라린 교훈) 26 elomn 35 2024.02.17
560 [과학] 지구의 속삭임, 골든 레코드의 우주 9 Archaea 10 2024.02.16
559 [과학] 잔혹한 과학실험 이야기 <1> 절망의 구덩이 19 개드립하면안됨 37 2024.02.15
558 [과학] 스트레스를 받으면 술이 땡기는 이유 12 동식 16 2024.02.10
557 [과학] 지능은 모계유전이 아니다. 40 울릉특별자치도 35 2024.01.26
556 [과학] 진화를 생각할 때 고려할 것들 23 날씨가나쁘잖아 12 2024.01.17
555 [과학] 학문적(과학적) 접근과 유사 진화심리"학" 26 날씨가나쁘잖아 19 2024.01.15
554 [과학] 호모 사피엔스의 야릇한 은폐된 배란에 대한 남녀 학자의 다... 14 개드립하면안됨 15 2023.12.29
553 [과학] 김영하의 작별인사를 읽고 느낀 점 (스포있음) 21 장문주의 2 2023.11.28
552 [과학] 제4회 포스텍 SF 어워드 공모전 ( SF 단편소설 / SF 미니픽션 ) 2 따스땅 1 2023.11.25
551 [과학] 펌) CRISPR 유전자 가위 치료제 "최초" 승인 12 리보솜 7 2023.11.25
550 [과학] 러시아는 기술산업을 어떻게 파괴시켰는가(펌) 9 세기노비는역사비... 15 2023.11.18
549 [과학] 고양이에 의한 섬생태계 교란과 생물 종의 절멸 (펌) 2 힘들힘들고 6 2023.11.16
548 [과학] 번역) 알츠하이머병 유전자는 어떻게 살아남았는가? 12 리보솜 10 2023.11.15
547 [과학] 『우영우』의 자폐 스펙트럼 장애 개념이 왜곡인 이유 (펌) 47 힘들힘들고 10 2023.11.12
546 [과학] 흑수저 문과충 출신 구글 취직하는 파이썬 특강 -1 14 지방흡입기 11 2023.09.27
545 [과학] 국가별 당뇨 유병율 이거 뭐가 바뀐건지 아는사람? 8 LAMBDA 1 2023.09.27
544 [과학] 물샤워 ㅇㅈㄹ 하는 놈들 봐라 171 철동이 48 2023.09.23