728x90

메소드 오버로딩


1
2
3
4
5
6
7
8
9
10
11
12
13
int Plus(int a, int b)
{
    return a + b;
}
 
double Plus(doubl a, double b)
{
    return a + b;
}
 
//
int       result1 = Plus(12);
double result2 = Plus(3.12.4);
cs


새로운 이름을 붙이지않고 하나의 메소드 이름에 여러개의 구현을 올림.

이름에 대한 고민을 줄여주고 코드의 일관성을 유지해주며, 생산성을 높인다. 






객체지향 프로그래밍


객체는 데이터와 메소드로 이루어진다.


: 속성은 데이터(변수), 기능은 메소드




Class는 객체를 만들기위한 청사진

붕어빵 틀이 클래스, 붕어빵은 객체

1
2
3
4
5
 
class 클래스 이름
{
    // 데이터와 메소드
}
cs




고양이를 추상화하기


1
2
3
4
5
6
7
8
9
class Cat
{
    public string Name;
    public string Color;    // 고양이의 속성(이름과 색)은 데이터
 
    public void Meow()    // 기능("야옹"은 메소드
    {
        Console.WriteLine("{0} : 야옹", Name);
    }
cs


위의 코드에서 Cat class에 선언된 Name,Color와 같은 클래스안에 선언된 변수들을 Field라고 한다.



Cat class은 청사진으로 실체(instance)는 아니다. 고양이 한마리의 이름과 색깔들을 정의해주어야 한다.




Cat 객체 생성


1
2
3
4
5
6
//kitty라는 객체를 생성
Cat kitty = new Cat();  
kitty.Color = "white";
kitty.Name = "kitty";
Kitty.Mew();
Console.WriteLine("{0} : {1}", kitty.Name, kitty.Color);
cs




1
Cat kitty = new Cat();   
cs

에서 cat()은 생성자.

new 키워드는 생성자를 호출해서 객체를 생성하는데 사용하는 연산자




this 키워드


1
2
3
4
5
6
7
8
9
10
class Employee
{
    private string Name;
 
    public void SetName(string Name)
    {
        this.Name = Name;
    }
}
//
cs

위의 코드에서 class Employee의 field도 Name,

SetName의 매개변수도 Name이다. (string Name)



this는 이런 모호성을 해결할 수 있는 키워드.

this.Name은 Employee 필드를 가리키고 오른쪽의 Name은 SetName() 메소드의 매개 변수를 가리킨다.



this() 생성자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyClass
    {
        int a, b, c;
 
        public MyClass()
        {
            this.a = 5425;
        }
 
        public MyClass(int b) 
        {
      this.a = 5425;
            this.b = b;
        }
 
        public MyClass(int b, int c) 
        {
 this.a = 5425;
            this.b = b;
            this.c = c;
        }
cs


위 소스를 보면 문법적 문제는 없다. 다만 세개의 MyClass() 생성자안에 중복되는 코드들이 들어가있는데,

이것을 this() 생성자를 이용해 코드를 개선할 수 있다.

  1. using System;
  2.  
  3. namespace ThisConstructor
  4. {
  5. class MyClass
  6. {
  7. int a, b, c;
  8.  
  9. public MyClass()
  10. {
  11. this.a = 10;
  12. }
  13.  
  14. public MyClass(int b) : this()    //this()가 9행의 MyClass()를 호출
  15. {
  16. this.b = 20;
  17. }
  18.  
  19. public MyClass(int b, int c) : this(b)    //14행의 class호출
  20. {
  21. this.c = 30;
  22. }
  23.  
  24. public void PrintFields()
  25. {
  26. Console.WriteLine("a:{0}, b:{1}, c:{2}", a, b, c);
  27. }
  28. }
  29.  
  30. class MainApp
  31. {
  32. static void Main(string[] args)
  33. {
  34. MyClass a = new MyClass();
  35. a.PrintFields();
  36.  
  37. MyClass b = new MyClass(0);
  38. b.PrintFields();
  39.  
  40. MyClass c = new MyClass(0, 0);
  41. c.PrintFields();
  42. }
  43. }


 stdout

a:10, b:0, c:0

a:10, b:20, c:0

a:10, b:20, c:30



C# 성적관리 프로그램


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Student_Score
{
    class STUDENT
    {
        public string name;
        public int Kor;
        public int Eng;
        public int Tot;
        public double ag;
        public int grd;

        public string Total(string a, string b)
        {
            string temp = (int.Parse(a) + int.Parse(b)).ToString();
            return temp;
        }
        public string Avg(string a, string b)
        {
            string temp = ((int.Parse(a) + int.Parse(b)) / 2).ToString();
            return temp;
        }
        public string Grade(double ag)
        {
            string grade;
            if (90 >= ag)
                grade = "A";
            else if (80 >= ag)
                grade = "B";
            else if (70 >= ag)
                grade = "C";
            else
                grade = "F";
            return grade;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("학생정보 입력");

            STUDENT s1 = new STUDENT();

            Console.Write("이름 : ");
            s1.name = Console.ReadLine();

            Console.Write("국어성적 : ");
            s1.Kor = int.Parse(Console.ReadLine());

            Console.Write("영어성적 : ");
            s1.Eng = int.Parse(Console.ReadLine());

            s1.Tot = s1.Kor + s1.Eng;
            s1.ag = (s1.Kor + s1.Eng) / (double)2;

            Console.WriteLine("====================================================================================");
            Console.WriteLine("이름" + "\t" + "국어" + "\t" + "영어" + "\t" + "총점" + "\t" + "평균" + "\t" + "등급");
            Console.WriteLine(s1.name + "\t" + s1.Kor + "\t" + s1.Eng + "\t" + s1.Tot + "\t" + s1.ag + "\t" + s1.Grade(s1.ag));
        }


    }
}


Output :



'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 클래스 복습2  (0) 2016.05.23
c# 스터디일지 -클래스  (0) 2016.05.22
728x90
#include <avr/io.h>
#include <util/delay.h>

#define  CLR   0x01      //Clear Display 명령
#define  HOME  0x02      //Return Home 명령 
#define  FNC   0x38      //Function Set 명령
                		 //Data Length = 8bit. 행수 2행


void LCD_PortSetting(void)
{
  DDRC = 0xFF;        //데이터 라인
  DDRD = 0xFF;        //0~2 제어핀 사용
  //D0: RS ,D1: R/W ,D2: EN
}

void IR_Write(unsigned char Data)  
{
  PORTD &= 0xFC;    //RS = 0, Write Enable
  _delay_us(1);    //Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04;    //Enable 활성화
  _delay_us(1);    //
  PORTC = Data;    //Data
  _delay_us(1);
  PORTD = 0b00000010;  //Disable, Read Mode  

}

void DR_Write(unsigned char Data)
{
  PORTD = 0x01;    //RS = 1, Write Enable
  _delay_us(1);    //Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04;    //Enable 활성화
  _delay_us(1);    //
  PORTC = Data;    //Data
  _delay_us(1);
  PORTD = 0b00000010;  //Disable, Read Mode  
}

void LCD_drive()
{
  _delay_ms(50);
  IR_Write(FNC);
  _delay_ms(5);
  IR_Write(FNC);
  _delay_us(100);
  IR_Write(FNC);
  _delay_ms(2);
  IR_Write(0x0E);	// Display On / Off, 	DDRAM, 커서 ON
  _delay_ms(2);  
  IR_Write(CLR);	// Display Clear
  _delay_ms(30);
  IR_Write(0x06);	// Entry Mode Set, 커서위치를 오른쪽으로 증가
  _delay_ms(2);
}

int main(void)
{
  LCD_PortSetting();
  LCD_drive();
  DR_Write(65);
  _delay_ms(2);
  DR_Write('D');

  while(1)
  {     
  }
  return 0;
}

Output :

LCD에 D 출력




#include <avr/io.h>
#include <util/delay.h>

#define CLR    0x01 // Return Home 명령
#define HOME  0x02 // Function Set 명령
#define FNC    0x38 // Data Length 8 bit 

void LCD_PortSetting(void)
{
  DDRC = 0xFF; // 데이터 라인
  DDRD = 0xFF; // 0 ~ 2 제어 핀 사용
  // 00: RS, 01: R/W, 02: En
}

void IR_Write(unsigned char Data)
{
  PORTD &= 0xFC; // RS = 0, Write Enable

  _delay_us(1); // Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04; // En

  _delay_us(1);
  PORTC = Data;

  _delay_us(1);
  PORTD = 0b00000010; // Disable. Read Mode
}

void DR_Write(unsigned char Data)
{
  PORTD = 0x01; // RS = 1, Write Enable

  _delay_us(1); // Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04; // En

  _delay_us(1);
  PORTC = Data;

  _delay_us(1);
  PORTD = 0b00000010; // Disable. Read Mode
}

void LCD_drive()
{
  _delay_ms(50); // 
  IR_Write(FNC);

  _delay_ms(5);
  IR_Write(FNC);
  
  _delay_us(100);
  IR_Write(FNC);
  _delay_ms(2);

  IR_Write(0x0E); // Display on/off DDRAM, 커서를 화면에 표시
  _delay_ms(2);


  IR_Write(CLR); // Display Clear
  _delay_ms(30);

  IR_Write(0x06); // Entry module set 명령. 오른쪽으로 커서 이동.
  _delay_ms(2);
}

void LCD_CHAR(unsigned char a)
{
  _delay_ms(1); // 명령어 쓰기 전 일정 시간 지연
  DR_Write(a); // 사유: Busy Flage 확인 대용
}

void cursor_HOME(void)
{
  IR_Write(0x02);
  _delay_ms(2);
}

void Display_Shift(unsigned char p)
{
  if(p == 1) // 표시화면 전체를 오른쪽으로 이동.
  {
    IR_Write(0x1C); // 화면 표시 내용을 오른쪽으로 이동.
    _delay_us(50);
  }

  else if(p == 0)
  {
    IR_Write(0x18); // 화면 표시 내용을 오른쪽으로 이동.
    _delay_us(50);    
  }
}

void LCD_STR(unsigned char *str)
{
  while(*str != 0)	// 0은 null, 값이 들어오면 
  {
    LCD_CHAR(*str);
    str++;
  }
}

void Position(unsigned char col, unsigned char row)	// 열과 행 
{
	IR_Write(0x80 | row+col*(0x40));
}

int main(void)
{
  LCD_PortSetting();
  LCD_drive();
  /*
  DR_Write(65);
  DR_Write('B');
  */
  Position(1,1);
  LCD_STR("Hello");
  //Display_Shift(1);

  while(1)
  {

  }

  return 0;
}

Output :

LCD에 Hello 출력







'Study > Embedded' 카테고리의 다른 글

7/5 LCD 제어  (0) 2016.07.05
5/26 업무일지 PC PWM을 이용한 LED 밝기 조절  (0) 2016.05.26
2016-05-17 업무일지-7 segment  (0) 2016.05.17
7 Segment 출력(proteus시뮬)  (0) 2016.05.16
5/12 avr 업무일지  (0) 2016.05.12
728x90

 

7 segment 숫자와 알파벳 출력 


캐소드 구동방식은 FND의 세그먼트중 켜길 원하는 비트가 0, 끄길 원하는 비트가 1이 된다.




 

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char fnd[16] = 
				{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xd8, 
		 		 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
	volatile unsigned char i;

	DDRF=0xFF;
	while(1)
	{	
		for(i=0; i<16; i++)
		{		
			_delay_ms(20);
			PORTF = fnd[i];
		}
	}
}



  //  PORTF = 0b1000000;  //0

  //  PORTF = 0b1111001;  //1

  //  PORTF = 0b0100100;  //2

  //  PORTF = 0b0110000;  //3  B0

  //  PORTF = 0b0011001;  //4  99

  //  PORTF = 0b0010010;  //5  92

  //  PORTF = 0b0000010;  //6  82

  //  PORTF = 0b1011000;  //7  E8

  //  PORTF = 0b0000000;  //8  80

  //  PORTF = 0b0010000;  //9  90

  //  PORTF = 0b0001000;  //A  88

  //  PORTF = 0b0000011;  //b  83

  //  PORTF = 0b1000110;  //c  c6

  //  PORTF = 0b0100001;  //d  a1

  //  PORTF = 0b0000110;  //e  86

  //  PORTF = 0b0001110;  //f  8e








애노드 구동방식은 FND의 세그먼트중 켜길 원하는 비트가 1, 끄길 원하는 비트가 0이 된다.


#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char fnd[10] = // 0~9
							{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 
							 0x92, 0x82, 0xd8, 0x80, 0x90};
		
	unsigned char n10;
	unsigned char n1;

	unsigned char num=0;

	DDRH=0xFF;	// 7 Segment의 Data Line
	DDRJ=0xFF;	// 7 Segment의 자릿수 ON/OFF
	while(1)
	{	
		n10 = num / 10;	// 십의 자리
		n1 = num % 10;	// 일의 자리
		
		PORTJ = 0x00;	// ON
		PORTH = fnd[n10];	// Data
		PORTJ = 0x01;	// OFF
		_delay_ms(2);
				
		PORTJ = 0x00;
		PORTH = fnd[n1];
		PORTJ = 0x02;
		_delay_ms(2);
		PORTJ = 0x00;		

		num++;
		num = num % 100;
	}
	return 0;
}








728x90

bcd.DSN


proteus에서 회로도 그리고 아래 소스를 시뮬레이션



hex파일을 프로그램으로 올려줌




7 Segment - up & down 카운트



#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char in, out =0;
	
	DDRA = 0b11111100;		// A0, A1만 입력 (0xFC) / 사용하지 않는 포트는 출력 
	DDRB = 0xFF;
	while(1)
	{
			in = PINA;
			switch (in)
			{
					case 0x01 :		// Up count
							while(PINA=0x01);	// 스위치 때는 순간 while문 탈출(high->low)
							out++;
							break;
					case 0x02 :
							while(PINA=0x02);
							out--;
							break;
			}
			PORTB = out;
			//_delay_ms(50);
	}
		return 0;
}





7 Segment - 입출력



#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char a;

	DDRA = 0x00;	// A 포트는 입력으로 사용, 생략 가능
	DDRB = 0xFF;	// B 포트는 출력으로 사용
	DDRC = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRD = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRE = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRF = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRG = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRH = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRJ = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRK = 0xFF 	// 미사용 포트는 출력으로 설정

	while(1)
	{
		a = PINA;
		switch(a)
		{
			case 0x01;
					PORTB = 0x01;
					break;
			case 0x02;
					PORTB = 0x02;
					break;
			case 0x04;
					PORTB = 0x04;
					break;
			case 0x08;
					PORTB = 0x08;
					break;

			case 0x10;
					PORTB = 0x10;
					break;
			case 0x20;
					PORTB = 0x20;
					break;
			case 0x40;
					PORTB = 0x40;
					break;
			case 0x80;
					PORTB = 0x80;
					break;
			default :
				PORTB = 0;
				break;
		}
		PORTB = a;
	}
	return 0;
}




'Study > Embedded' 카테고리의 다른 글

2016-05-19 업무일지-Atmega2560_LCD출력  (0) 2016.05.19
2016-05-17 업무일지-7 segment  (0) 2016.05.17
5/12 avr 업무일지  (0) 2016.05.12
5/2 디지털이란? / 저항, 인덕터, 캐패시터  (0) 2016.05.02
2016 04 28 디코더  (0) 2016.04.28
728x90

#include <avr/io.h>

#include <util/delay.h>


int main(void)

{

DDRA=0xFF;

while(1)

{

// PORTA ^=0XFF; // DDRA = (*(volatile unsigned char *)0x21)

PORTA = PORTA ^ 0XFF;

_delay_ms(3000);

}

return 0;

}



PORTA = PORTA ^ 0xFF; //xor =  모든값을 반전


0x02에 offset값(0x20) 더해서 0x22

오프셋이란, 두 번째 주소를 만들기 위해 기준이 되는 주소에 더해진 값을 의미한다. 


오프셋을 이용하여 주소를 나타내는 것을 상대주소 지정방식이라고 부르는데, 그 이유는 결과 주소가 다른 지점의 상대적인 위치가 되기 때문이다. 오프셋을 다른 말로 "변위"라고도 부른다.



안넣으면 계속 켜진거처럼 보임, 오실로스코프를 통해 클럭이 움직이는걸 볼 수 있음


'Study > Embedded' 카테고리의 다른 글

2016-05-17 업무일지-7 segment  (0) 2016.05.17
7 Segment 출력(proteus시뮬)  (0) 2016.05.16
5/2 디지털이란? / 저항, 인덕터, 캐패시터  (0) 2016.05.02
2016 04 28 디코더  (0) 2016.04.28
2016 04 27 논리회로  (0) 2016.04.27
728x90
/* 섭씨 온도 입력하면 화씨 온도 반환 CelToFah 함수
그 반대 FahToCel 함수 정의및 호출
Fah=1.8 x Cel+32 */

#include <stdio.h>

double CelToFah(double c)
{
	return 1.8*c + 32;
}

double FahToCel(double f)
{
	return (f - 32) / 1.8;
}

int main()
{
	int select;
	double num;

	printf("1. 섭씨℃->화씨℉	2. 화씨℉->섭씨℃-\n");
		printf("선택:");
		scanf("%d", &select);

	if (select == 1)
	{
		printf("섭씨℃ 입력: ");
			scanf("%lf", &num);
		printf("섭씨℃->화씨℉: %f \n", CelToFah(num));
	}
	else if (select == 2)
	{
		printf("화씨℉ 입력:");
			scanf("%lf", &num);
		printf("화씨℉->섭씨℃: %f \n", FahToCel(num));
	}

	return 0;
}


Output:







/* 인자로 전달된 수만큼의 피보나치 수열을 출력하는 함수
5를 입력하면 5! */

#include <stdio.h>

void Fibo(int num)
{
	int f1 = 0;
	int f2 = 1;
	int f3;
	int i;

	if (num == 1)
		printf("%d ", f1);
	else
		printf("%d %d ", f1, f2);

	for (i = 0;  i<num-2;  i++) // 0과 1일 경우는 위의 if~else문에서 출력
	{
		f3 = f1 + f2;
		printf("%d ", f3);
		f1 = f2;
		f2 = f3;
	}
}

int main()
{
	int n;
	printf("출력하려는 피보나치 수열갯수 (1이상 입력) : ");
	scanf("%d", &n);

	if (n < 1)
	{
		printf("1 이상 값 입력하세요 \n");
		return -1;
	}
	Fibo(n);
	return 0;
}


Output:






최대 공약수(Greatest Common Measure) 구하기 (유클리드 호제법 이용)

알고리즘

  1. 두 수 n1,n2 입력
  2. n이 0이라면, n2 출력하고 알고리즘 종료.
  3. n이 n2를 나누어 떨어지면, n을 출력하고 알고리즘 종료.
  4. 그렇지 않으면, n2를 n1로 나눈 나머지를 새롭게 n2에 대입하고, n2와 n1을 바꾸고 3.으로 돌아온다.


예를 들어 6, 12의 GCM을 구할 때, 12가 6을 나누어 떨어지니 6을 출력하고 알고리즘을 종료한다.

#include<stdio.h>

int GCM(int n1, int n2);


int main(void)
{
	int n1;
        int n2;

	printf("두 개의 정수 입력: ");
	scanf("%d %d", &n1, &n2);

	printf("GCM : %d \n", GCM(n1, n2));
	return 0;
}

int GCM(int n1, int n2)
{
	int result;
	result = n1;
	while(n1%result !=0 || n2%result !=0)
		result--;
	return result;
}

이 문제에선 6, 9의 GCM을 구한다면,

int result;
	result = n1;
	while(n1%result !=0 || n2%result !=0)
		result--
n1=6, result=6

6과 6을 나눈 나머지는 0,     9와 6을 나눈 나머지는 3이므로 
=0 (false) || !=0 (true) 가 된다.

따라서 result--가 되고 while을 반복해나가다보면
6%3=0 || 9%3=0 이 되어 while문을 빠져나가고 result값인 3을 return하며 종료된다.



728x90

1. 디지털이란?

digit - 손가락


analog->표본화(sampling)->양자화->부호화



불확정성의 원리



임베디드 레시피 p.28

저항, 인덕터, 캐패시터



R (저항)

전류의 흐름을 방해. 저항의 크기가 크면 작은 전류, 저항의 크기가 작으면 큰 전류가 흐를 수 있음



L(인덕터) 또는 코얼

저주파수는 통과

고주파수는 걸러진다.

주로 회로에 직렬연결


C(캐패시터) 또는 콘덴서

고주파 통과

저주파 걸러냄

주로 회로에 병렬연결




'Study > Embedded' 카테고리의 다른 글

7 Segment 출력(proteus시뮬)  (0) 2016.05.16
5/12 avr 업무일지  (0) 2016.05.12
2016 04 28 디코더  (0) 2016.04.28
2016 04 27 논리회로  (0) 2016.04.27
2016-04-25_디지털제어-회로 기초  (0) 2016.04.25
728x90

프로그램이란 데이터를 표현하고, 표현된 데이터를 처리하는 것.



int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  // 자료구조화, 데이터의 표현에 저장의 의미가 포함(int형 변수 선언이나, 배열 선언 등)


for(idx=0; idx<10; idx++)  // 배열에 저장된 값의 합을 구하기 위한 알고리즘 측면의 코드

sum += arr[idx];



: 자료구조에 따라 이를 위한 알고리즘은 달라지며, 따라서 알고리즘은 자료구조에 의존적이다.

먼저 자료구조를 결정하고, 이에 대한 효율적 알고리즘을 짜는 것이다.




알고리즘의 성능분석 방법


처리해야 할 데이터의 수 n에 대한, 연산횟수의 함수 T(n)을 가지고 식을 구성

데이터를 처리할 양이 많을 때, 로그식과 같은 알고리즘이 가장 이상적일 것이다.



시간복잡도 : 어떤 알고리즘이 어떠한 상황에서 더 빠르고 느린가

공간복잡도 : 어떤 알고리즘이 어떠한 상황에서 메모리를 적게 쓰거나 많이 쓰는가


알고리즘을 평가할 때는 속도에 대한 것을 우선으로 둔다. 이는 c언어의 입문 과정에서도 배운 내용이다.(공간 최적화와 속도 최적화) 




알고리즘 A와 B를 비교하면 데이터의 수가 적을 땐 B가 더 빠르지만, 일정 데이터 수 이후에는 A가 빠름을 알 수 있다.

하지만 데이터의 수가 적을 때의 시간 차는 미미하기 때문에 보통은 A를 좋은 알고리즘이라 한다.


다만, 구현이 쉽고 데이터의 수가 적을 때는 알고리즘 B를 쓰는 경우도 있다. 선택은 프로그래머의 몫이다.




시간 복잡도의 평가

: 중심이 되는 특정 연산의 횟수를 먼저 구하고, 

데이터의 수에 대한 연산횟수의 함수 T(n)을 구한다.



순차 탐색 예제


#include <stdio.h>


int LSearch(int ar[], int len, int target) // 순차탐색 함수(배열, 길이, 타겟)

{

int i;

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

{

if(ar[i]==target)

return i;    // 찾은 대상의 인덱스 값 반환

}

return -1;    // 찾지 못했음을 의미하는 값 반환

}


int main(void)

{

int arr[]={3, 5, 2, 4, 9};

int idx;


idx=LSearch(arr, sizeof(arr)/sizeof(int), 4);

if(idx==-1)

printf("탐색 실패 \n");

else

printf("타겟 저장 인덱스: %d \n", idx);


idx=LSearch(arr, sizeof(arr)/sizeof(int), 7);

if(idx==-1)

printf("탐색 실패 \n");

else

printf("타겟 저장 인덱스: %d \n", idx);


return 0;

}


결과: 

타겟 저장 인덱스: 3

탐색 실패



순차 탐색 알고리즘에서 최악의 경우, 시간 복잡도    

: 최악의 경우 마지막 인덱스에서 찾거나 타켓 탐색에 실패할 수 있다.

여기서 중심이 되는 특정 연산은 ==이고 <와 ++은 이에 의존적이다.


따라서 최악의 경우 t(n)=n 이 된다.


평균적인 경우를 구하는 것은 예상하거나 증명하는 것이 쉽지않고 일정한 상황이 아니기 때문에, 

"일반적으론" 최악의 경우를 구하는 것이다.




이진탐색 알고리즘 구현


길이가 9인 배열 정의. 

배열 인덱스의 시작과 끝은 각각 0과 8이다. (arr[0]~arr[8])


이를 오름차순을 기준으로 정렬한다.

{1, 2, 3, 7, 9, 12 , 21, 23, 27}


탐색 대상은 3.


0과 8을 합하여 그 결과를 2로 나눈다. 

결과 인덱스 4, 즉 가운데 인덱스를 기준으로 우리가 찾고자하는 값이 왼쪽 또는 오른쪽 배열에 있는지 확인하다. 

오름차순이기 때문에 어느 매개를 탐색대상으로 해야하는지 분명해진다.


{1, 2, 3, 7, 9, ...}

인덱스4의 숫자는 9이고, 우리가 찾는 대상보다 큰 값이기 때문에 탐색 대상은 왼쪽의 0~3 인덱스로 제한된다.

0과 3을 합하여 그 결과를 2로 나눈다. 1이 나오고 나머지는 버려짐


인덱스 1에 숫자 3이 있는지 확인한다. 숫자 2가 확인

 arr[1] < 3이므로 아래와 같이 인덱스 2,3으로 탐색이 제한된다.

{1, 2, 3, 7, 9, ...}


2와 3을 더하고 다시 2로 나눈다. 몫이 2가 나온다.

인덱스2의 숫자가 3인지 확인.


탐색 끝.

 


이진 탐색 알고리즘은 매 과정마다 탐색 대상을 절반으로 줄여나간다. 

기준을 가지고 정렬해야 하는 대신에  순차 탐색에 비해 좋은 성능을 보이며, 이는 이 알고리즘의 단점이자 장점이다. 

'Data Structure' 카테고리의 다른 글

Circular Linked List  (0) 2016.09.09
연결리스트2  (0) 2016.09.08
연결리스트  (0) 2016.09.05
리스트에 구조체 변수 저장하기  (0) 2016.09.03
배열 기반 리스트  (0) 2016.09.01
728x90


디코더


입력선에 나타나는 n비트의 2진 코드를 최대 2n개의 서로 다른 정보로 바꿔주는 조합논리회로


 

2x4 디코더 진리표





AND 게이트로 구현한 2x4 디코더                                        실제 회로는 NAND 게이트로 구현


: NAND 게이트를 사용하는것이 AND 게이트를 사용한 디코더에 비해 게이트를 더 적게 쓰기 때문에 경제적.

성능 측면에서도 NOT 게이트의 신호전달 지연시간 만큼을 줄일 수 있기 때문






'Study > Embedded' 카테고리의 다른 글

5/12 avr 업무일지  (0) 2016.05.12
5/2 디지털이란? / 저항, 인덕터, 캐패시터  (0) 2016.05.02
2016 04 27 논리회로  (0) 2016.04.27
2016-04-25_디지털제어-회로 기초  (0) 2016.04.25
20160324_펌웨어(써미스터,PWM)  (0) 2016.03.24
728x90

OR : 논리합 








AND : 논리곱








HD74LS00P (NAND 게이트)



http://www.alldatasheet.co.kr/datasheet-pdf/pdf_kor/247357/RENESAS/HD74LS00P.html








NAND로 NOT 게이트 만들기




NAND로 NOT 게이트 만들기



Output :

A = Lo: Out = Hi

A = Hi: Out = Lo

A = Lo: Out = Hi

A = Hi: Out = Lo






NOR 게이트(74HC02)




입력들 중 `1`이 1개 이상이면 출력이 `0`이 됨 

입력이 모두 `0`인 경우에만 출력이 `1`이 됨


A = Lo, B = Lo: Out = Hi

A = Lo, B = Hi: Out = Lo

A = Hi, B = Lo: Out = Lo

A = Hi, B = Hi: Out = Lo




XOR 게이트
: 입력 값이 같으면 0을 출력하고, 입력 값이 다르면 1을 출력

A

B

XOR B

0
0
1
1

0
1
0
1

0
1
1
0










Carry와 Sum (Carry는 올림수, Sum은 합을 의미)
: 10진수 1+9는 논리합이 0이 되고 자리올림 1이 되는 것처럼, 2진수도 똑같이 생각하면 된다.

가산기(Adder)

반가산기

A + B = C / S
0    0    0    0
0    1    0    1
1    0    0    1
1    1    1    0

여기서 carry는 and,

sum은 xor 게이트와 같다.

A

B

XOR B

0
0
1
1

0
1
0
1

0
1
1
0


반가산기 논리회로







전가산기

2개의 비트 a,b와 자리올림 Ci를 더해 합 S와 자리올림 Co을 구한다.  (Carry input/ Carry output)


입력

출력

A

B

Ci

Co

S

0

0

0

0

0

0

0

1

0

1

0

1

0

0

1

0

1

1

1

0

1

0

0

0

1

1

0

1

1

0

1

1

0

1

0

1

1

1

1

1


전가산기 논리회로 예시



'Study > Embedded' 카테고리의 다른 글

5/2 디지털이란? / 저항, 인덕터, 캐패시터  (0) 2016.05.02
2016 04 28 디코더  (0) 2016.04.28
2016-04-25_디지털제어-회로 기초  (0) 2016.04.25
20160324_펌웨어(써미스터,PWM)  (0) 2016.03.24
20160323_펌웨어(ADC)  (0) 2016.03.23

+ Recent posts