프로그래밍

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
[삭제 되었습니다]
@구백육

수식을 미리 정의하고

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

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
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180487 [컴퓨터] 윈도우 ㅅㅂ 왜이러냐 바이러스 관련 업데이트 4 정병장기입원 0 5 시간 전 109
180486 [컴퓨터] 컴맹 데스크탑 견적하고 몇 가지 질문들 가능합니까? 9 Cat드립미어캣 0 5 시간 전 60
180485 [컴퓨터] SSD 파티션 쪼갰던거 하나로 합치는거 가능함? 4 기초플러스 0 7 시간 전 144
180484 [잡담] AR글래스 함 사봤음 (엔리얼 라이트) 6 빠빠양 3 9 시간 전 195
180483 [컴퓨터] 천마넌짜리 큰놈왔다 6 ᅠᅟᅠᅟᅟᅠᅟᅠ 1 10 시간 전 332
180482 [모바일] 폰에서 이런게 가능할줄 누가 상상했을까 1 Benetton 0 10 시간 전 210
180481 [잡담] 도킹스테이션사기 vs 스팀덱 사기 7 흑흑흑흑흙 0 11 시간 전 148
180480 [정보] 질문)갤탭s9울트라 샀는데 화면에 물결무늬 생겨요 불량 의심... 1 말이야방구야 0 11 시간 전 103
180479 [컴퓨터] 윈도우 정품 인증 질문 7 우루루옳지 0 12 시간 전 95
180478 [견적] 듀얼모니터 구성 하려는데 FHD vs QHD 뭐가 좋을까? 6 부산우유리 0 12 시간 전 93
180477 [컴퓨터] 긱바 보드 쿨러설정 영 별루네 1 베데엔차 0 12 시간 전 37
180476 [잡담] 고사양 컴퓨터 사서 옛날게임하는.eu 오브 1 13 시간 전 165
180475 [견적] 컴맹) 컴퓨터 업글하려는데 다나와에서 사면되지? 3 착한댓글달자 0 13 시간 전 80
180474 [견적] 컴퓨터 사양좀 올릴라는데 5 악플러보면고백박는놈 0 14 시간 전 97
180473 [견적] 그냥 조립식 컴터 살려구 하는데 괜찮은가 봐주세요 15 메카다나카 0 14 시간 전 162
180472 [컴퓨터] 모니터 삿다 9 or5469 0 14 시간 전 133
180471 [컴퓨터] 형님들 컴맹이 윈도우 관련 질문 드립니다 4 우루루옳지 0 18 시간 전 117
180470 [컴퓨터] 님들 랜선 연결 어케해요? 15 플랑크톤상점버거 0 21 시간 전 304
180469 [컴퓨터] 올그떠 보인다길래 삭제함 1 Benetton 0 1 일 전 188
180468 [잡담] wh xm4 끼고 자다가 오른쪽 박살남ㅠㅠ 8 곰문곰문곰문곰문... 0 1 일 전 355