반응형

회로도 및 소스자료 참고.

 

 

01.NPAVR-100.pdf

02.AVR 교육자료(교재).pdf

 

반응형
반응형

* Dot Matrix

 

1. 하트를 그리고, 그 하트를 방향키를 이용하여 움직인다.

 

2. 불켜기 게임을 Dotmatrix로 구현한다. 25개를 다 켜면 HLED가 ON/OFF

 

3. 폭탄 피하기 게임

 

* Key Matrix

 

1. 핸드폰 영문자판 흉내내기

 - 키매트릭스를 핸드폰 자판이라 생각하고 LCD에 글을 써보자

 

* HLED 녹화하기

 - 타이머 인터럽트를 이용해서 구현하기

 

 

 

** 고난도 프로젝트

 

LCD에 Key입력을 받아 명령을 수행한다.

 

MTR RI 30 모터를 오른쪽으로 30도 이동 

MTR LE 15 모터를 왼쪽으로 15도 이동

 

...

반응형
반응형

 

// 서보모터 구현하기

Timer/Counter와 Delay를 이용하여 구현

 

1. Timer/Counter를 이용하여 구현

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
/*
 * avr_motor_0910.cpp
 *
 * Created: 2018-09-10 오후 2:07:45
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <stdio.h>
#include <avr/interrupt.h>
 
 
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
 
unsigned int tCount =0;
unsigned int servoCount =0;
 
ISR (TIMER0_OVF_vect){ // 100us
    TCNT0 = 256 -50;
    tCount ++;    
    if ( tCount>= 0 && tCount<=7) PORTB = 0xff;
    else if (tCount>7 && tCount <230) PORTB = 0x00;
    else tCount=0;
}
int main(void)
{
    /* Replace with your application code */
    DDRB = 0xff;
    DDRE = 0x00// 스위치
 
    PORTE = 0x70;
    PORTB = 0x01;
    
    io_init();
    lcd_init();
    
    int flag =0;
    TIMSK = 0x01;
    TCCR0 = 0x03;
    TCNT0 = 256 -50;
    sei();
    while (1
    {    
    
    
    }
}
 
 
cs

 

 

2. delay함수를 이용하여 구현

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
/*
 * avr_motor_0910.cpp
 *
 * Created: 2018-09-10 오후 2:07:45
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <stdio.h>
#include <avr/interrupt.h>
 
 
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
 
unsigned int tCount =0;
unsigned int servoCount =0;
 
 
int main(void)
{
    /* Replace with your application code */
    DDRB = 0xff;
    DDRE = 0x00// 스위치
 
    PORTE = 0x70;
    PORTB = 0x01;
    
    io_init();
    lcd_init();
    
    int flag =0;
    while (1
    {    
    
        
        
        if (((PINE & 0x10)== 0x00)&& flag ==0){
            
            for (int i=0; i<100;i++){
                PORTB = 0xff;
                _delay_us(700);
                PORTB = 0x00;
                _delay_us(19300);
            }
            flag =1;
        }
        else if (((PINE & 0x20)==0x00)&& flag==0){
                    for (int i = 0; i<100;i++){
                        PORTB = 0xff;
                        _delay_us(2300);
                        PORTB = 0x00;
                        _delay_us(17700);
                    }
            flag=1;
        }
        else if (((PINE &0x40)== 0x00)&& flag==0){
            for (int i = 0; i<100;i++){
                PORTB = 0xff;
                _delay_us(1500);
                PORTB = 0x00;
                _delay_us(18500);
            }
            flag =1;
        }
        else if (PINE==0xff) flag=0;
    
    }
}
 
 
cs

 

반응형
반응형
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * avr_motor_0910.cpp
 *
 * Created: 2018-09-10 오후 2:07:45
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <stdio.h>
 
void DC_Motor30(){
    PORTB = 0x40;
    _delay_us(30);
    PORTB = 0x20;
    _delay_us(70);
}
void DC_Motor50(){
    PORTB = 0x40;
    _delay_us(50);
    PORTB = 0x20;
    _delay_us(50);
}
void DC_Motor70(){
    PORTB = 0x40;
    _delay_us(70);
    PORTB = 0x20;
    _delay_us(30);
}
void Step_MotorFW(){
    PORTB = 0x01;
    _delay_ms(20);
    PORTB = 0x02;
    _delay_ms(20);
    PORTB = 0x04;
    _delay_ms(20);
    PORTB = 0x08;
    _delay_ms(20);
}
void Step_MotorBW(){
    PORTB = 0x08;
    _delay_ms(20);
    PORTB = 0x04;
    _delay_ms(20);
    PORTB = 0x02;
    _delay_ms(20);
    PORTB = 0x01;
    _delay_ms(20);
}
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
 
int main(void)
{
    /* Replace with your application code */
    DDRB = 0x0f;
    DDRE = 0x00// 스위치
 
    PORTE = 0x70;
    PORTB = 0x01;
    
    io_init();
    lcd_init();
 
    char temp[16];
    int degree =0,flag =0, current_degree=0;;
    
 
    while (1
    {        
 
        if (((PINE & 0x10)==0x00)&& flag ==0){
            if(degree >=15) degree = degree-15;
        flag =1;
        }
        else if (((PINE & 0x20)==0x00)&& flag ==0){
            if(degree <360) degree     = degree+15;
            flag=1;
        }
        else if(PINE == 0xff){
            flag=0;
        }
        // 스텝모터 동작(미완성)
        if (((PINE & 0x40== 0x00)&& flag ==0){ 
            if (current_degree < degree)
                PORTB= PORTB <<1;
                _delay_ms(20);
                if (PORTB ==0x10){ PORTB = 0x01;
                    _delay_ms(20);
                }
            }
            flag=1;
        }
        else if (PINE ==0xff) flag =0;
        sprintf(temp,"> %d    ", degree);
        lcd_putsf(0,0,"  Input Degree  ");
        lcd_putsf(0,1,temp);
    }
}
 
 
cs

 

// 여러 방법이 있지만, 여기서는  

void Step_MotorFW(){
    PORTB = 0x01;
    _delay_ms(20);
    PORTB = 0x02;
    _delay_ms(20);
    PORTB = 0x04;
    _delay_ms(20);
    PORTB = 0x08;
    _delay_ms(20);
}

// 4차례를 순서대로 이동시켜야 스텝모터가 동작 한다.

 

반응형
반응형
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
 * avr-0910.cpp
 *
 * Created: 2018-09-10 오전 9:20:31
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <avr/interrupt.h>
#include <stdio.h>
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
unsigned int count =0, sec=0, min=0,hour=0;
unsigned int mode =0, ampm =0;
unsigned int flag=0;;
 
ISR(TIMER0_OVF_vect){
    TCNT0 =6;
    count++;
    if (count >1000){
        sec++; count=0;
        if(sec>=60){
            min++; sec=0;
            if (min>=60){
                hour++; min=0;
                if(hour>12){
                    hour=0;
                    if(ampm == 0) ampm =1;
                    else if(ampm ==1) ampm=0;
                    count =0;
                }
            }
        }
    }
}
 
int main(void)
{
    /* Replace with your application code */
    io_init();
    lcd_init();
    
    DDRE = 0x8f// 스위치 
    PORTE = 0x70; // 추후 확인 필요
    
    // 타이머 인터럽트 레지스터
    TIMSK = 0x01// R/W 선택 TIMER 0 사용
    TCCR0 =0x04// 분주비 64
    TCNT0 =6// 0에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
    
    /*
    1/16000000 = 0.0000000625
    분주비가 64
    0.0000000625 *64 = 0.000004 // TCNT0가 1올라가는 속도.
    ISR이 발생하는 시간 = 0.000004
    TCNT 250 회로 OVF 발생시 걸리는 시간 0.001
    500번이 OVF 인터럽트가 발생하면 1초가 된다.
    */
    
    sei();
    char temp[16];
    
    while (1
    {
        //input
        if (((PINE && 0x10)== 0x00&& flag ==0){
            mode++;
            flag=1;
            if (mode >=2)
            mode=0;
        }
        else if (PINE ==0xff) flag=0;    
        
        //display
        switch(mode){
            case 0:
            mode =1;
            sprintf(temp,"%d  :  %d  :  %d  %s",hour,min,sec,(ampm=0)?"AM":"PM");
            lcd_putsf(0,0,"  Normal Mode  ");
            lcd_putsf(0,1,temp);
        
            case 1:
            mode =0;
            sprintf(temp,"%d  :  %d  :  %d  %s",hour,min,sec,(ampm=0)?"AM":"PM");
            if (sec%2 ==0){
                temp[2]=temp[3= ' ';
            }
            lcd_putsf(0,0,"  Modify Mode  ");
            lcd_putsf(0,1,temp);
        }
        
 
    }
}
cs

 

 

// 스위치 DDRE 설정 다시 확인 후 시계 만들기 완성 소스

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * avr-0910.cpp
 *
 * Created: 2018-09-10 오전 9:20:31
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <avr/interrupt.h>
#include <stdio.h>
#define LED_SEL1 (*(volatile unsigned char *)0xA000)
#define LED_SEL2 (*(volatile unsigned char *)0xB000)
#define FND (*(volatile unsigned char *)0x8000)
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
unsigned int count =0, sec=0, min=0,hour=0;
unsigned int mode =0, ampm =0;
unsigned int flag=0;
unsigned int saveSec=0, saveMin=0,saveHour=0;
 
ISR(TIMER0_OVF_vect){
    TCNT0 =6;
    count++;
    if (count >1000){
        sec++; count=0;
        if(sec>=60){
            min++; sec=0;
            if (min>=60){
                hour++; min=0;
                if(hour>12){
                    hour=0;
                    if(ampm == 0) ampm =1;
                    else if(ampm ==1) ampm=0;
                    count =0;
                }
            }
        }
    }
}
 
int main(void)
{
    /* Replace with your application code */
    io_init();
    lcd_init();
    
    DDRE = 0x8f// 스위치 
    PORTE = 0xff
    
    // 타이머 인터럽트 레지스터
    TIMSK = 0x01// R/W 선택 TIMER 0 사용
    TCCR0 =0x04// 분주비 64
    TCNT0 =6// 6에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
    
    /*
    1/16000000 = 0.0000000625
    분주비가 64
    0.0000000625 *64 = 0.000004 // TCNT0가 1올라가는 속도.
    ISR이 발생하는 시간 = 0.000004
    TCNT 250 회로 OVF 발생시 걸리는 시간 0.001
    500번이 OVF 인터럽트가 발생하면 1초가 된다.
    */
    
    mode =0;
    sei();
    char temp[16];
    int sel =0;
    while (1
    {
        
        //input
        if (((PINE & 0x10)== 0x00&& flag ==0 ){    
            sel=0;
            mode++;
            if(mode >=2)mode =0;
            flag=1;
        }    
        // 숫자 증가 input
        else if (((PINE & 0x20)== 0x00)&& flag==0 && mode==1 ){
            if (sel==0){hour++;
                if (hour >=60) hour =0;
            }
            else if (sel ==1){ min++;
                if(min>=60) min=0;
            }
            else if(sel ==2){ sec++;
                if(sec>=60) sec=0;
            }
            else if(sel==3){
                if (ampm ==0) ampm =1;
                else if (ampm ==1)  ampm=0;
            }
            flag=1;
        }
        // 숫자 선택 셀 증가
        else if (((PINE & 0x40)== 0x00)&& flag==0 && mode==1 ){
            sel++;
            if (sel >=4) sel=0;
            flag=1;
        }
        else if (PINE == 0xff){ flag=0;    
        }
        
        //display
        switch(mode){
            case 0:
            sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");
            lcd_putsf(0,0,"  Normal Mode  ");
            lcd_putsf(0,1,temp);
                break;
            case 1:
            sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");    
            if (sec%2 ==0){
                if(sel==0)temp[1= temp[2=' ';
                else if(sel==1)temp[5= temp[6=' ';
                else if(sel==2)temp[9= temp[10=' ';
                else if (sel==3)temp[12= temp[13=' ';
                else sel =0;
            }
            lcd_putsf(0,0,"  Modify Mode  ");
            lcd_putsf(0,1,temp);
                break;
        }
    }
}
cs

 

 

 

 

/*

// SW4, SW5, SW6

SW4 입력시 모드가 바뀌며, Nomal Mode , Modify Mode가 있다.

Modify Mode 에서는 SW5 과 SW6을 입력하여 시간과 AM/PM을 변경 할 수 있다.

*/

 

 

반응형
반응형
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
 * avr-0910.cpp
 *
 * Created: 2018-09-10 오전 9:20:31
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <avr/interrupt.h>
#include <stdio.h>
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
unsigned int count =0, sec=0;
 
ISR(TIMER0_OVF_vect){
    TCNT0 =256-25;
    count++;
    if (count >625){
        sec++; count=0;
    }
}
int main(void)
{
    /* Replace with your application code */
    io_init();
    lcd_init();
    
    // 타이머 인터럽트 레지스터
    TIMSK = 0x01// R/W 선택 TIMER 0 사용
    TCCR0 =0x07// 분주비 1024
    TCNT0 =256-25// 0에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
    
    /*
    1/16000000 = 0.0000000625
    분주비가 1024
    0.0000000625 *1024 = 0.000064 // TCNT0가 1올라가는 속도.
    ISR이 발생하는 시간 = 0.016384
    약 61번이 OVF 인터럽트가 발생하면 1초가 된다.
    */
    
    sei();
    char temp[16];
    
    
    while (1
    {
        sprintf(temp,"%d",sec);
        lcd_putsf(0,0,temp);        
    }
}
cs

 

// 해당 소스는 정확한 1초가 아니다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
 * avr-0910.cpp
 *
 * Created: 2018-09-10 오전 9:20:31
 * Author : USER
 */ 
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <avr/interrupt.h>
#include <stdio.h>
 
void io_init(void)
{
    MCUCR|=(1<<SRE) | (1<<SRW10);
    XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
    XMCRB |= 0x00;
}
unsigned int count =0, sec=0;
 
ISR(TIMER0_OVF_vect){
    TCNT0 =256-5;
    count++;
    if (count >500){
        sec++; count=0;
    }
}
int main(void)
{
    /* Replace with your application code */
    io_init();
    lcd_init();
    
    // 타이머 인터럽트 레지스터
    TIMSK = 0x01// R/W 선택 TIMER 0 사용
    TCCR0 =0x04// 분주비 64
    TCNT0 =256-5// 0에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
    
    /*
    1/16000000 = 0.0000000625
    분주비가 64
    0.0000000625 *64 = 0.000004 // TCNT0가 1올라가는 속도.
    ISR이 발생하는 시간 = 0.000004
    TCNT 250 회로 OVF 발생시 걸리는 시간 0.001
    500번이 OVF 인터럽트가 발생하면 1초가 된다.
    */
    
    sei();
    char temp[16];
    
    
    while (1
    {
        sprintf(temp,"%d",sec);
        lcd_putsf(0,0,temp);        
    }
}
cs
반응형
반응형
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// pointer.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
void swap(int a, int b) {
    int t;
    t = a; a = b; b = t;
}
void swap_point(int *a, int*b) {
    int t;
    t = *a; *= *b; *= t;
}
// 배열과 포인터 이해
int main()
{
    int A[100= { 5,6,7,8 };
 
    printf("%d\n"*A);
    printf("%d\n"*(A+1));
    printf("%d\n"*+11);
    printf("\n");
    int *p;
    p = A;
    
    printf("%d\n"*p);
    printf("%d\n"*(p+1));
    printf("%d\n"*(p + 2));
    printf("%d\n"*(p + 3));
    printf("%d\n"*(++p));
    printf("\n");
    // & 기호 + 변수 A == > 변수 A 의 위치
    int a = 10
    int *p1 = &a;
    printf("%d\n"*p1);
    printf("%d\n"&a);
 
    //포인터 사용
    int i=50, j=70;
    swap(i, j);
    printf("%d %d\n", i, j);
    swap_point(&i, &j);
    printf("%d %d\n", i, j);
 
    return 0;
}
 
 
cs

 

반응형

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

C언어 - 자연수의 조합  (0) 2018.09.14
C언어 - 자판기  (0) 2018.09.14
C언어 - EOF  (0) 2018.09.07
C언어 - 학생 Table(총점, 평균, 석차)  (0) 2018.09.07
C언어 - 탐색, 정렬, 순위  (0) 2018.09.07
반응형
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
32
33
34
35
// malloc.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int i = 0;
    char str[255];
    /* // scanf의 경우 스페이스를 구분지어 입력됨.
    while (scanf_s("%d", &i) != EOF) {
        printf("%d가 입력되었습니다.\n", i);
        i++;
    }*/
    /* // gets는 스페이스를 구분 짓지 않음.
    while (gets_s (str) ){
        printf("%s가 입력되었습니다.\n", str);
        i++;
    }*/
    // atoi함수 -> #include <stdlib.h> 에 들어 있음.
    while (gets_s(str)) {
        int j = atoi(str);
        printf("%d 가 입력되었습니다. \n",j);
        //예 ) 계산기 문제 
        // scanf_s("%s", &str);
        // if (strcmp(str,"*")) // strcmp 비교
    }
    
    printf("EOF 입력됨");
    return 0;
}
 
 
cs
반응형

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

C언어 - 자판기  (0) 2018.09.14
C언어 - 포인터 이해  (0) 2018.09.07
C언어 - 학생 Table(총점, 평균, 석차)  (0) 2018.09.07
C언어 - 탐색, 정렬, 순위  (0) 2018.09.07
C언어 - Stack으로 구현한 자동차 주차장  (0) 2018.09.06
반응형
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// student_table.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
 
int score[20][7= { 0 };
int student = 0, i = 0, j = 0;
int student_no = 0;
int rank[20= { 0 };
 
void print_score() {
    int i, j;
    i = j = 0;
    printf("  학번  국어  영어  수학  총점  평균  석차\n");
    for (i = 0; i < student; i++) {
        for (j = 0; j < 7; j++) {
            printf("%6d", score[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    printf("학생 수를 입력 해 주세요 = ");
    scanf_s("%d"&student);
 
    for (int i = 0; i < student; i++) {
        printf("%d번 학생의 학번은 ?", i);
        scanf_s("%d"&(score[i][0]));
            
        printf("%d번 학생의 국어 점수 :", i);
        scanf_s("%d"&(score[i][1]));
 
        printf("%d번 학생의 영어 점수 :", i);
        scanf_s("%d"&(score[i][2]));
 
        printf("%d번 학생의 수학 점수 :", i);
        scanf_s("%d"&(score[i][3]));
    }
    print_score();
    //총점 계산
    for (int i = 0; i < student; i++) {
        for (int j = 1; j <= 3; j++) {
            score[i][4+= score[i][j];
        }
    }
    print_score();
    //평균계산
    for (int i = 0; i < student; i++) {
            score[i][5]=score[i][4/ 3;
    }
    print_score();
    //rank 배열에 입력
    for (int i = 0; i < student; i++) {
        rank[i]=score[i][4];
    }
    //rank 배열 정렬
    for (int i = 0; i < student; i++) {
        for (int j = i + 1; j < student; j++) {
            if (rank[i] < rank[j]) {
                int tmp = rank[i];
                rank[i] = rank[j];
                rank[j] = tmp;
            }
 
        }
    }
    // rank배열 출력
    for (int i = 0; i < student; i++) {
        printf("%d ", rank[i]);
    }
    printf("\n");
    // 석차 배열에 입력
    for (int i = 0; i < student; i++) {
        for (int j = 0; j < student; j++) {
            if (rank[j] == score[i][4])
                score[i][6= j+1;
        }
    }
    print_score();
    return 0;
}
 
 
cs

 

 

 

//석차 구하는 함수

for (int i=0; i<student; i++){

score[i][6] =1; // 초기화

for (int j=0;j<student; j++){

if (score[i][5]<score[j][5]){

score[i][6]++;

}

}

// 이 함수를 쓰는게 좀더 편한 것 같다..

 


 // 학번 순으로 정렬
 for (int i = 0; i < student; i++) {
  for (int j = i + 1; j < student; j++) {
   if (score[i][0] > score[j][0]) {
    for (int k = 0; k < 7; k++) {
     int tmp = score[i][k];
     score[i][k] = score[j][k];
     score[j][k] = tmp;

    }
   }
  }
 }

// 정렬부분 누락 됨 추가 필요.

 

 

반응형

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

C언어 - 포인터 이해  (0) 2018.09.07
C언어 - EOF  (0) 2018.09.07
C언어 - 탐색, 정렬, 순위  (0) 2018.09.07
C언어 - Stack으로 구현한 자동차 주차장  (0) 2018.09.06
C언어(자료구조) - Stack 구현  (0) 2018.09.06
반응형
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// sort.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
 
 
int main()
{
 
    int A[100= { 0 };
    int N = 0;
    int inputNum = 0;
    int findNum = 0;
    int mode = 0;
    int sort_mode = 0;
    int countNum = 0;
 
    while (1) {
        printf("모드를 선택 해 주세요 (1.생성 및 탐색 2.정렬 3. 순위 ) : ");
        scanf_s("%d"&mode);
        if (mode == 1) { // 탐색
            //생성
            printf("몇개의 공간을 만들까요 ? : ");
            scanf_s("%d"&N);
            for (int i = 0; i < N; i++) {
                printf("%d 번째 값을 입력하세요 :", i + 1);
                scanf_s("%d"&inputNum);
                A[i] = inputNum;
            }
            // 배열 출력
            for (int i = 0; i < N; i++) {
                printf("%d ", A[i]);
            }
            printf("\n");
            //탐색
            printf("어떤 숫자를 찾으시겠습니까? :");
            scanf_s("%d"&findNum);
            for (int i = 0; i < N; i++) {
                if (findNum == A[i])
                    printf("%d번째 숫자입니다.\n", i + 1);
            }
        }
 
        else if (mode == 2) { // 정렬
            //디버깅 출력
            for (int i = 0; i < N; i++) {
                printf("%d ", A[i]);
            }
            printf("\n");
            printf("어떻게 정렬 할까요? (1.오름차순 2.내림차순) : ");
            scanf_s("%d"&sort_mode);
            if (sort_mode == 1) {
                // 오름차순 정렬
                for (int i = 0; i < N; i++) {
                    for (int j = i + 1; j < N; j++) {
                        if (A[i] > A[j]) {
                            int tmp = A[i];
                            A[i] = A[j];
                            A[j] = tmp;
                        }
 
                    }
                }
            }
            //내림차순 정렬
            else if (sort_mode == 2) {
                for (int i = 0; i < N; i++) {
                    for (int j = i + 1; j < N; j++) {
                        if (A[i] < A[j]) {
                            int tmp = A[i];
                            A[i] = A[j];
                            A[j] = tmp;
                        }
 
                    }
                }
            }
            // 정렬 후 출력
            for (int i = 0; i < N; i++) {
                printf("%d ", A[i]);
            }
            printf("\n");
        }
        else if (mode == 3) { //순위 책정
            //디버깅 출력
            for (int i = 0; i < N; i++) {
                printf("%d ", A[i]);
            }
            printf("\n");
 
            printf("순위를 찾을 숫자를 입력 해 주세요 : ");
            scanf_s("%d"&countNum);
 
            for (int i = 0; i < N; i++) {
                for (int j = i + 1; j < N; j++) {
                    if (A[i] < A[j]) {
                        int tmp = A[i];
                        A[i] = A[j];
                        A[j] = tmp;
                    }
 
                }
            }
            //디버깅 출력
            for (int i = 0; i < N; i++) {
                printf("%d ", A[i]);
            }
            printf("\n");
            // 순위 출력
            for (int i = 0; i < N; i++) {
                if (countNum == A[i])
                    printf("%d의 순위는 %d위 입니다.", countNum, i+1);
            }
        }
    }
    return 0;
}
 
 
cs

 

 

반응형

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

C언어 - EOF  (0) 2018.09.07
C언어 - 학생 Table(총점, 평균, 석차)  (0) 2018.09.07
C언어 - Stack으로 구현한 자동차 주차장  (0) 2018.09.06
C언어(자료구조) - Stack 구현  (0) 2018.09.06
C언어 - goto문  (0) 2018.08.29

+ Recent posts