Download presentation
Presentation is loading. Please wait.
1
비주얼 프로그래밍 1분반 화/수
2
1주차 1시간 2.28(화)
3
오늘 공부할 내용 수업계획서 비주얼 프로그래밍 C / C++ / C# Form 프로그래밍 이벤트
C/C++ : 객체지향언어( class) 가 다르다 C/C++ : 같은 언어, 포인터로 메모리 관리 C++ / C# : 객체지향(class) / C# 포인터없다 .NET이 해준다 Form 프로그래밍 Login
5
F5 – 디버깅 ^-F5 – 디버깅 없이 시작 class Program { static void Main()
} C# 의 가장 핵심적인 필수 코드
7
한 솔루션에 두 개 이상의 프로젝트 만들고 시작 프로젝트로 설정한다
8
폼/WPF 프로그램 디자인 -> 속성 변경/ 이벤트 지정 -> 코딩 디자인
디자인 -> 속성 변경/ 이벤트 지정 -> 코딩 디자인 Form -> Control(콘트롤)들을 배치시킴 속성 : Text, 색깔, 크기, 위치, … 해당 콘트롤에 이벤트 지정 코딩 이벤트 처리 함수 F7
9
이벤트 지정 -> 이벤트함수 작성
10
이벤트 처리 함수 // button1이 클릭될 때 발생하는 이벤트처리함수 private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == "의료IT" && textBox2.Text == "1234") label3.Text = "성공했습니다"; } else label3.Text = "실패했습니다";
11
다음 수업 종료버튼 완성 WPF로 로그인하는 프로그램 작성
12
1주차 2시간 3.1(수) – 삼일절 휴강
13
3.7(화) Form : Login – Close() WPF : HelloWorld / BMI계산기
2주차 1일 3.7(화) Form : Login – Close() WPF : HelloWorld / BMI계산기
14
1. HelloWorld Windows Form WPF Label의 폰트를 바꿀 수 있다 Form의 배경색을 바꿀 수 있다
이벤트 함수를 만들 수 있다 수업자료 : WPF Label과 TextBlock XAML을 쓸 수 있다 (자멜) 폰트를 바꿀 수 있다 MainWindow 의 배경색을 바꿀 수 있다 WPF의 window default?
15
배경색과 글자색을 Toggle private void label1_Click(object sender, EventArgs e) { if (label1.ForeColor != Color.White) label1.ForeColor = Color.White; this.BackColor = Color.Black; } else label1.ForeColor = Label.DefaultForeColor; this.BackColor = Form.DefaultBackColor;
16
2. WPF HelloWorld <Grid> <Label Name="label1"
HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30" FontWeight="Bold" MouseDown="Label_MouseDown">Hello World!</Label> </Grid> // Form 에서는 클릭이었지만, WPF에서는 MouseDown private void Label_MouseDown(object sender, MouseButtonEventArgs e) { if(label1.Foreground != Brushes.White) label1.Foreground = Brushes.White; this.Background = Brushes.Blue; } else label1.Foreground = SystemColors.WindowTextBrush; this.Background = SystemColors.WindowBrush;
17
3.8(수) Form/WPF : BMI계산기 C# 기본
2주차 2일 3.8(수) Form/WPF : BMI계산기 C# 기본
18
2. BMI 계산기 Form 프로그램으로 BMI 계산기를 만들 수 있다. WPF 프로그램으로 BMI 계산기를 만들 수 있다.
숫자 <--> stirng 상호변환을 할 수 있다. WPF 프로그램으로 BMI 계산기를 만들 수 있다. <StackPanel>을 사용하여 디자인을 할 수 있다. BMI 지수 = 몸무게(kg) ÷ (신장(m) × 신장(m))
19
WPF 디자인 방법 신장(m) 체중(kg) BMI계산 당신의 BMI는 **.**** 입니다.
Label / TextBlock 글을 나타내기 위함(출력) TextBox 글을 입력받기 위함(입력/출력)
20
VS 코멘트 ^K-C 언코멘트 ^K-U
21
C# 기초 상수(Constant) 변수(Variabel -> Identifier) C 패밀리는 다 같다
기본 데이터 형(Type) 정수 : int(4바이트 32비트) , long(8바이트 64비트) 실수 : double(8바이트 64비트), float(4바이트 32비트) 문자 : char (1바이트 8비트) 문자열 : string Bool : bool
22
WPF Grid StackPanel Label TextBlock 위에서부터 컨트롤들을 쌓아나간다
StackPanel 안에 StackPanel이 또 있을 수 있다 Orientation=“Horizontal”
23
과제 및 시험안내 BMI 계산기 Form, WPF – 블로그에 올릴 것 다음 주 화요일 수시 1차 시험 – 코딩 (30분)
24
3주차 1일 3.14(화) 수시1차 계산기
25
계산기 TextBox Button Title
26
3장 조건문 if 조건문의 기본적인 사용 방법을 익힌다. if 조건문과 논리 연산자를 함께 사용하는 방법을 익힌다.
switch 조건문을 이해한다
27
if 문 기본예제 3-1 홀수 짝수 구분(1)(교재 117p)
28
DateTime 구조체(struct) p.119 DateTime.Now DateTime.Now.Year
DateTime.Now.Hour 기본예제 3-2 오전과 오후 구분(1)(교재 119p) 3/13 오늘 여기까지 (문제) 입력한 숫자에 소수점이 있는지 체크하는 프로그램 string.Contains() 메서드 사용 (교재 p.133)
29
if else 기본예제 3-3 홀수 짝수 구분(2)(교재 117p)
30
중첩조건문 조건문 안에 조건문 DateTime.Now.Hour을 사용하여 아침, 점심, 저녁 먹을 시간을 체크하는 프로그램을 작성하라 (11시 이전 -> 아침, 그렇지 않고 15시 이전 -> 점심, 아니면 저녁)
31
if ~ else if ~else (문제)점수를 입력하면 학점을 계산해 주는 프로그램
32
switch 문 switch(비교값) { case 값1: 문장 break; case 값2: 문장 break; … default: 문장 break; } (문제) 입력한 숫자가 홀수인지 짝수인지 판단하는 프로그램을 switch 문으로 작성하라 (문제) (break없는 case문) 3,4,5월 -> 봄 6,7,8월 -> 여름 9,10,11월 -> 가을 12,1,2월 -> 겨울
33
4주차 1일 3.21(화) 조건문
34
오늘 연습문제들 // 1. 정수하나를 입력받아 홀수, 짝수를 출력하는 문제 int x = int.Parse(Console.ReadLine()); if(x % 2 == 1) Console.WriteLine("홀수입니다"); else Console.WriteLine("짝수입니다"); // 2. 현재시간을 보고 오전인지 오후인지 출력하는 문제 Console.WriteLine(DateTime.Now); //DateTime.Now.Hour가 12이상이면 오후, 아니면 오전 if (DateTime.Now.Hour >= 12) { Console.WriteLine("오후"); } Console.WriteLine("오전");
35
// 3. p124 // 11시 이전이면 아침, 11시부터 15시 이전이면 점심 // 아니면 저녁이라고 출력하라 // if(조건) else if(조건) .... else if(DateTime.Now.Hour < 11) Console.WriteLine("아침시간"); else if(DateTime.Now.Hour < 15) Console.WriteLine("점심시간"); else Console.WriteLine("저녁시간");
36
// 4. 1~100점 점수를 입력하면 A,B,C,D,F 학점을 출력 Console
// 4. 1~100점 점수를 입력하면 A,B,C,D,F 학점을 출력 Console.Write("점수를 입력하세요: "); int score = int.Parse(Console.ReadLine()); if(score >= 90) Console.WriteLine("A"); else if(score >= 80) Console.WriteLine("B"); else if(score >= 70) Console.WriteLine("C"); else if(score >= 60) Console.WriteLine("D"); else Console.WriteLine("F");
37
// 5. switch문 : 홀수 짝수 // switch(정수, 문자, 문자열)만 가능 // 반드시 break; 있어야 한다 Console.Write("숫자 하나 입력 : "); int number = int.Parse(Console.ReadLine()); switch(number % 2) { case 1: Console.WriteLine("홀수"); break; case 0: Console.WriteLine("짝수"); }
38
// 6. 12,1,2월은 겨울, 3,4,5월은 봄, // 6,7,8월은 여름, 9,10,11월은 가을 // DataTime
// 6. 12,1,2월은 겨울, 3,4,5월은 봄, // 6,7,8월은 여름, 9,10,11월은 가을 // DataTime.Now.Month int m = DateTime.Now.Month; if (m == 12 || m == 1 || m == 2) Console.WriteLine("겨울"); else if(m >= 3 && m <= 5 ) Console.WriteLine("봄"); else if(m >= 6 && m <=8) Console.WriteLine("여름"); else Console.WriteLine("가을");
39
// 7번 계절 스위치 switch (DateTime. Now
// 7번 계절 스위치 switch (DateTime.Now.Month) { case 1: case 2: case 12: Console.WriteLine("겨울"); break; case 3: case 4: case 5: Console.WriteLine("봄"); case 6: case 7: case 8: Console.WriteLine("여름"); default: Console.WriteLine("가을"); }
40
// 8.학점 스위치 // 정수 / 정수 => 정수 // 99/10 => 9 // 98/10 => 9 score = int.Parse(Console.ReadLine()); switch(score/10) { case 10: case 9: Console.WriteLine("A"); break; case 8: Console.WriteLine("B"); case 7: Console.WriteLine("C"); case 6: Console.WriteLine("D"); default: Console.WriteLine("F"); } A+/A0는 어떻게 처리하나?
41
4주차 2일 3.22(수) 반복문
42
삼항연산자 [조건식] ? [참] : [거짓] (문제) 삼항연산자를 사용하여 홀수, 짝수를 판단하는 프로그램을 작성하라
(문제) 입력받은 정수값이 자연수인지 아닌지를 삼항연산자를 사용하여 작성하라
43
삼항연산자 연습 // 0. 출력 포맷 double x = ; Console.WriteLine(x); Console.WriteLine(x.ToString()); Console.WriteLine(x.ToString("0.0000")); // 1. 짝수 홀수 int ii = 5; Console.WriteLine(ii%2 == 0 ? "짝수": "홀수"); if(ii%2 == 0) Console.WriteLine("짝수"); else Console.WriteLine("홀수"); // 2. 자연수입니다. 아닙니다 Console.Write("숫자입력: "); int nVal = int.Parse(Console.ReadLine()); Console.WriteLine(nVal>0 ? "자연수입니다" : "자연수가 아닙니다");
44
반복문 연습 // 반복문 너무너무너무너무너무너무 중요함!!!!!!!! // C, C++, C# : for, while, do // C# : foreach // for(시작; 끝나는 조건; 변화) // { // 문장하나; // 문장둘; // } Console.WriteLine(" 강병익"); // 몇번 반복 -> for(i=0; i<몇번; i++) for(int i=0; i<10; i++) Console.WriteLine( (i+1) +"\t" + " 강병익");
45
// 1,3,5,7,9 출력 // 1에서 부터 9까지 2씩 증가하며 출력 for(int i=1; i<=9; i=i+2) // i+=2 Console.WriteLine(i); // 2,4,6,8,10, 까지 출력 // 156에서부터 17개의 숫자를 출력 for(int i=0; i<17; i++) Console.WriteLine(156+i); // 1,2,4,8,16,32, 출력 for(int i=1; i<=1024; i*=2)
46
// 15부터 50까지 5씩 증가하면서 출력 // WriteLine()의 매개변수 연습 // 1에서 10까지 i, i*i, i*i*i 출력 for(int i=1; i<=10; i++) Console.WriteLine("{0}\t{1}\t{2}", i, i*i, i*i*i); // 100에서 1000까지 7의 배수를 출력 for(int i=100; i<=1000; i++) if(i%7 == 0) Console.Write(i + "\t"); Console.WriteLine();
47
// 숫자 3개(n1,n2,n3)를 입력받아, // n1~n2사이의 n3의 배수를 출력 int n1 = int
// 숫자 3개(n1,n2,n3)를 입력받아, // n1~n2사이의 n3의 배수를 출력 int n1 = int.Parse(Console.ReadLine()); int n2 = int.Parse(Console.ReadLine()); int n3 = int.Parse(Console.ReadLine()); for(int i=n1; i<=n2; i++) if(i%n3 == 0) Console.Write(i+"\t"); Console.WriteLine(); // sum 하기 // 1에서 100까지 합 // 1에서 100까지 하나씩 증가하면서 값을 더해나간다 int sum = 0; for (int i = 1; i <= 100; i++) sum += i; Console.WriteLine(sum);
48
// 숫자 3개(n1,n2,n3)를 입력받아, // n1~n2사이의 n3의 배수의 합을 출력 n1 = int
// 숫자 3개(n1,n2,n3)를 입력받아, // n1~n2사이의 n3의 배수의 합을 출력 n1 = int.Parse(Console.ReadLine()); n2 = int.Parse(Console.ReadLine()); n3 = int.Parse(Console.ReadLine()); sum = 0; for (int i = n1; i <= n2; i++) if (i % n3 == 0) sum += i; Console.WriteLine(sum); // factorial 계산 // n! = 1*2*...*n Console.Write("n! 계산: n을 입력 : "); int n = int.Parse(Console.ReadLine()); int fact = 1; for (int i = 1; i <= n; i++) { fact *= i; Console.WriteLine("{0}! = {1}", i, fact); } //Console.WriteLine(fact);
49
Console.ReadKey() ConsoleKeyInfo info = Console.ReadKey(); switch(info.Key) { case ConsoleKey.UpArrow: Console.WriteLine("위"); break; case ConsoleKey.DownArrow: Console.WriteLine("아래"); case ConsoleKey.LeftArrow: Console.WriteLine("왼쪽"); case ConsoleKey.RightArrow: Console.WriteLine("오른쪽"); default: Console.WriteLine("다른 키"); }
50
5주차 1일 – 참고자료(GDI+) 3.28(화) 수시 2차 GDI+
51
오목 WinForm GDI+ 메뉴 : MenuStrip 19개의 가로 세로 줄 화점 9개 흰돌, 검은돌, 바둑판
Graphics class g.DrawLine(), g.FillEllipse() Pen class, Brush class Rectangle(), Point(), Size() 구조체 OnPaint() 메뉴 : MenuStrip 19개의 가로 세로 줄 화점 9개 흰돌, 검은돌, 바둑판 enum STONE {none, black, white}; STONE[,] 바둑판 = new STONE[19,19]; 메뉴를 사용하므로, 좌표계산을 쉽게 하기 위해 Panel을 부모에 도킹 화점위치 : 3, 9, 16
52
바둑판 좌표 X좌표 Y좌표 (m, m) (m+18*눈, m) Margin=m 이라고 했을 때 … …
53
바둑판 그리기 // 폼의 크기 조정 ClientSize = new Size(20+18*눈size,
20+18*눈size + menuStrip1.Height); g = panel1.CreateGraphics(); // 가로줄 for(int i=0; i<19; i++) { g.DrawLine(pen, new Point(margin, margin + 눈Size * i), new Point(margin + 18 * 눈Size, margin + 눈Size * i)); } // 세로줄 new Point(margin + 눈Size * i, margin), new Point(margin + 눈Size * i, margin + 눈Size * 18));
54
5주차 2일 – 참고자료(GDI+) 3.29(수) 오목 프로그램 계속
55
화점 그리기 화점 그리기 (3, 9, 15) 위치에 점을 그린다
g.DrawEllipse(pen, new Rectangle()) g.FillEllipse(bBrush, new Rectangle()) for(int i=3; i<=15; i+=6) for(int j=3; j<=15; j+=6) g.FillEllipse(bBrush, new Rectangle(margin + i * 눈Size - 화점Size/2, margin + j * 눈Size - 화점Size/2, 화점Size, 화점Size));
56
화점 (m,m) (m+눈,m) (m+눈*2,m) (m+눈*3,m) m+눈 m+눈*2 (m+눈*3, m+눈*3)
57
화점의 위치 이동(돌도 같은 방법) Rectangle(x,y,화점Size, 화점Size) (x,y) 화점Size 화점Size
Rectangle(x-화점Size/2, y-화점Size/2,화점Size, 화점Size)
58
오늘까지 한 프로그램 다음에 해야 할 기능 목요일 GDI+ 시험 오목을 체크하는 코드 추가! 게임 저장 게임 불러오기
하나씩 복기 기능 이미지 사용법 NoResize 목요일 GDI+ 시험 어떤 그림을 그리라는 시험 다음 주로 연기
59
속성창 선택된 컨트롤의 이름 선택된 컨트롤의 클래스
60
6주차 1일 – 참고자료(GDI+) 4.3(월) 내일 수업 선보강 오목 프로그램 계속
61
바둑판과 그에 대응하는 자료구조 STONE 바둑판[19,19] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
바둑판과 그에 대응하는 자료구조 STONE 바둑판[19,19] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 w b
62
오목 남은 문제 No Resize 그림 지워지지 않는 방법 이미지 사용법 오목이 되었는지 체크하는 방법 바둑돌 다시 그리기
다시 시작 메뉴 : 다시 시작 복기: 오목 진행 상황 저장 메뉴 보기 : 이미지 또는 그리기 게임 저장 게임 불러오기 하나씩 복기 기능
63
1. No Resize 바둑판은 정해져 있으므로 크기가 바뀔 필요가 없다 크기를 고정시키려면?
64
해법 FormBorderStyle을 FixedSingle로 하면 크기를 수정할 수 없다
65
2. 그림 지워지는 문제 Paint 이벤트에 의해서 OnPaint() 함수 호출하여 다시 그려줌
그런데 폼을 화면 바깥으로 가져갔다가 오면 다시 그려지지 않음 이 이벤트는 Form1_Move() 함수로 처리할 수 있음 다시 그려지지 않는 문제점 해결해야 함!!
66
3. Image 사용법 흑돌과 백돌을 FillEllipse()로 그리는 방법 대신, 이미지를 사용하는 방법
솔루션 탐색기에서 프로젝트 밑에 이미지를 저장할 폴더를 만들고 이곳에 이미지 파일을 저장함 if (turn == false) // 검은 돌 { // g.FillEllipse(bBrush, r); Bitmap bmp = new Bitmap("../../images/black.png"); g.DrawImage(bmp, r); 바둑판[x, y] = STONE.black; } else { //g.FillEllipse(wBrush, r); Bitmap bmp = new Bitmap("../../images/white.png"); g.DrawImage(bmp, r); 바둑판[x, y] = STONE.white; }
67
DrawImage() vs FillEllipse()
68
이것을 menu에 추가 여기에서도 flag를 하나 사용하자 imageFlag = true; // DrawImage()
imageFlag = false; // DrawEllipase()
69
4. checkOmok() 돌을 하나 놓았을 때, 이 돌에 의해 오목이 만들어졌는지를 체크하는 함수
돌이 하나 놓이면, 다음 네 방향으로 같은 색깔의 돌이 5개 인지 체크함 좌우 상하 우상향 대각선 우하향 대각선
70
checkOmok() – 좌우방향만 체크 // 지금 놓인 돌에 의해 //오목이 만들어졌는지를 체크하는 함수 private void checkOmok(int x, int y) { int cnt = 1; // [x,y]의 오른쪽으로 체크 for (int i=1; i<5; i++) if (x + i <= 18 && 바둑판[x + i, y] == 바둑판[x, y]) cnt++; else break; } // [x,y]의 왼쪽으로 체크 for(int i=1; i<5; i++) if (x - i >= 0 && 바둑판[x - i, y] == 바둑판[x, y]) if (cnt >= 5) MessageBox.Show(바둑판[x, y] + " Wins!");
71
5. 바둑돌 새로 그리기 한번 최소화 후 다시 바둑판을 띄우면 OnPaint()에 의해 바둑판은 다시 그려지지만, 바둑돌은 다시 그릴 수 없다 자료구조에서 바둑돌을 다시 그려주자(OnPaint()에 추가) ?
72
수정한 부분 panel1_MouseDown() 함수에서 돌 하나 그리는 부분을 추출하여 함수로 만든다
// OnPaint() 함수 protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); draw바둑판(); draw돌들(); } // 자료구조에서 돌들을 읽어서 다시 그려줌 private void draw돌들() for (int i = 0; i < 19; i++) for (int j = 0; j < 19; j++) if (바둑판[i, j] != STONE.none) drawAStone(i, j); panel1_MouseDown() 함수에서 돌 하나 그리는 부분을 추출하여 함수로 만든다
73
6. 메뉴 : 다시 시작 // 다시시작 메뉴 처리함수 private void 다시시작ToolStripMenuItem_Click(object sender, EventArgs e) { 1. 자료구조의 초기화 2. flag 초기화 : 흑돌부터 시작 3. 바둑판 지우기 4. 바둑판 다시 그리기 }
74
7. 오목 진행 사항 저장(복기) 오목게임의 복기 돌이 놓인 순서대로 저장하여야 함 List<T> 클래스를 사용
여기서 <T> 는 x, y, 흑/백을 나타내는 class를 만들어서 사용 using System.Collections.Generic; List<Bokki> list = new List<Bokki>(); public class Bokki { public int X { get; set; } public int Y { get; set; } public char Stone { set; get; } // 생성자 public Bokki(int x, int y, char stone) X = x; Y = y; Stone = stone; } private void 복기ToolStripMenuItem_Click(object sender, EventArgs e) { PrintList(); } // 테스트를 위해 List<Bokki> list를 출력 private void PrintList() { string s = ""; foreach(Bokki su in list) s += su.X + "," + su.Y + ":" + su.Stone + "\n"; } MessageBox.Show(s);
75
복기 테스트
Similar presentations