달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

아트메가 밝히기 : volatile, 반복문

문제 : LED 8개를 이용하여 불을 하나씩 오른쪽으로~왼쪽으로~  움직여 보시오.

풀이 :

-          Volatile 쓰는 이유 : for ~넘어가게 하지 않기 위해서. Cpu 최적화를 하기 때문에 volatile 써주면..for문이 하는 일이 없다고 보고 uicnt=65000 바로 넣어버려, 반복문을 넘어가게 된다.

 

 

참고로 16 Mhz이기 때문에..6 오천이면… 6.5/16 만에 반복문 하나를 수행하는 .

그래서 4개를 써주면  6.5*4해서 1.3 만에 움직이게 있다.

그럼..얼마나 움직이게 것인가..

Led 개의 주소는 2 뛰므로 곱하기 2 것이다.

 

 

그리고 중요한 조건식.

본인은..’dir’라는 변수를 이용했다.

변수로 불빛이 움직여야 방향 (, 불이 들어와야 led 주소값) 판별해 준다.

그리고 범위는 128(1 led) 0(8  led)으로 지정해 준다.

 

이상으로 아트메가 밝히기 : volatile, 반복문

보았다.

 

Posted by C언어 보이
|

반복문을 사용하여 이차원 배열의 값을 회전시키는 문제 입니다.

문제 : 4*4배열을 선언하여 아래처럼 값을 회전시켜라.

 

 

위 배열을 icount[4][4]로 하여 값을 대입합니다.

밑에 newcount[4][4] 배열은 훗날 (int the future!ㅋ), icount를 회전시킨 값을 넣습니다.

그리고 그 아래 메인에서 반복문이 2개가 보이네요…

첫 번 째 반복문은 icout 배열의 초기상태를 출력하는 용도입니다.

그 아래 반복문은, 회전시킬지 말지를 입력받는 것입니다.

즉, change함수를 부르는 조건입니다.

 

 

인제 문제의 핵심인 change 함수를 보기로 할까요?

말까요?

봅시다! change함수는 한 번 호출될 때 마다 icount 배열의 값이 90도씩 회전하여 대입시키는 데요.

그 구조를 크게 요약하면..icount[i][j]값을 icount[i][j]에 입력하는 것이 아닙니다. 그렇게 되면...값이 덮어써져 버려요.

그래서 그와 같은 icount 배열은 쓰는 용도, newcount 배열은 값을 불러오는 용도가 되는 것이죵. 그럼 더 자세히 봅시다..

우선 위의 첫번 째 반복문..그 안에 있는 반복문 실행식이 핵찜! 입니다.

Icount[j][3-i]. 요 식을 자알~생각해 보세요. 긴 설명은 의미가 없을 것 같네요.

 

그 아래 반복문은 출력 및, newcount 업데이트용 반복문 입니다.

업데이트용? 다음 번 change함수 실행(윗 반복문)에서 값의 대입을 위한 것 입니다.

 

이상으로 배열값의 이동 : 반복문, 이차원 배열에 대하여 알아보았습니다.

추천, 링크 많이 많이 눌러주세요~ㅋ

Posted by C언어 보이
|

Apple,banana,tomato라는 문자열들의 각 글자를 caStr에 넣어 출력을 하는 것이다.

아래 코드에서는 일일이 수동대입을 하고 있다. 개 노가다다ㅜㅜ

성실함은 인생을 불행하게 함으로. 아래 노가다 코드를 반복문으로 바꾸어 보자.

 

 

간단히 요약하면, '과일이름'이라는 문자열의 주소를 배열로 만들었다. 즉, 포인터 배열을 활용하였다.

* 포인터 배열을 쓰지 않고 하는 것이 훨씬 쉽다. 다만, 나름데로의 장점 (과일의 개수변동, 과일명칭 길이 변동 등에 대한 코드 수정이 용이)이 있어 이와 같이 하였다. 님이 초심자이거나 코드가 더러워서 어렵게 보인다면…apple문자 넣는 반복문, banana용 반복문, tomato용 반복문 등을 따로 따로 만들기를 강추!!!!! 하는 바이다. 그리고 fruit[]같은 과일 배열 (과일이름이 원소. 즉, 포인터 배열)을 안 써도 된다.).

다시 말하지만, 아래 코드는 해석하기 어려우므로 임산부나 초심자는 이쯤에서 포기해라 (이리 말해주면 승부욕 발동될 걸 잘 안다 ㅋ).

 

상세한 풀이는 아래와 같다.

  1. 특징 : Fruit[]이라는 배열에 과일명칭 문자열의 주소(cpApple,cpBanana,cpTomato)를 원소로 삽입한다.

    향후 과일이 추가될 때에는, 이 배열의 원소만 추가시키면 된다.

  2. 기본설명 : fruit[1]+fruitcharnum(0)은 "apple"의 'a'의 주소. fruit[1]+fruitcharnum(1) 은 "apple"의 'p'의 주소이다.
  3. 변수사용

    Straddrnow: 아래 반복문에서 casstr[]배열에 원소를 지정하기 위해서이다.castr[straddrnow]='글자' 식으로 쓴다.

    Fruitnow: 아래 반복문에서 caStr에 대입할 과일을 지정하는 수이다. Fruitnowp=fruit[fruitnowp]+fruitcharnum;

                                 castr[straddrnow]=*fuitnowp; 식으로 쓴다.

    Fruitnum : 과일의 개수. fruit[]배열의 길이가 자동으로 구해진다.

 

  1. 반복문
    1. if실행식 (문자대입식) : 맨 처음 fruitnow=0, fruitcharnow=0이다. 따라서, 'Fruitnowp=fruit[fruitnow]+fruitcharnum'에서 fruit[fruitnowp]가 fruit[1]의 된다. Fruit[1]은 "banana"의 주소(즉,'b'의 주소)이므로, if문 안에서 castr[0]에는 *(fruit[1]의 주소="banana"의 주소='b'의 주소)가 들어간다.
    2. 문자대입 조건 : if문은 ' *fruitnowp가 null 아닐 때'를 조건으로 한다. apple에서 e뒤에는 null 들이 있다. 따라서 e를 넣고 난 후에 다음 반복문 수행시에는 e다음의 널이 와서, else문을 수행하게 된다.
    3. Else 실행식 (대상과일 변경, 초기화): e다음에 널이 왔다는 것은 과일이름 하나를 다 넣었다는 것이다. 따라서 다음 과일로 넘어가기 위해 fuitnow++해주고 fruitcharnum=0을 해준다. 그러면, 반복문을 다음 수행할 때에는 if문을 수행하여 fruitnowp=fruit[fruitnowp=1]+fruitcharnum(=0)'이 된다. fruit[1]+fruitcharnum(0)은 "apple"의 'a'의 주소. fruit[1]+fruitcharnum(1) 은 "apple"의 'p'의 주소이다.

 

 

자, 이번에는 중간에 pineapple을 추가해 보자. 아래 그림에서와 같이 기존코드의 선언부에 pineapple문자열 포인터 추가, fruite 배열에 이를 추가. 하면 끝이다. 삽입 코드를 별도로 길게 작성할 필요가 없다!단,,, 워닝이 x라 많다..bb

  1. 출력 형태에 따라 이상한 버그 혹은 메시지가 뜬다 : "startup initialized natural state" 뭐 이런 메시지가 들어 있다.

 

프로그래밍을 처음 배우는 사람은 어려워 보일 수 있다. 하지만 차근차근 하다 보면, 감이 잡히게 될 거이다. 이상으로 과일이름 출력을 문자열,배열,포인터 배열, 반복문을 사용하여 해 보았다. 변수명 등은 댓글로 물어보고.

도움이 되었다 싶으시면 손가락을 꾹 눌러줄래??ㅎㅎ

Posted by C언어 보이
|

문제 : 정수 n을 입력받고 2의 k승<=n을 만족하는 k의 최대값을 구하기

풀이 : 제곱승의 표현은, 숫자=숫자*2를 반복할 때 마다 k를 증가하여 표현. 반복문을 탈출할 때의 k값이 승수 값이 된다.

 

이상으로 승수 구하기 프로그램, 반복문에 대하여 알아보았다.

Posted by C언어 보이
|

3-16. 두 개의 양의 정수 m과 n을 입력받아 Fibonacci Series를 출력하는 프로그램을 작성하라. Fibonacci Series는 m에서 시작하여 n개를 작성한다. Fibonacci Series 작성은 첫번째 숫자는 m이고, 두번째 숫자는 첫번째 숫자와 같다. 세번째 숫자는 첫번째 숫자와 두번째 숫자의 합이다. 그 다음의 숫자는 항상 앞의 두 숫자를 합한 값이 된다. 1부터 시작하는 Fibonacci Series는 다음과 같다.

         1, 1, 2, 3, 5, 8, 13……….

  1. 변수는 one, two, three로 하고, one은 m을 값으로 받고 two는 앞의 one의 값을 받는다. one과 two를 출력한다.
  2. one과 two를 더하여 three에 넣고 three를 출력한다.
  3. two의 값을 one에 넣고 three의 값을 two에 넣는다.
  4. one와 two를 더하여 three에 넣고 three를 출력한다.
  5. c)와 d)를 반복한다.

    

    첫번째는 1과 13, 두번째는 3과 9를 입력하여 실행결과를 출력하라.

 

  1. 우선 수열의 첫 세자리는 변하지 않으므로, 조건문이나 반복문을 실행하기 전에 정의한다.

     

  2. 그 다음, 수열의 원소 개수(n)를 0,1,2로 입력한 경우 (즉, 특수한 경우의 실행명령)를 정의한다.

원소가 0이면 출력할 게 없으므로 return 0.

원소가 하나면 one만 출력, 두 개면 one출력, two출력한다. 그 후에 one, two를 출력하는 코드를 피하기 위하여 return 0을 써준다.

 

 

  1. 원소가 세 개 이상일 경우, 3번째 원소부터 마지막 원소까지는 반복문으로 출력한다.

    여기서 핵심은, 출력할 각 원소를 three(one+two)로 정의하고, three에 더해질 one과 two를 한 단계 앞쪽으로 이동시키는 것이다.

Posted by C언어 보이
|

[C언어 핵심강의 02] 반복문, 조건문의 개념과 예시

 

반복문 : 반복의 조건을 만족하는 한, 계속 반복하라는 명령문.

조건문 : 조건을 만족하면, 함 해 달라는 명령문. 여자친구가 잘 해 주면, 뽀뽀를 해 준다. 여기서 '잘 해 주다'가 조건이며, '뽀뽀를 해 준다'가 명령문이다. 이 '잘 해 주다'를 식으로, '뽀뽀를 해 준다'를 식으로 쓰는 것이 프로그래밍인 것이다.  

 

위 반복문과 조건문이 프로그래밍에서 제일 많이 쓰인다. 뽀뽀는 물론 그 이상도 가능하다는 말이다. 읭??

 

[체크사항]

- break : 반복문 로프 탈출

- continue : 이하 코드를 통과하여 위로 다시 점프

- while 조건식을..while 안에 if break로 대체할 수 있음.

- switch문의 case나 goto문의 label이나 둘 다 주소.

- If 문은 조건식 중에서도 범위를 나타낼 때에 특히 유리함.

 

아래코드는 조건문과 반복문 두 가지 예제를 합쳐 놓은 것이다.

코드 1. 누적합 구하기. 조건문 : 두 수 num1, num2를 입력받고, 그 중에 큰 수를 big에 넣는 것이다. 그래서 big만 출력하게 하면 두 수 중에 num1, num2 중에 큰 수만 출력하게 되는 것이다.

 

코드 2. 등차수열 누적합. 반복문 : 설명이 필요없다.

 

이상으로 반복문, 조건문의 개념과 예시에 대하여 알아보았다.

아래 손가락! 눌러주시고 좋은 하루 보내세요~*

 

Posted by C언어 보이
|

0314 반복문,초기식,조건식,반복식,조건문,for,if else
삼항연산자 : 잘 안쓰며, 쓰라는 권유도 안 함. 다만 해석정도만 할 줄 알면 됌.
반드시 쓸 필요는 없으나..그게 코드상 짧을 때는 써도 뭐.

 

초기식
for (초기식,초기식,, ; 조건(하나만 쓸 수 있음!) ; 반복식,,,)
{
반복식
}

아래 반복문은 결과가 전부 같게 됌

무한루프 탈출방법
ctrl+c,ctrl+brk

조건문 최적화 : 걸릴 확률 높은 걸 첫순위 if 로.

 

#include<stdio.h>

int main()

 /*
 int inum1,inum2;
 inum2=0;
 for (inum1=0;inum1<5;inum1=inum1+1)
  printf("inum1 : %d, inum2 : %d \n",inum1,inum2);
 inum2=inum2+2;
 printf("inum1 : %d, inum2 : %d \n",inum1,inum2);
 */

 /*
 for (inum1=0,inum2=0;inum1<5;inum1=inum1+1,inum2=inum2+2)
  printf("inum1 : %d, inum2 : %d \n",inum1,inum2);
  */

 /*
 inum1=0;
 inum2=0;
 while (inum1<5)
 {
  printf("inum1 : %d, inum2 : %d \n",inum1,inum2);
  inum2=inum2+2;
  inum1=inum1+1;
 }
 */

 /*
 inum1=0;
 inum2=0;
 for (;inum1<5;)
 {
  printf("inum1 : %d, inum2 : %d \n",inum1,inum2);
  inum2=inum2+2;
  inum1=inum1+1;
 }
 */


 /*
 inum2=0;
 for (inum1=0;inum1<5;inum1=inum1+1)
 {
  printf("inum1 : %d, inum2 : %d \n",inum1,inum2);
  inum2=inum2+2;
 }
 */

 /*
  for (inum1=0,inum2=0;inum1<5;inum1=inum1+1,inum2=inum2+2)
 {
  printf("inum1 : %d, inum2 : %d \n",inum1,inum2);
 }
 */

 return 0;
}

Posted by C언어 보이
|