" async="async"> ', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); 책 알려주는 남자 :: '프로그래밍' 카테고리의 글 목록

마지막 5주차에 도착했다. 5주차는 전반적으로 따로 무언가를 더 배우지는 않는다. 4주차에 한 강의 더 추가하기만 될 법한 내용을 굳이 따로내어서 앞부분에 조금 공부한 것을 제외하고는 전부 서버세팅하고 서버를 운영하기 위한 프로그램을 깔고 그를 위한 전문적인 명령어를 하거나 그게 전부다. 

 

서버를 위한 깃허브-ubuntu

어떤 역할인지는 알려주기는 한다만, 사실 내가 뭘하고 있는지 전혀 감이 오지 않았고 그런 내용이 주를 이룬 5주차 학습이였다. 한마디로 가장 지루하고 따분하며 배우는 보람이 전혀 느껴지지 않는, 도메인을 만든다는 의의와 달리 가장 무의미하게 느껴진 주였다.

 

도메인을 살 수 있는 gabia

가비아에서 특정조건으로 1년에 500원주고 도메인을 살 수 있다. 그 외에는 조금 비싸게 도메인주소를 사서 이용해야한다.

몇 없는 학습구간
서버를 구매해서 돌리는 AWS

생소함의 연속이여서 참 헷갈렸는데, 적지않은 요금이 나가기 때문에 무료인 한 달 이후로 요금이 안 나가게 잘 설정하자.

 

무언가에 쓰이는 FileZilla
세팅을 똑같이 하고서 명령어를 쓰지만 되지않는 나

 

결론부터 말하자면, 5주차 중간즘에서 하차했다. 원래 프론트엔드의 영역이 아무리 백엔드보다 문외한들이 입문하기에는 쉽다하지만 결국 전문가의 영역인 것은 변하지 않는 사실이다. 이런 영역에 바로 마주하면 갭차이에 포기하기 마련이다. 때문에 이전 주차들에서는 그런 영역에 발을 들이지만 들이지 않는 것처럼 가르치는 법이 필요하다. 한마디로 진입장벽이 높기 때문에 흥미를 잃지 않는 가르침이 필요하다.

 

중간에 하차해도 수료증은 나오더라

 

하지만 5주차는 거의 그대로 따라하기밖에 없다. 물론 이런 방법이 이전 주차에서 없었던 것은 아니지만, 이전 주차에서는 이런 모방으로 어떤 결과물이 나오고, 거기서 무엇을 조금 수정하면 어떻게 바뀔지 예상이나 추론이 가능했기에 어림짐작으로 내가 배우는 것들이 무엇인지 이해가 갔지만 5주차는 전혀 아니였다. 

5주차는 조금만 더하면 프로젝트 완결로 끝이지만, 계속 따라할수록 그리고 똑같이 따라해도 오류를 해결하기 위해 조금의 시행착오하는 순간마다 '내가 이걸 왜 하고 있지' 라는 현타가 계속 들었다. 게다가 그대로 따라한 뒤에 겪는 오류였기에 무언가 고치기위한 고민할 점도 전혀 없고 오직 Slack에 가서 문의하는 것밖에 없어서 무척 무의미한 순간들이였다. 어짜피 그대로의 모방이니 머리에도 남지 않는데 몇 안되는 개인시간에 학교공부하는게 더 낫지 않나라는 생각이 지배적이기도 했다.

 

웹개발 종합반을 잘 수료했다면 다른 학습도 하지 않았을까?

 

그렇다고 웹개발 종합반 자체가 별로라는 것은 아니다. 다른 주차에 비해 5주차가 별로였다는 것이 전반적으로는 초보자들이 입문하기에 적당한 난이도의 강의였다. 쓰다보니 이제야 알았는데 5주차에 단순한 서버설치, 세팅하기 이런 것 위주의 수업에 실망한 이유는 타 학생과의 결과물 차이였다.

과대광고 아니지만 뭐랄까 속은 기분이다

 

분명 광고에서는 여러분도 5주 뒤에는 이렇게 만들 수 있습니다라며 홍보하고 그 결과물들은 대단했지만 내가 5주동안 만든 결과물은 고작 시간을 파는 한 페이지짜리 도메인이 전부다. 즉, 5주동안 학습만 하는 것이 아니라 추가적으로 수업에서 배운 것들을 토대로 따로 프로젝트를 만들고 노력해야 위의 결과물들이 나오는 것이다. 나같이 시간을 더 낼 수 없거나 수업만 듣기에 바쁜 학생들은 한 페이지 짜리 상품파는 도메인 한 줄이 전부다. 뭐랄까 사기도 아니고 과대광고는 더더욱 아니지만, 조금은 속은 기분이기도 하다.

그럼에도 이번 약 50일간(2월18일 ~ 4월7일) 코딩마라톤은 나에게 나쁘지 않은 영향을 줬다. 바쁜 일상 속에서 틈틈히 배우고 학습해가는 즐거움을 다시 알려주었고, 내가 코딩을 처음 배울 때 느꼈던 흥미와 적성은 오로지 수학문제처럼 정답과 방식이 잡힌 코딩퀴즈였을 뿐, 코딩 그 자체엔 다소 적성도, 흥미도 전부 그리 높지 않음을 통보했다. 이로서 개발자의 길은 이제 고려대상이 아니게 되었고 내게 남은 선택지는 CPA 뿐이다.

 

비전공자의 개발자들은 대부분 이런 말로를 겪는다

 

코딩을 배우고 싶다면, 여전히 팀 스파르타를 추천하고 싶은 마음은 0주차 개발일지를 쓸 때나 지금이나 변함이 없다. 다만, 고소득 연봉의 개발자가 혹해서 ~~강의를 들으면 여러분도 고소득 개발자가 될 수 있어요! 이런 말에 현혹되어서 시작하는 사람은 다시금 생각하길 바란다. 회사에서는 급조된 개발자보다는 당연히 나름 검증된 전공자를 쓰는 게 합리적인 선택이고, 전공자와 비전공자의 차이는 줄어들기 어려울 것이다. 물론 비전공자가 더 노력하면 되겠지만, 전공자들의 4년학습을 뛰어넘는 6개월이나 1년학습이 과연 가능할까? 그리고 대기업에 붙는 전공자들도 당연히 노력할테고. 이런 광고에 혹해서 시작했던 자신의 탐욕을 반성하며 이만 5주차 개발일지를 마친다.  

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

다소 힘들었던 4주차 학습도 끝났다. 사실 3주차까지는 한 번만 들어도 90~100%이해가 갔었는데 이번주차부터는 두세번 들어도 80%도 듣기 어려웠을 정도로 난이도 상승이 확 체감됐다.

 

간편하게 서버를 만드는 파이썬

처음에 이렇게 서버를 쉽게 만들때만해도...4주차도 어렵지 않게 하겠거니...

 

쏟아지는 붉은색의 오류코딩

4주차 중반이후부터는 오류가 계속 뜨는데 강의를 보고 그대로 따라하는데도 해결이 안되서 다소 시간을 썼다. 나중에 알고보면 코딩이 아니라 import를 안해줘서 그런거여서 허망한 경우도 있었고

 

사실 아직도 저 4개의 쓰임이 외워지지 않았다

계속 할 때마다 설치하는 FPR4...

 

일상생활과 연결하여 사례를 들어주는 쌤

현재 내가 배우는 기능이 이렇게 일상생활에서 쓰이고 있었다. 당연하게만 생각하던 것들이 코딩으로 직접하려면 이리 어렵다니, 개발자로서의 적성은 없다고 조금씩 자각하는 중

 

이번주차 핵심코드 POST와 GET
매번 보는 거지만 볼 땐 참 쉬워보인다

4주차~5주차동안 4개의 프로젝트를 하는데 그 중 하나인 나홀로메모장을 4주차에서 한다. 그치만 그대로 따라하면 항상 우측처럼 오류가 생긴다. 평소에도 가용시간은 한정적인데 잦은 오류로, 4주차 완주가 더 느려졌다.

 

현재 숙제중이란 이름은 저 아래에 있다.

4주차 숙제는 이렇게 주문자 명단을 받는 것인데, 꽤나 어려웠다. 강의에서 주는 뼈대에 주문자 이름과 주소를 남기면 그대로 남아서 현재는 사람들의 어렵다, 이해안된다 등의 호소도 종종 보인다. 어떤 사람은 어느순간부터 이해가 아니라 억지로 우겨놓고 수업에 내가 끌려간다고 표현하던데 상당히 공감한다. 확실히 학교전공수업으로 100% 이해하면서 배우던 C+과는 달리 급하게 따라간다는 느낌이 있다. 내가 헛으로 몇년을 날리지 않았다면 이렇게 급하게 조기졸업하지 않고 시간들여서 응용소프트웨어 복수전공도 이수했을텐데라는 아쉬움이 또 한 번 남는다.

 

근데 나는 왜 명단이 안 뜰까?

그러나 이번에도 어김없이 주문자 명단이 뜨질 않는다. 그래서 이번에도 슬랙에서 도움을 찾았으나 해결은 되지 않았다.

 

이런 현상은 왜 발생되는걸까?

오랜시간과 피드백 끝에 완성은 됐는데 보다시피 튜터님의 화면에서는 잘 작성되고, 내 화면에서는 여전히 되지 않는다.
같은 코드인데 어느 컴퓨터에선 되고, 여기선 안되고 원인이 무엇인지 따지기엔 이미 들어간 시간이 많이 투입되었고, 마지막 답변이 퇴근을 하고 온뒤에 받아서인지 귀찮음이 쏟아져 해결 아닌 해결이지만 여기서 끝맺음했다.

야간 공장일과 병행해서인지 아니면 적성에 다소 맞지 않는건지 혹은 둘 다 인건지. 4주차의 학습은 점점 따라잡기 힘들게 느껴졌고, 0주차에서 느꼈던 흥미와 열정은 상당히 식어버린 상태이다. 5주차 8강까지만 들어도 수료증이 나와서 그냥 포기할까도 생각했지만 딱 마지막 주차만 남았다. 어떻게든 마무리하려한다.

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

3주차에는 파이썬과 몽고db, 3t를 이용해서 수업이 진행되었다. 강사님은 3주차가 사람들에게 가장 인기있고 즐거운 주차라고 하셨는데 솔직히 나에겐 전혀 아니였다.

 

3주차를 한마디로 설명하자면 크롤링. 그게 전부다

우선 파이썬 문법을 아주 조금만 배우는데, 아무리 내가 이전에 C+을 통해서 한 학기 공부했다지만 너무 문법적인 내용이 적었다. 비개발자를 위한 강의니 수박겉핥기란 느낌이 있긴했지만 최소한 가르치는 for문 하나만이라도 좀 상세하게 다뤘으면 어떨까 싶다.

 

3주차 숙제는 지니뮤직 크롤링하기

설치하는데에만 3주차 수업의 1/3을 차지하기 때문에 수업의 질이 떨어지는데, 중간중간 설치가이드가 없어서 해당오류로 시간도 조금 낭비된 것도 무척 아쉬웠다. 막상 3T도 설치만 해놓고 써먹지도 못한 커리큘럼도 이해되질 않았다.

 

이런저런 난항을 겪다가 완성한 숙제

수업 시간 외에 나온 것들은 구글링을 통해 완성할 수 있었다. 이번주차는 숙제말고는 전부 별로였던 주차로서 강사님이 3주차가 모두에게 호평이라고 말한 것 때문에 더 갭차이가 느껴져서 실망이었던 한 주였다. 4주차에는 좀 더 풍성하고 유익한 한 주차 수업이 되길 바란다. 얼마나 쓸 내용이 없었으면 사진이 5개도 안될까.

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

기초적인 자바스크립트를 배우는 2주차

2주차에는 JQuery와 하는 자바스크립트 그리고 오픈api를 이용한 자바스크립트를 배운다. 초장부터 저렇게 짧은 예제를 던져주는데 난이도도 적절하고 하나하나씩 기술을 배워가는 느낌이다

 

하다가 막히면 언제든지 질의응답 가능한 Slack

천천히 잘 따라가는데 3번 예제에서 막히고 말았다. 이럴땐 시간들여서 해답을 스스로 찾는 과정도 중요하다.
하지만 그 시간이 15분 이상이 된다면 허망한 오류일 가능성도 높기 때문에, Slack에 올려서 튜터님들 혹은 같이하는 동기들의 도움을 받는 것이 좋은 방법!

 

''(작은따옴표) 대신 ``(백틱)을 쓰니 문제 해결!

바로 즉답가능한 시간이 있고, 해당 시간이 아니여도 최소 24시간 내로 답변이 올라온다. 지금까지 Slack에 딱 두 번 올렸는데 보통 2시간 내로는 전부 답변이 와서 꽤 유용했다.

 

오픈API. 낯설어보이지만 우리 일상에서 자주 접한다

오픈API를 이용한 Ajax를 주로 공부하는데 이제 좀 뭔가 데이터를 만진다는 느낌이 들어서 재밌었다. 예전 학교에서 오픈api를 이용해서 조별과제를 진행한 조를 보았을 땐 정말 신기하고 대단하다는 생각밖에 안 들었는데, 지금보니 정말 간단한 것이였다. 나도 팀 스파르타를 미리 좀 만났더라면 ㅠㅠ

 

꼭 강의대로 할 필요도 없다! 내가 원하는 대로!

강의에서는 70이상에 빨간색을 넣는 것이였는데, 현재 70이상으로 하면 1개빼고 전부 빨개진다. 미세먼지가 점점 안 좋아지는구나 하고 체감했다. 게다가 보통과 나쁨 기준마저 바뀌어서 강의에선 나쁨이던 수치가 지금은 보통이기도 하다. 그래서 적절하게 70대신 100으로 바꾸고 추가적으로 gu_status를 넣어서 표기했다.

 

따릉이를 이용한 Quiz
랜덤 API를 통해 귀여운 고양이를 볼 수도 있다

그 외에 다른 Quiz도 하는데 고양이를 랜덤하게 띄우는 것이 신선했다. 1주차에 비해 이런 예제같은 문제들이 조금 많아지긴 했지만 여전히 좀 더 비중을 늘리면 좋지 않을까 생각한다. 아무래도 이런 유형들을 많이 알수록 유용하니까

 

1주차 HW에 달러환율만 넣으면 2주차 HW 끝!

2주차 숙제는 1주차 숙제에 비하면 상당히 간단했는데 아무래도 예제로 많이 배워서 그런지 숙제는 꽤 간단했다. 이전에 배운 내용들을 토대로 1주차에 비하면 훨씬 수월하고 빠르게 숙제를 끝마쳤다. 그런데 배운 것말고 다른 곳에서 문제가 생겼다.

 

5분만에 답변을 달아주신 조민수 미니튜터님

바로 왼쪽 문단에 환율이 닿지 않는다는 것. 아무리해도 몰라서 Slack에 남겼더니 금새 해결해주셨다. 내가 알기론 튜터는 스파르타에 고용된 강사나 교수님들이고 미니튜터는 기존 교육생들이 성장해서 타 교육생들을 도와줄 정도의 실력이 되면 자율적으로 모집받아 되는 것으로 알고있다. 이런 오류가 쉬운지 어려운지는 알 수 없으나 빠른 답변으로 내 시간을 아껴주셔서 무척 감사했다.

이것으로 조금 길었던 2주차도 끝이다. 사실 2주차는 저번주에 끝이 났어야 했는데 주말에 친구들을 본다고 빼먹는 바람에 한 주가 밀렸다. 야간 일도 피곤해서 낮시간에 학과공부를 하지 못해 밀린 것도 있고. 이번주는 수면관리를 좀 더 타이트하게 해서 진도가 밀리지 않게끔 해보자.

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

드디어 1주차를 마치고 쓰는 개발일기
강의자료를 보면 배운게 많은 것 같은데 이번주에 배운 것들은 하나의 사실로 귀결된다.

코딩을 직접하지 않고 대부분 부트스트랩(CSS), Border(CSS), 구글폰트, MDN 등에서 만들어진 코딩을 복사해와서 나에게 맞게 조금씩 수정해서 쓴다는 것

확실히 C+배울때처럼 이론을 일일히 배우고 직접 코딩하는건 첨부터 개발자로 나아가는 사람에게나 적합하고 대부분은 이런 식으로 시작하는게 진입장벽을 낮춰서 긍정적으로 느껴진다.

가장 처음 주어지는 실습인 로그인페이지 만들기

그렇다고 첨부터 다 복붙하지는 않고 쉽고 기초적인 것들은 조금씩 예제를 보면서 만드는데 의외였다. 우리가 쓰는 일반적인 페이지들의 단면이 이렇게 간단히 만들어지는구나.

 

1주차동안 가장 많이 방문한 사이트, 부트스트랩
여기서도 보이는 Hello, World!

본격적으로 부트스트랩에서 이것저것 빌려다가 만들 때부터 앞으로 만들어지는 제작방식에 대해 감이 잡히기 시작했다. 하지만 그것은 어디까지나 원리상으로만 이해한 것이였고 파이참으로 들어가면 여전히 어지러웠다. 나 대체 C+할 때는 왜 안 어지러웠지?

 

1주차에서 배운 이론수업 Javascript

1주차동안 배운 백앤드수업이 자바스크립트 기초문법이였는데 과거에 배우던 C+과 비슷해서 이해하는데 어렵지는 않았다. 프론트앤드도 재밌지만 백앤드가 확실히 수학문제 푸는 감각같아서 더 흥미로웠다. C+, 파이썬, 자바스크립트 모두 어느정도 비슷한 뼈대를 가지면서 조금씩은 다른 점을 알아가는 재미가 있었다.

 

1주차 첫 과제! 오른쪽 그림 같은 화면을 만들것

처음으로 마주하는 과제. 배우긴 배운 것 같은데 조금 가물가물한게 불안하다. 우선 답안지를 없이 최대한 할 수 있는 만큼 하자!

 

30분 뒤에 만들어진 결과물. 아직 처참하다

30분동안 예제와 지난실습에서 쓰인 코드들을 보면서 나름 뼈대를 완성했다고 생각했는데 예시랑 비교하니 조금 암담하다. 이번엔 1주차에서 배운 핵심인 부트스트랩에서 가져와서 살을 붙인다.

Button에서 첫문단을 그대로 복붙
주문과 관련된 항목들은 Input group과 Form에서 가져와서 만들었다

 

부트스트랩에서 가져다 수정했지만 별로 달라진게 없다?

그렇게 또 30분이 지났지만 별로 체감이 안된다. 몇 개 바뀌지 않았는데 내 시간은 대체 어디로 사라진거람. 이제 기존에 배운 것들을 세세하게 써먹는 시간이 왔것만 계속 헤매기만 하고 시행착오만 겪어서 이제 여기서 해설을 보면서 따라하기로 결정했다.

 

헷갈렸던 가격란. span을 이용해서 따로 글꼴설정을 해주는 것이 답이였다

 

가장 난해했던 수량 관련부문도 해설을 보면서 따라하니 오류를 바로잡을 수 있었다

 

드디어 완성된 최종본

해설지를 보면서 이해하고 붙여넣기만 했을 뿐인데도 시간이 꽤나 흘렀다. 그치만 이제 어떤 식으로 코딩을 해서 프론트앤드를 하는지 조금 가늠이 잡힌다. 코딩은 대략적으로 헤드와 바디로 나뉘며 핵심적인 코딩은 전부 바디에서 이루어진다. 그 외 부수적인 코딩들, 가령 글꼴이나 크기, 색깔, 위치, 알람 등은 전부 헤드에서 이루어진다. 바디와 헤드는 떨어져있기 때문에 헤드에서 코딩할 때, 바디에서 쓰인 코드들을 다시 쓸 필요없이 class라는 명칭만 이용해서 부수적인 코딩을 한다. 쉽게 구역을 나누고 구분하여 부수적인 코딩을 하기위해서 div를 쓰기도 하고.

 

본 강의 진도를 따라잡으면 이런 그림이 뜬다

다시 최종본을 보니 처음과는 달리 세련되고 깔끔하게 정돈된 모습에서 만족감이 느껴진다. 아직 기초 중의 기초만 했을뿐인데 조금 어려웠다만은 이렇게만 한다면 수강자들의 수려한 웹페이지들이 해볼만한 목표처럼 느껴진다. 생각보다 학기와 야간일을 병행하는 것이 널널하다. 웹개발 종합반을 무난하게 끝낸다면 앱개발 종합반도 고려해보자.

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

학교수업으로 ICT 융합스프트웨어 수업을 들은 나는 코딩을 하면서 꽤나 재밌고 적성에 맞았기 때문에 개발자의 길에 관심을 갖게 되었다. 코딩을 배울 수 있는 방법은 정말 많았다. 독학으로 공부하는 책부터 인강을 통한 온라인 수업 그리고 직접 찾아가서 본격적으로 부딪히는 부트캠프까지

 

코딩공부를 시작할 수 있는 여러 방법들

 

혼자 책으로 공부하기에는 문외한이기 때문에 단순한 시행착오에서 많은 시간을 뺏길 것이 염려되었고, 부트캠프로 직접 가자니 아직 개발자의 길이 확정된 것도 아닌데 너무 과한 비용과 시간을 쏟아붓는다고 생각되어 온라인 수업으로 결정했다.

하지만 온라인 수업을 듣는 플랫폼도 정말 많았기에 어떤 곳을 들어야하는지 고민이 되었다. 리뷰를 참조했지만 모든 플랫폼이 전부 복합적인 리뷰로 채워져 있어 그다지 영향력을 주진 못했다. 강의력이나 선생님들의 실력은 사실 내가 분간할 능력이 되지 않고, 이제 막 시작한 나에겐 아무리 실력이 낮은 선생님이여도 배우기에는 지장이 없을 것이라 여겨 이 또한 플랫폼 선택에 크게 고려되지 않았다.

 

혹독한 분위기의 이름과 달리 매우 친절하고 상세한 가이드가 있는 팀 스파르타

 

그러다 내가 팀 스파르타를 고르게 된 결정적인 이유가 생겼는데 바로 친절하고 상세한 가이드였다. 물론 다른 플랫폼도 초보자를 위한 가이드는 정말 많았지만 국비지원을 지원하는 것에서부터 가이드를 하나부터 열까지 해주는 곳은 팀 스파르타가 유일했다.

국비지원에 관심이 있었지만, 자세히 모르던 내게 다른 정보나 방법을 찾으러 갈 필요도 없이 상단 이미지에 있는 '내일배움단 합류하기' 하나만으로 쉽게 국비지원에 지원하여 수업을 듣게되었다. 시작도 전부터 이렇게 초보자들을 배려하는 곳이라면 나의 시간을 최대한 아끼면서 많이 배워갈 수 있을 것이라 생각하여 팀 스파르타를 최종선택했다. 문과생이지만 코딩을 시작하려는 나와 비슷한 처지의 사람들에게, 타사이트에서 대체불가능한 메리트를 느끼지 않았다면 이 곳을 적극추천하는 바이다.

 

0주차 수업화면. 수강생의 편의를 최대한 고려한 UI와 시스템들

 

처음 하다보니 깔아야하는 프로그램이나 가입해야하는 사이트들이 생소했지만 일일히 복붙링크가 담겨있는 코드스니펫.
수업에 보충적인 설명이나 코딩을 바로 볼 수 있는 설명란도 있고, 슬랙을 통해 많은 튜터 선생님들을 통해 자유로운 질문도 가능하다. 아직 0주차라 크게 체감되진 않았지만 앞으로 쏟아지는 문제들과 프로젝트들, 도구를 다룰 때 무척 유용할 것으로 예상된다.

 

좌측 상단 1주차에 앉아 있는 캐릭터가 나의 진도현황을 알려준다

 

그리고 매일 강의시작 전에 같은 기수들의 진도표를 한 눈에 확인할 수 있다. 필자는 22년 02월 21일 시작이였는데 야간에 바쁘게 일하다보니 뒤늦게 시작했다. 사실 지금도 주6일 출근에 평일낮엔 학과공부, 코딩공부는 오로지 일요일 하루만 할 계획이라 다소 빠듯한 생활이 예상되지만 지금까지 허망하게 소비한 과거의 시간들과 나를 생각하면 충분한 처사다. 

마지막으로 가능만 하다면 매주, 못해도 격주로 개발일지를 쓰고자 한다. 나는 본래 글을 좋아하고 책을 사랑하던 사람이것만, 너무 멀리 되돌아온 감이 있다. 그러나 춘추오패의 두번째 패주였던 진문공도 52세라는 늦은 나이에 유랑생활을 마치고 왕위에 올랐음에도 불구하고 누구도 넘보기 힘든 찬란한 패업을 이루지 않았던가. 다소 늦은 것은 부정할 수 없는 사실이나 그것이 좌절과 체념의 정당한 이유가 될 수는 없을 것이다. 이번 상반기에 팀 스파르타와 함께하는 코딩수업이 나에게 긍정적이고 도전적인 활력을 불어줄 것을 기원하며 글을 마친다.

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,



PA51(소수).pdf

#include <stdio.h>

#define HOWMANY 50000 


void processSieve(int[]);

int getLower();

int getUpper(int);

void showPrimes(int[], int, int);


int main()

{

int sieve[HOWMANY+1]; // The array of true/false

int lower = 1, upper = HOWMANY; 

 

  processSieve(sieve);

  lower = getLower();

  upper = getUpper(lower);

  showPrimes(sieve, lower, upper);

}


void processSieve(int sieve[HOWMANY+1]) // 1. 1~50000까지의 소수들을 구분 

{

int i, n;

for (n=2; n<HOWMANY; n++)

{

for(i=2; i<=n; i++)

{

if (n==i)

{

sieve[n]=1;

break;

}

else if (n%i == 0)

{

sieve[n]=0; 

break;

}

}

}

}


int getLower(void) // 2. 시작값 설정 

{

int lower;


do {

printf("Please enter the lower boundary (between 1 and 50000) ");

scanf("%d", &lower);

} while(lower<1 || lower>50000);

printf("\n");

return lower;

}


int getUpper(int lower) // 3. 끝값 설정 

{

int upper;

do {

printf("Please enter the upper boundary (between %d and 50000) ", lower);

scanf("%d", &upper);

} while(upper<=lower || upper>50000);

printf("\n");

return upper;

}


void showPrimes(int sieve[HOWMANY+1], int lower, int upper) // 4. 시작값과 끝값 사이에서 차이가 6인 것을 카운트 후 프린트 

{

int i, count=0;

printf("Here are all of the sexy prime pairs in the range %d to %d, one pair per line:\n", lower, upper);

for (i=lower; i<=upper-6; i++)

{

if(sieve[i]==1 && sieve[i+6]==1)

{

printf("%d and %d\n", i, i+6);

count++;

}

}

printf("There were %d sexy prime pairs displayed.", count);

}




PA52(회문).pdf

#include <stdio.h>


int reverse(int n);

void palindrome(int n); 


int main()

{

int n;

printf("Please enter a number: ");

scanf("%d", &n);

reverse(n);

palindrome(n);

return 0;

}


int reverse(int n)

{

int rn=0, i, o=0;

for(i=n; i>0; i/=10)

{

o = i%10;

rn = rn*10 + o;

}

return rn;

}


void palindrome(int n)

{

int count=0, i=0, rn=reverse(n);

for(i=n; i!=rn;  )

{

i += rn;

rn = reverse(i);

count++;

}

if (1000<count || i>2000000000)

printf("%d is not a panlindrome ");

else

printf("%d  %d", count, i);

}



PA53(지뢰).pdf


#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define ROW 100

#define COL 100


int n, m, i, j;

int count=0;

int a[ROW][COL]={0,};


void dis1mine (int n, int m, int a[][COL]);

void dis2mine (int n, int m, int a[][COL]);


void main()

{

srand((unsigned)time(NULL));

printf("지뢰밭의 행과 열의 크기를 입력하시오: \n");

scanf("%d %d", &n, &m);

printf("\n");

dis1mine(n, m, a);

dis2mine(n, m, a);

}


void dis1mine(int n, int m, int a[][COL])

{

for(i=1; i<n+1; i++)

{

for(j=1; j<m+1; j++)

{

a[i][j]=rand()%5;

if(a[i][j]==1)

printf("* ");

else

printf("·");

}

printf("\n");

}

printf("\n");

}


void dis2mine (int n, int m, int a[][COL])

{

for(i=1; i<n+1; i++)

{

for(j=1; j<m+1; j++)

{

count=0;

if(a[i][j]==1)

{

printf("* ");


}

else if(a[i][j]!=1)

{

if(a[i-1][j-1]==1) count++;

if(a[i-1][j]==1) count++;

if(a[i-1][j+1]==1) count++;

if(a[i][j+1]==1) count++;

if(a[i+1][j+1]==1) count++;

if(a[i+1][j]==1) count++;

if(a[i+1][j-1]==1) count++;

if(a[i][j-1]==1) count++;

printf("%d ", count);

}

}

printf("\n");

}

}


PA54(여행).pdf


#include <stdio.h>

#define STUDENT 1000


void main()

{

int i, n;

float sum=0, mean; 

float a[STUDENT]={0, };

printf("학생 수를 입력하시오: ");

scanf("%d", &n);

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

{

printf("쓴 금액 입력: ");

scanf("%f", &a[i]);

sum+=a[i]; 

}

mean = sum/n;

sum=0;

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

if(a[i]<mean)

sum+=mean-a[i];

printf("전달해야할 금액: %f", sum);

}


PA55(암호).pdf

#include <stdio.h>

#include <string.h>

#define ENTRY 1000

#define LENGTH 16

#define TEXT 80


void main(){

int n, i, j, count=0;

char dict[ENTRY][LENGTH];

char text[TEXT];

char *word1[ENTRY];

char *token;

char seps[]=" ";

char word2[ENTRY][LENGTH];

scanf("%d", &n);

fflush(stdin);

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

fgets(dict[i], sizeof(dict[i]), stdin);

dict[i][strlen(dict[i])-1]=NULL;

}

printf("\n");

fgets(text, sizeof(text), stdin);

text[strlen(text)-1]=NULL;

token=strtok(text, seps);

for(i=0; token!=NULL; i++){

word1[i]=token;

token=strtok(NULL, seps);

count++;

}

printf("\n");

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

for(j=0; j<n; j++){

if(strlen(word1[i])==3 && strlen(dict[j])==3)

strcpy(word2[i], dict[j]);

else if(strlen(word1[i])==6 && strlen(dict[j])==6)

strcpy(word2[i], dict[j]);

else{

if(word1[i][2]==word1[i][3] && dict[j][2]==dict[j][3])

strcpy(word2[i], dict[j]);

else if(word1[i][3]== dict[j][3] && word1[i][1]=='q' && dict[j][1]=='p')

strcpy(word2[i], dict[j]);

else if(word1[i][3]== dict[j][2])

strcpy(word2[i], dict[j]);

else if(word1[i][0]=='b' && dict[j][0]=='d')

strcpy(word2[i], dict[j]);

}

}

}

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

printf("%s ", word2[i]);

}

}


PA56(투표).pdf

#include <stdio.h>

#include <string.h>

#define VOTER 1000

#define NAME 80

#define ENTRY 20


void main(){

int i, j, n, result=1;

int max=0, min=0;

int vote[VOTER][ENTRY];

char cdd[ENTRY][NAME];

scanf("%d", &n);

fflush(stdin);

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

fgets(cdd[i], sizeof(cdd[i]), stdin);

cdd[i][strlen(cdd[i])-1]=NULL;

}

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

for(j=0; j<n; j++)

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

do{

int sum[ENTRY]={0};

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

if(vote[i][0]>0)

sum[vote[i][0]-1]++;

else

sum[vote[i][1]-1]++;

}

for(j=0; j<n; j++){

if(sum[max]<sum[j])

max=j;

if(sum[min]>sum[j])

min=j;

}

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

if(vote[i][0]==min+1)

vote[i][0]=-1;

if(sum[max]> 5.0/2.0)

result=0;

}while(result!=0);

printf("\n");

printf("%s", cdd[max]);

}


PA57(은행).pdf

#include <stdio.h>

#define SIZE 8

void in(int queue);

void out(int queue);


int queue[SIZE]={1, 2, 3, 4, 5, 6, 7, 8, 9};

int front=-1, rear=-1;


int main(){


int n, result=1;

do{

printf("input number: ");

scanf("%d", &n);

if(n==-1)

result=0;

else if(n!=0)

in(queue);

else if(n==0)

out(queue);

}while(result!=0);

return 0;

}


void in(int queue){

front++;

if(front>=8)

printf("queue full!\n");

}


void out(int queue){

rear++;

if(front==rear || rear>=8)

printf("queue empty!\n");

else

printf("[%d]\n", rear+1);

}


PA58(도둑).pdf

#include <stdio.h>

#define ROW 10

#define COL 20


void main(){

int i, j, col, weight;

float temp0, temp1, temp2, temp3;

int temp=0, result=0;

int sum_value=0, sum_weight=0;

int sum_v1, sum_v2, sum_w1;

int stolen[COL]={0};

float bag[ROW][COL];

scanf("%d %d", &col, &weight);

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

for(j=0; j<col; j++)

scanf("%f", &bag[i][j]);


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

bag[2][i]=bag[0][i]/bag[1][i];

bag[3][i]=i;

}

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

for(j=0; j<col-1; j++){

if(bag[2][j]<bag[2][j+1])

{

temp2=bag[2][j];

bag[2][j]=bag[2][j+1];

bag[2][j+1]=temp2;

temp3=bag[3][j];

bag[3][j]=bag[3][j+1];

bag[3][j+1]=temp3;

temp0=bag[0][j];

bag[0][j]=bag[0][j+1];

bag[0][j+1]=temp0;

temp1=bag[1][j];

bag[1][j]=bag[1][j+1];

bag[1][j+1]=temp1;

}

}

}

do{

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

if(sum_weight+bag[1][i]>weight){

sum_v1=sum_value-bag[0][i-1]+bag[0][i];

sum_w1=sum_weight-bag[1][i-1]+bag[1][i];

if(sum_v1>sum_value && sum_w1<=weight){

sum_value=sum_v1;

sum_weight=sum_w1;

stolen[i-1]=0;

stolen[i]=bag[3][i];

result=1;

}

else 

result=1;

}

else if (sum_weight==weight)

result=1;

else{

sum_value+=bag[0][i];

sum_weight+=bag[1][i];

stolen[i]=bag[3][i];

}

}

}while(result==0);

printf("\n");

printf("Max value: %d\n", sum_value);

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

for(j=0; j<col-1; j++){

if(stolen[j]>stolen[j+1]){

temp=stolen[j];

stolen[j]=stolen[j+1];

stolen[j+1]=temp;

}

}

}

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

if(stolen[i]!=0)

printf("%d ",stolen[i]);

}


PA59(문자열).pdf


#include <stdio.h>

#include <string.h>

#include <stdlib.h>


char str1[100];

char str2[100];

float num2;

int i, num1;


void reverseString (char *str);

void getString (char *str);

int compareString (char *strl, char *str2);

int strToInteger (char *str);

float strToFloat (char *str);


int main(){

getString(str1);

getString(str2);

reverseString(str1);

reverseString(str2);

printf("\n");

if(compareString(str1, str2)==1)

printf("Two strings are same\n");

else if(compareString(str1, str2)==0)

printf("Two strings are not same\n");

printf("\n");

compareString(str1, str2);

num1=strToInteger(str1);

printf("The integer string is: %d\n", num1);

printf("\n");

num2=strToFloat(str2);

printf("The float string is: %0.2f\n", num2);

printf("Number [%d] + Number[%0.2f] is %0.2f\n", num1, num2, (float) num1+num2);

}


void reverseString (char *str){

int length=0;

char temp;

for(i=0; str[i]!=NULL; i++)

length++;

for(i=0; i<length/2; i++){

temp=str[i];

str[i]=str[length-1-i];

str[length-1-i]=temp;

}

printf("The reverse order of the first string is: %s\n", str);

}


void getString (char *str){

printf("Please enter your string: ");

gets(str);

printf("The string you first entered is: %s\n", str);

printf("\n");

}


int compareString (char *strl, char *str2){

int count=0;

int result;

for(i=0; str1[i]!=NULL; i++)

if(str1[i]!=str2[i])

count++;

if(count==0) result=1;

else result=0;

return result;

}


int strToInteger (char *str){

int result=0, negative=1;

printf("Please enter your integer string: ");

gets(str);

if(*str=='-'){

negative=-1;

str++;

}

while(*str){

result = result*10 + *str - '0';

str++;

}

return result*negative;

}


float strToFloat (char *str){

float result1=0.0, result2=0.0, j=1;

int negative=1;

printf("Please enter your float string: ");

gets(str);

if(*str=='-'){

negative=-1;

str++;

}

while(*str!='.' ){

result1 = result1*10 + *str-'0';

str++;

}

if(*str=='.'){

str++;

while(*str){

result2 = result2*10 + *str-'0';

str++;

j*=0.1;

}

}

return (result1+result2*j)*negative;

}


PA60(월도르프).pdf



'프로그래밍' 카테고리의 다른 글

LAB WEEK#8 Array  (0) 2018.11.05
LAB WEEK#7 Function  (0) 2018.10.31
블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

13장 Programming


1.

#include <stdio.h>


struct point{

int x, y;

};


int equal (struct point p1, struct point p2){

if(p1.x==p2.x && p1.y==p2.y)

return 1;

return 0;

}


int quadrant(struct point p){

if(p.x>0 && p.y>0)

return 1;

else if(p.x<0 && p.y>0)

return 2;

else if(p.x<0 && p.y<0)

return 3;

else if(p.x>0 && p.y<0)

return 4;

}



int main(){

struct point p1, p2;

printf("점의 좌표를 입력하시오: ");

scanf("%d,%d", &p1.x, &p1.y);

printf("점의 좌표를 입력하시오: ");

scanf("%d,%d", &p2.x, &p2.y);

if(equal(p1, p2)==1) 

printf("두 점은 일치합니다\n");

else 

printf("두 점은 일치하지 않습니다\n");

printf("첫번째 점은 %d사분면에 있습니다\n", quadrant(p1)); 

printf("두번째 점은 %d사분면에 있습니다\n", quadrant(p2));


return 0;

}


2.

#include <stdio.h>


struct point{

int x, y;

};


int equal (struct point *p1, struct point *p2){

if(p1->x==p2->x && p1->y==p2->y)

return 1;

return 0;

}


int quadrant(struct point *p){

if(p->x>0 && p->y>0)

return 1;

else if(p->x<0 && p->y>0)

return 2;

else if(p->x<0 && p->y<0)

return 3;

else if(p->x>0 && p->y<0)

return 4;

}



int main(){

struct point p1, p2;

printf("점의 좌표를 입력하시오: ");

scanf("%d,%d", &p1.x, &p1.y);

printf("점의 좌표를 입력하시오: ");

scanf("%d,%d", &p2.x, &p2.y);

if(equal(&p1, &p2)==1) 

printf("두 점은 일치합니다\n");

else 

printf("두 점은 일치하지 않습니다\n");

printf("첫번째 점은 %d사분면에 있습니다\n", quadrant(&p1)); 

printf("두번째 점은 %d사분면에 있습니다\n", quadrant(&p2));


return 0;

}


3.

#include <stdio.h>


typedef struct {

int x, y;

} Point;


typedef struct {

Point a, b

} Rectangle;


int area(Rectangle r);

int perimeter(Rectangle r);

int is_square(Rectangle r);


void main(){

Rectangle r;

printf("오른쪽 상단 점의 좌표: ");

scanf("%d,%d", &r.a.x, &r.a.y);

printf("왼쪽 하단 점의 좌표: ");

scanf("%d,%d", &r.b.x, &r.b.y);

printf("사각형의 넓이: %d\n", area(r));

printf("사각형의 둘레: %d\n", perimeter(r));

if(is_square(r)==1)

printf("정사각형입니다\n");

else

printf("정사각형이 아닙니다\n"); 

}


int area(Rectangle r){

return (r.a.x-r.b.x)*(r.a.y-r.b.y); 

}


int perimeter(Rectangle r){

return ((r.a.x-r.b.x)+(r.a.y-r.b.y))*2;

}


int is_square(Rectangle r){

if((r.a.x-r.b.x)==(r.a.y-r.b.y))

return 1;

return 0;

}


4.

#include <stdio.h>


typedef struct {

double real;

double imag;

} Complex;


void add_complex(Complex x, Complex y);


void main(){

Complex x, y;

printf("첫 번째 복소수의 실수부: "); scanf("%lf", &x.real);

printf("첫 번째 복소수의 허수부: "); scanf("%lf", &x.imag);

printf("두 번째 복소수의 실수부: "); scanf("%lf", &y.real);

printf("두 번째 복소수의 허수부: "); scanf("%lf", &y.imag);

add_complex(x, y); 

}


void add_complex(Complex x, Complex y){

printf("합의 실수부: %lf\n", x.real+y.real);

printf("합의 허수부: %lf\n", x.imag+y.imag);

}


5.

#include <stdio.h>


typedef struct{

double x, y;

} Vector;


void add_vector(Vector v1, Vector v2);


void main(){

Vector v1, v2;

printf("벡터 a의 좌표: ");

scanf("%lf,%lf", &v1.x, &v1.y);

printf("벡터 b의 좌표: ");

scanf("%lf,%lf", &v2.x, &v2.y);

add_vector(v1, v2);

}


void add_vector(Vector v1, Vector v2){

printf("벡터 a+b = (%0.2lf,%0.2lf)", v1.x+v2.x, v1.y+v2.y);

}


6.

#include <stdio.h>


typedef struct {

char title[30];

char toname[20];

char byname[20];

char text[100];

char date[20];

int primary;

} Email;


void main(){

Email x;

printf("제목: ");

gets(x.title);

printf("수신자: ");

gets(x.toname);

printf("발신자: ");

gets(x.byname);

printf("본문: ");

gets(x.text);

printf("보낸날짜(yymmdd): ");

gets(x.date);

printf("우선순위: ");

scanf("%d", &x.primary); 

}


7.

#include <stdio.h>


typedef struct{

char name[100];

int calories;

} Food;


void add_calories(Food info[], int count);


void main(){

Food info[10];

int i=0, count=0;

char an;

while(1){

printf("음식정보를 저장하시겠습니까?(y/n)");

scanf("%c", &an);

fflush(stdin);

if(an=='n')

break; 

printf("음식이름: ");

gets(info[i].name);

printf("칼로리: ");

scanf("%d", &info[i].calories);

fflush(stdin);

i++;

count++;

}

add_calories(info, count);

}


void add_calories(Food info[], int count){

int i, sum=0;

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

sum+=info[i].calories;

printf("총 칼로리는 %d입니다", sum);

}


8.

#include <stdio.h>


typedef struct{

int id_number;

char name[20];

int ph_number;

int age;

} Employee;


void main(){

Employee people[10];

int i, count=0;

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

printf("%d번째 직원정보\n", i+1);

printf("사원번호: "); scanf("%d", &people[i].id_number);

fflush(stdin);

printf("이름: "); gets(people[i].name);

printf("전화번호: "); scanf("%d", &people[i].ph_number);

printf("나이: "); scanf("%d", &people[i].age);

}

printf("\n");

printf("나이가 20이상 30이하인 직원\n");

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

if(people[i].age>=20 && people[i].age<=30){

puts(people[i].name);

count++;

}

printf("해당 총인원: %d명\n", count);

}


9.

#include <stdio.h>

#include <string.h>

 

typedef struct {

    char name[20];

    char homeNum[20];

    char phoneNum[20];

} Book;


void main() {

    Book number[5];

    char search[20];

    int i;

    char an;

 

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

        printf("%d번째 전화번호부\n", i+1);

        printf("이    름 : ");        gets(number[i].name);

        printf("자택번호 : ");        gets(number[i].homeNum);

        printf("휴대전화 : ");        gets(number[i].phoneNum);

    }

    printf("\n");

 

    do {

        printf("이름을 검색하시오 : ");

        gets(search);

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

            if(strcmp(search, number[i].name) == 0) {

                printf("자택번호 : %s \n", number[i].homeNum);

                printf("휴대전화 : %s \n", number[i].phoneNum);

                printf("\n");

            }

        }

        printf("계속 찾으시겠습니까?(y/n) : ");

        scanf("%c", &an);

        fflush(stdin);

    } while(an != 'n');

}



10.

#include <stdio.h>

#include <stdlib.h>

#include <time.h> 

#define SIZE 52


typedef struct {

int value;

char suit;

} Card;


void init_card(Card pack[], char shape[]);

void print_card(Card pack[], int size);

void shuf_card(Card pack[], int size);


void main(){

Card pack[SIZE];

char shape[]={'c', 'd', 'h', 's'};

init_card(pack, shape);

printf("카드가 초기화 되었습니다.\n");

print_card(pack, SIZE); 

printf("\n");

shuf_card(pack, SIZE);

printf("카드를 섞었습니다.\n");

print_card(pack, SIZE);

printf("\n");

}


void init_card(Card pack[], char shape[]){

int i, j, count=0;

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

for(j=0; j<13; j++){

pack[count].value=j+1;

pack[count].suit=shape[i];

count++;

}

}

}


void print_card(Card pack[], int size){

int i, j;

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

printf("%3d%c", pack[i].value, pack[i].suit);

if((i+1)%13==0)

printf("\n");

}

}


void shuf_card(Card pack[], int size){

int i, j;

srand((unsigned)time(NULL));

Card temp;

for(i=0; i<size-1; i++){

j=rand()%(size-i)+i;

temp = pack[i];

pack[i] = pack[j];

pack[j] = temp;

}

}


11.

#include <stdio.h>

#define PI 3.14

#define SIZE 10


typedef struct {

int type;

union {

struct { double base, height; } tri;

struct { double width, height; } rect;

struct { double radius; } circ;

} shape;

} Figure;


void main(){

Figure data[SIZE];

int i=0;

char an;

do{

printf("저장하려는 도형의 종류를 입력하시오(0=삼각형, 1=사각형, 2=원): ");

scanf("%d", &data[i].type);

fflush(stdin);

switch(data[i].type){

case 0 : 

printf("삼각형의 밑변: "); scanf("%lf", &data[i].shape.tri.base);

printf("삼각형의 높이: "); scanf("%lf", &data[i].shape.tri.height);

i++;

break;

case 1 : 

printf("사각형의 밑변: "); scanf("%lf", &data[i].shape.rect.width);

printf("사각형의 높이: "); scanf("%lf", &data[i].shape.rect.height);

i++;

break;

case 2 : 

printf("원의 반지름: "); scanf("%lf", &data[i].shape.circ.radius);

i++;

break;

default:

printf("숫자를 0~2사이 값을 입력하시오\n");

fflush(stdin);

printf("더 저장하시겠습니까?(y/n)\n");

scanf("%c", &an);

} while(an!='n');

}



12.

#include <stdio.h>

#include <string.h>

#define SIZE 20


typedef struct {

char title[20];

char singer[20];

int class;

} Music;


int i;

int num[SIZE]={0};


void add_music (Music* list);

void print_music (Music* list);

void search_music (Music* list, int size);

void delete_music (Music* list);


void main(){

Music list[SIZE];

int n, result=1;

printf("======================\n");

printf(" 1. 추가(ADD)\n");

printf(" 2. 출력(PRINT)\n");

printf(" 3. 검색(SEARCH)\n");

printf(" 4. 삭제(DELETE)\n");

printf(" 5. 종료(EXIT)\n");

printf("======================\n");

while(result==1){

printf("메뉴를 선택하시오: ");

scanf("%d", &n);

fflush(stdin);

switch(n) { 

case 1: 

add_music(list);

break;

case 2:

print_music(list);

break;

case 3: 

search_music(list, SIZE);

break;

case 4:

delete_music(list);

break;

case 5:

result=0;

}

}


void add_music(Music* list){

do{

printf("1번부터 %d번까지 트랙이 있습니다. 몇 번 트랙에 저장하시겠습니까?", SIZE);

scanf("%d", &i);

fflush(stdin);

if(num[i-1]==1)

printf("이미 저장되어있는 트랙입니다. 다른 트랙번호를 입력하시오\n");

} while(num[i-1]==1);

printf("제목: "); gets(list[i-1].title);

printf("가수: "); gets(list[i-1].singer);

printf("종류(팝=0, 재즈=1, 클래식=2, 락=3): "); scanf("%d",&list[i-1].class);

fflush(stdin);

num[i-1]=1;

printf("\n");

}


void print_music(Music* list){

do{

printf("몇 번 트랙의 음악정보를 출력하시겠습니까? ");

scanf("%d", &i);

if(num[i-1]==0)

printf("해당 트랙엔 저장된 음악정보가 없습니다. 다른 트랙번호를 입력하시오\n");

} while(num[i-1]==0);

printf("제목: %s\n", list[i-1].title);

printf("가수: %s\n", list[i-1].singer);

switch(list[i-1].class){

case 0: printf("종류: 팝\n"); break;

case 1: printf("종류: 재즈\n"); break;

case 2: printf("종류: 클래식\n"); break;

case 3: printf("종류: 락\n"); break;

}

printf("\n"); 

}


void search_music(Music* list, int size){

char searchName[20];

printf("검색하고자 하는 노래 제목을 입력하시오: ");

gets(searchName); 

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

if(strcmp(searchName, list[i].title)==0){

printf("제목: %s\n", list[i].title);

printf("가수: %s\n", list[i].singer);

switch(list[i].class){

case 0: printf("종류: 팝\n"); break;

case 1: printf("종류: 재즈\n"); break;

case 2: printf("종류: 클래식\n"); break;

case 3: printf("종류: 락\n"); break;

}

}

else {

printf("찾으시는 노래가 없습니다\n");

break; 

}

}

printf("\n");

}


void delete_music(Music* list){

do{

printf("몇 번 트랙의 음악정보를 삭제하시겠습니까? ");

scanf("%d", &i);

if(num[i-1]==0)

printf("해당 트랙엔 저장된 음악정보가 없습니다. 다른 트랙번호를 입력하시오\n");

} while(num[i-1]==0);

num[i-1]=0;

printf("%d번 트랙의 음악정보가 삭제되었습니다\n", i-1);

printf("\n");

}

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

13장 Summary


구조체와 배열의 차이점은 묶는 료형들의 일치여부이다.

구조체는 키워드 struct으로 선언하고 공용체는 union, 열거형은 enum으로 선언한다.

구조체의 선언만으로 변수가 만들어지는가? 아니다. 따로 변수의 선언이 필요하다

구조체를 가리키는 포인터 p를 통하여 구조체 안의 변수 x를 참조하는 수식은
(*p).x 또는 p->x
이다.

원본 구조체를 포인터로 함수에 전달하는 경우, 원본 구조체를 훼손하지 않게 하려면 어떻게 하면 되는가? const 키워드가 포인터 앞에 있으면 이 포인터가 가리키는 구조체의 값을 변경하려고 하면 오류메시지가 뜬다. 즉 원본수정이 불가능하게 되어 원본이 훼손되지 않는다


 union data{

   double d;
   int i;

  };

union 은 다른 타입의 변수들이 동일한 기억 공간을 공유할 수 있도록 만든 것이다. 때문에 동시에 모든 멤버 변수들의 값을 저장할 수 없으며 어떤 순간에는 하나의 멤버만 존재할 수 있다


  enum color { red, green, blue};

  enum color favorite = red; 

enum 은 정수형 상수값들을 나열해 놓은 자료형이다.

#define 대신에 열거형을 사용하는 장점은 무엇인가? 특정한 숫자 대신 기호를 사용함으로써 프로그램의 이해도를 향상 시킬 수 있고, 변수가 열거된 값 이외의 값을 취하는 것을 막아서 오류를 줄여준다


   typedef long int BIGINT;

   BIGINT i; 

새로운 자료형을 정의하기 위하여 사용되는 키워드는 typedef이다.

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

13장 Exercise


1. 구조체를 정의하고 c1이라는 이름의 구조체 변수를 정의하시오.

struct customer {

char name;

int post_num;

long mileage;

};

struct customer c1;


2. T/F

(a) 구조체를 선언하면 자동으로 변수가 생성된다. F
(b) typedef은 변수를 선언하는 키워드이다. F, 변수가 아니라 자료형이다
(c) 구조체는 ==연산자를 사용하여 비교할 수 있다. T
(d) 구조체를 함수로 전달하면 원본이 전달된다.   F, 복사본이 전달된다
(e) 구조체 변수는 =연산자를 이용하여 대입될 수 있다. T

비고) 대입의 경우 p1=p2나 p1.x=p2.x, p1.y=p2.y 모두 가능하다. 하지만 비교의 경우 p1==p2는 불가능하고 p1.x==p2.x && p1.y==p2.y 가 가능하다


3. Employee 구조체로 정의된 변수 e에는 salary라는 필드가 있다. 이 필드를 올바르게 참조한 것은?

②e.salary


4. 포인터 p는 Employee 구조체로 정의된 변수 e를 가리킨다. 올바르게 참조한것은?

① p->salary ③ (*p).salary


5. 다음 열거형의 정의를 보고 각 식별자의 정수값을 예측하여 보라.

enum colors {white, red=3, blue, green, black=9 };

 식별자 

 white 

 red 

 blue 

 green 

 black 

 값

 0

 3 

 4 

 5 

 9 

비고) 0부터 혹은 지정된 값으로부터 자동적으로 1씩 증가한다.


6. 다음과 같은 구조체 정의가 있는 경우에 올바른 문장을 모두 골라라

   struct STU{

        char name[30];
        int id;

    } s; 

 ①②③⑤⑦⑧⑥


7. 잠시 컴파일러가 되어보자. 다음 코드에서 오류가 있는 것은?

   union id{

        char name[4];

        long number;

   } var={"Tom", 1}; 

초기화 할 시 한 번에 하나의 멤버만 사용이 되기 때문에  첫 번째 멤버만 초기화된다. 따라서 var={"Tom"}; 으로 바꾸어야 한다.


8. 다음의 설명에 부합하는 구조체를 정의하여 보라.

(a) char title[30]과 int pub_date, pages, price를 포함하는 구조체 book

struct book{

      char title[30];
      int pub_date;
      int pages;
      int price;

};

(b) char name[30], int age, double height를 포함하는 구조체 friend

struct friend{

      char name[30];
      int age;
      double height;

};

(c) 이름, 수량, 가격으로 부품 재고를 표현하는 구조체 part 정의

struct part{

      char name[20];
      int ea;
      int price;

};


9. 다음의 설명에 부합하는 열거형을 정의하여 보라

(a) 빛의 3원색을 표현하는 열거형 primary_color

enum primary_color { RED, GREEN, BLUE };

(b) 12달을 표현하는 열거형 months 정의

enum months { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};

  


10. 다음 코드가 오류를 가지고 있는지를 먼저 분석하고 오류가 있다면 어떤 오류인지 설명하라.

 (a) 

 struct book{

    char title[50];
    int pages;

 };

 book.pages = 512;


 struct book{ 

    char title[50];
    int pages;

 }; book;

 book.pages = 512;


 (b) 

 struct book{

     char title[50]="Data Structures";
     int pages = 577;

 } abook;

 struct book{

      char title[50];
      int pages;

 }; abook = {"Data Structures", 577};

 (c)

 typedef enum { red, green, blue } color;

 color.red = 1;

 typedef enum color { red=1, green, blue };

 (d)

 struct fraction {

     int num;
     int den;

  } *p;

  *p->num = 3;
  *p->den = 5;

 struct fration {

      int num;
      int den;

 } s = {3, 5};

 struct fration p;

 p=&s;



블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,