프로그래밍

C언어질문 2 (1~100까지의 합 구하기)

생각해 보라해서 생각해서 이렇게 수정했더니 답 5050은 나오는데

 

난 int Sum 이부분 수식을 변형해서 답을 구하고 싶은데 방법없을까?

질문 4.png

29개의 댓글

2019.06.20

그냥 return (a1+x) 해주면될듯

글구 함수를 만들고싶으면 변수 a1 a2받아서 a1부터 a2까지 더하는 그런함수를 만들고 메인에서는 값만 받아오는 식의 그런함수가 더 좋을거같네

0
@빠리빨리

그러니까 그런함수를 어떻게 표현해야될까

0
2019.06.20
@그림으로말해요

일단 반복문을 함수로 옮기고

a1부터 a2까지 더한값을 한 변수에 저장한 다음에

계산 완료후 그 값을 리턴시켜주면 되겠지

메인에서는 함수 호출해서 받은 값을 출력만하면 될테고

0
@빠리빨리

니말은 for 이부분을 함수로 옮기고

메인 부분은 호출만 시켜라 이말임?

 

그렇게하면 너무 코드가 복잡해질거같은데

간결하게 표현하는법 없을까 ?

0
2019.06.20
@그림으로말해요

워낙 간단한 구조라 코드가 복잡하지는 않을거고

밑에 댓글에도 있는데 같은역할을 하는 변수들이 많아서 지금 복잡하게 보이는거임

어떻게 정리할지는 한번 생각해봐

0
2019.06.20

만들고 싶은게 뭔지 모르겠음. 더할거면 함수 없이 그냥 더하면 되는거고, 반복 없이 간편화 하고 싶으면 1~x까지의 합 x(x+1)/2 쓰면 되는건데..

0
@구백육

수식을 미리 정의하고

반복문의 내용은 미리 정의한 함수를 쓰는거지

0

바꾸고 싶은 방향을 제시해줘야 답변이 가능할 것 같다만.

일단 변수가 필요없이 많이 선언된 것을 줄일 수 있어

 

1.함수 Sum의 경우 내부에 연산용 변수 an이 필요하지 않음.

sum(int a, int b)

{

 return a + b;

}

를 해도 동일한 결과를 얻을 수 있지

 

2. 메인 함수 안에 선언된 변수들도 일부 줄일 수 있지.

x와 c는 보면 알겠듯이 사실상 한쪽이 받고 그다음 쪽으로 넘겨주는 역할만 하고 있어

x가 sum안에 들어가서 나온 값을 c가 받아서 x로 전해주고 그 x는 다시 다음 루프에서 sum 안에 들어가고...반복

바꿔말하면 x와 c가 하나여도 문제가 없지.

x = sum(a1, x);로 바꿔도 문제가 없어.

 

3. 그리고 프로그래밍 변수 이름 지을 때

3번째 줄 Sum함수 선언에서 쓰인 매개변수 a1, x와

main함수 안에서 이 Sum함수를 사용하면서 전달인자로 int a1와 int x를 사용했는데 이 둘을 서로 같은 이름으로 붙일 필요는 없고 괜히 로컬변수 범위 확인하는데 헷갈릴 수 있으니 아예 다른 변수명으로 붙이는게 더 좋음.

 

다른 방향으로 바꾸길 원하는거면 어떤 방향을 원하는지 댓글로 달아줘.

 

사실 sum 함수가 하는게 a와 b를 더하는 것 밖에 없는 간단한 함수니 다른 방법으로

for루프 돌리는 블럭부분 자체를 아예 함수로 빼는 방법도 있을 수 있지.

total_sum(int a, int b) 형태로 선언해서 a에서 b까지 모든 정수를 더하는 결과를 리턴하는 식으로.

그러면 1~100만 계산하는게 아닌 50~200 같은 다른 범위에도 쓸 수 있는 함수를 만들 수 있는거지.

그런건 진짜 만들기 나름이고 그런 구조를 생각하는게 프로그래밍이지. 여러가지 방향과 방법이 있으니 여러가지로 시도해봐

0
@알파스트라이크

1번은 꼭 수식을 어떤 한 변수에 지정할 필요가 없구나

난 꼭 수식이면 무조건 어떤 변수에 지정해야되는줄암

 

2번도 x = a1+x 는 일반 수학 수식으로 볼때 말이 안되는 식인데

a1+x를 더한게 다시 x가 된다 이런 사고가 부족했던거같음

 

 

많은도움됐음

0
2019.06.20
@그림으로말해요

C에서, 우변의 계산이 완료된 후에 그 값이 좌변의 변수에 업데이트 된다.

0
@그림으로말해요

프로그래밍 언어에서는 평가(evaluate)라는 개념이 있어. 모든 변수나 식은 사용되는 지점에서 평가를 하게 되어 있고 그 역할이 동등해.

예를 들면 a = 50;이라고 하면 단순히 a에 (int) 50을 넣는다는건 '부가적인' 효과임.

실제론 오른쪽의 값은 (int) 50으로 평가되고 대입 연산자에 의해서 a도 같은 (int) 50으로 평가되게 됨.

 

return a1의 경우는 a1을 평가해서 그 값을 return 지시문에 의해서 반환하는 것.

return a + b;도 마찬가지로 +연산자에 의해서 a + b가 어떠한 값으로 평가되고 return은 그 평가값을 반환함.

 

a > b 같은 것 역시 a를 평가하고 b를 평가해서 >가 이를 비교해서 a가 크면 1(true)를 평가하는것.

 

즉 어떤 상황에서도 동일하게 평가될 수 있는 값이라면 똑같이 대체가능한 거지.

sum 함수에서 int sum(int a, int b) { int c;  c = a + b;  return c; } 라면(옆에 한줄로 되어 있는데 ;다음에 엔터쳐서 줄 바꾼거랑 동일해) c=a+b를 통해서 c와 a+b는 a, b가 무슨 값을 갖든 동일한 타입의 동일한 평가값을 갖는것을 알 수 있지? 그럼 대체 가능한거야.

 

2번의 경우도 각 부분에서 평가되는 시점이 다르다는 것을 생각하면 이해가 가지.

전에 대입 연산자 = 는 오른쪽에서 왼쪽으로 판단한다고 했던거 기억나지?

x = x + b가 있다면 x + b를 먼저 평가(당연히 그러면 오른쪽에 있는 x와 b를 제일 먼저 평가하고 + 연산의 결과를 평가 하겠지?)하고 나서 =연산자를 통해 최종적으로 왼쪽의 x를 평가하게 되지. 우측의 x와 왼쪽의 x가 평가받는 시점이 다르기 때문에 수학식과 달리 성립이 가능해.

 

이전 글에 함수 없이 구현한 식을 다시 보면 sum = sum + num;이란 식을 너도 이미 썼듯이.

0
@그림으로말해요

만약 반대로 어떠한 식을 여러번 또는 추가로 가공해서 써야 하거나 (예를 들면 a*b의 값을 한 함수 안에서 여러번 호출해서 써야 할 때) 그 값이 명확하게 어떤 의미를 갖는지를 코드상에서 명확하게 보여주고 싶다면 반대로 일부러 변수명을 하나 사용해서 할당할 수도 있지.

예를 들면 전기요금 계산을 할때 a가 사용시간 b가 (시간당)소비량이고 이를 곱한 값 a*b가 전력량인 것을 명확하게 보여주고 싶고 그 전력량을 다시 전기요금 계산식에도 쓰고 출력에도 쓰고... 하는식으로 여러곳에 쓰인다면 변수 int usedPower 같은 변수를 별도로 선언해서 usedPower = a * b;로 대입시키고 그다음에는 usedPower를 가져다 쓰는 방식을 쓸 수도 있는거지. 그럼 변수하나만큼의 메모리는 더 차지해도 a*b라는 연산을 여러번 하는 불필요한 연산이 줄어들고 그 값이 사용한 전력량이라는 의미도 쉽게 보일테니까.

0
@알파스트라이크

그러니까 한마디로

 

int a;

int b;

int usedPower = a*b;

이럴 필요없이

_____________\

 

int usedPower;

usedPower = a*b;

해버리면 된다는거네

usedPower을 이미 정수로 지정했으니

a*b도 정수여야하니까

굳이 a,b를 인트써서 정수로

지정해놓을 필요가 없네

이 뜻 맞음?

 

0
@그림으로말해요

그건 아니지 모든 변수는 사용하려면 그 앞에 선언을 해 줘야지. 내 말은

 

int a;

int b;

.

 

.

printf("%d\n", a*b);

 

형태로 쓰나

 

int a;

int b;

int usedPower;

 

 

usedPower = a * b;

printf("%d\n", usedPower);

 

형태로 쓰나 기본적으론 같은데 만약 저 a*b의 값을 여러번 쓰거나 할 거면 후자를 선택하는게 장점이 생긴다는 거. 그냥 한번 쓰고 말거면 a*b만 쓰는게 편할 수 있고 간단하지만 '재활용'을 하거나 '가독성'을 위해서 후자를 선택하는게 나은 경우가 있다 이거임.

 

뭐 이런건 이렇게 해야 된다 같은 법칙이라기 보단 팁 같은거고 계속 프로그래밍 익혀나가다 보면 자연스럽게 체득하게되는 부분이니 지금 당장은 가볍게 흘려도 큰 문제는 없음.

0
@알파스트라이크

ㅇㅇ 이해됨

답변해줘서 고마워

0
@그림으로말해요

열공 화이팅

0
2019.06.20

그냥 니말은 Sum(100)하면 5050이 나오게 하고싶다 이건가? 그러면 재귀 써야지 뭐

 

int Sum(int endnum)

{

if(endnum == 1)

return 1;

else

return (endnum + Sum(endnum - 1);

}

0
2019.06.21

함수를 만들고 싶은거야? 아니면 뭔가 간단하게 하고 싶은거야?

 

int main()

{

int a = 100, sum = 0;

while(a)sum+=a--;

printf("%d", sum);

return 0;

}

 

간단하게 하려면 이런 방법도 있어.

0
@센타까

ㅇㅇ 내가 원하는 답변임

어떻게 하면 다른식으로 표현할까

최대한 간결하게

 

근데 이해안되는 부분이

int형 함수써서 0될때까지 값 받아서

더한다 이뜻인거같은대

while(a)sum+=a--

이부분이 이해안됨

그리고 마지막에

return 0은 왜씀??

0
2019.06.21
@그림으로말해요

while(a)는 a가 0이 아니라면 아래를 반복

sum에 a를 더하고 a를 1 줄인다.

a가 0이 되면 루프를 벗어남. -> 1부터 100까지가 아니라 100부터 1까지 더한거지.

 

리턴은 main 함수 기본 생성값이 int func()라서 그냥 리턴한거야. 정상 종료했다고. void로 선언하면 워닝뜬다.

0
@센타까

1. main과 void의 차이점좀

그리고 위 코딩에서

왜 void 쓰면 안되는지좀 알려줘라

 

2. while(종결조건)

인데 그냥 while(a)만 하면

a가 뭔지 알고 끝남?

while(a=0) 이래야 되지 않음?

 

 

3. a+=b가

a에 b를 더한다 이거임?

0
2019.06.21
@그림으로말해요

void main()과 int main()은 OS에서 시키는 대로 지정하는게 옳아. 윈도우 위에서 돌아가면 0을 리턴해야 정상 종료했다고 윈도우한테 보고하는거지. 난 OS 없이 프로그램 하는 경우 - MCU계열 - 가 많아서 void main(void)를 주로 쓴다.

 

while(a) 는 while(a == 0)과 정확히 동일한 동작을 한다.

이건 익숙해지면 생각할 필요도 없이 자주 쓰여. 물론, 시인성을 위해 일부러 a == 0이라고 넣어주는 경우도 있긴 하다.

 

a+=b를 풀어 쓰면 a = a + b다. 이것도 정확히 동일한 동작을 한다. 그냥 C 언어의 다른 표현일 뿐이야.

0
2019.06.21
@그림으로말해요

while은 괄호안에 조건식이 참일때만 실행되니까

a가 100에서 1까지 점점 줄어들면서 sum에 더해지다가

a가 0되는순간 while 벗어나고 sum은 5050로 연산 끝남

 

마지막 return 0; 은 int main()에 대한 return값

 

잘못이해하고있는거 같은데 int a=100; 은 함수가 아니라 int 변수a를 선언한거고

 

저기서 return 0; 은 int main()에 대한 리턴값이얍

0
@팝콘파프콘

a+=b하고

a=+b의 차이점좀

0
2019.06.21
@그림으로말해요

https://studyc.tistory.com/5

여기 드가서 할당연산자 보면 +=가 나옴

 

쉽게 생각해서 구분하기쉽게 a-=b; 랑 a=-b; 를 비교하면

첫번째거는 a값에서 b값을 빼서 a에 다시 대입하는거고

두번째꺼는 그냥 b의 음수값을 그대로 a에 넣는거임

0
@팝콘파프콘

질문하나만 해도됨?

 

니가 말한코딩에서

맨처음부터

 

int main()

이렇게 시작하는데

왜 int main() 으로 시작하는거야?

 

void main()

이걸로 시작하면 안됨?

 

int main() 과 void main()의 차이점좀

알려줄 수 있어?

0
2019.06.21
@그림으로말해요

https://blog.naver.com/tipsware/221243513396

 

이거 읽는게 도움될거같아

 

실제로 난 컴공 전공자가 아니라 학부 교양으로 2학기정도 수강했었고 그때는 나도 void main썼었거든

 

근데 주변 컴공친구들이 비전공자한테는 상관없지만 int main하고 return 0; 이 맞는거라고 글케 쓰라고하더라구

 

첨엔 return 0; 쓰는게 귀찮아서 걍 void main 썼는데 쓰다보니까 별 상관없는듯 ㅋㅋㅋ

 

첨부터 습관 int main으로 들여바바

0
2019.06.21

그냥 등비 수열 합 쓰면 안되냐?

0
2019.06.21

(n*(n+1))>>1

0
번호 제목 글쓴이 추천 수 날짜 조회 수
공지 컴퓨터 / IT에 관련된 글을 올려주시기 바랍니다. 21 overflow 5 2016.08.22 21914
119866 [잡담] 아마존은 무엇을 암시하는 것이지? 6 갸아악 0 31 분 전 22
119865 [모바일] 내가 찾는 모바일 2 CEASAR 0 36 분 전 15
119864 [잡담] 아는형한테 컴 조립해주는겸 내 중고부품 처분할려는데 3 첩첩첩첩첩 0 1 시간 전 23
119863 [견적] 견적질문) 도와줘 컴게 형들 8 ㄸㅃㄲ 0 1 시간 전 20
119862 [잡담] 요즘은 pc용 5.1채널 스피커 거의 없네 1 최고급냉장육 0 1 시간 전 38
119861 [컴퓨터] 밤 11시부터 지금까지 컴퓨터 안켜져서 족뺑이침 야발.... 2 섹드립이패시브 0 2 시간 전 35
119860 [잡담] 아 또 파일 그대로 옮겻엇네 친구없는병신찐따... 0 2 시간 전 29
119859 [모바일] 본인 미니5 구매후 상당히 만족중 1 날카로운입담 0 3 시간 전 67
119858 [컴퓨터] LG32GK650F 팜 4 언제나슬픔 0 3 시간 전 97
119857 [컴퓨터] 하드디스크 안쓸때 끄는거 유틸말고는 없음?? 2 오피차주 0 3 시간 전 44
119856 [컴퓨터] 아 망했다. 7 클로로프렌 0 3 시간 전 66
119855 [모바일] 샤오미 홍미8 3일간 사용후기 6 이디나후이 0 3 시간 전 158
119854 [컴퓨터] 사블 카드 있고없고 차이심해? 18 휘바 0 4 시간 전 80
119853 [컴퓨터] 윈도우 10 오면서 5 Hyouka 0 4 시간 전 117
119852 [컴퓨터] 클라이언트 비활성시 프레임 드랍.help 2 에더리 0 5 시간 전 69
119851 [컴퓨터] 색감차이는 어쩔수 없는듯 6 숨참고백스텝 0 5 시간 전 148
119850 [정보] 요새 오디오 플레이어 다 거기서 거기인가? 4 번째 나날 0 5 시간 전 74
119849 [컴퓨터] 형님들 혹시 컴퓨터에선 블루투스 어떻게 해야 12 와나두5렙 0 6 시간 전 107
119848 [모바일] 노트8 공기계 팔려고하는데 6 신혜율 0 6 시간 전 130
119847 [컴퓨터] 파스 점수 ㄹㅇ 조진 듯... 왜이럼 7 클로로프렌 0 6 시간 전 131
서버에 요청 중입니다. 잠시만 기다려 주십시오...