Category Archives: Homework

종로구 가회동 동네예보 Rss Feed

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Weather; // RssFeedData.cs
using System.Net;
// HttpWebRequest


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public string PubDate;


        public List<RssFeedData> ReadFeed(string url)
        {
            List<RssFeedData> rssFeedItems = new List<RssFeedData>();
            HttpWebRequest rssFeed = (HttpWebRequest)WebRequest.Create(url);
            using (DataSet rssData = new DataSet())
            {
                rssData.ReadXml(rssFeed.GetResponse().GetResponseStream());


                foreach (DataRow row in rssData.Tables[“channel”].Rows)
                {
                    PubDate = Convert.ToString(row[“pubDate”]);
                    System.Diagnostics.Trace.WriteLine(PubDate);
                }


                foreach (DataRow row in rssData.Tables[“data”].Rows)
                {
                    rssFeedItems.Add(new RssFeedData
                    {
                        Hour = Convert.ToInt32(row[“hour”]),
                        Day = Convert.ToInt32(row[“day”]),
                        Temperature = Convert.ToDouble(row[“temp”]),
                        MaximumTemperature = Convert.ToDouble(row[“tmx”]),
                        LowTemperature = Convert.ToDouble(row[“tmn”]),
                        Sky = Convert.ToInt32(row[“sky”]),
                        Pty = Convert.ToInt32(row[“pty”]),
                        WeatherForecast = Convert.ToString(row[“wfKor”]),
                        Pop = Convert.ToInt32(row[“pop”]),
                        Rain = Convert.ToDouble(row[“r12”]),
                        Snow = Convert.ToDouble(row[“s12”]),
                        Wind = Convert.ToDouble(row[“ws”]),
                        WindDirection = Convert.ToString(row[“wdKor”]),
                        Humidity = Convert.ToInt32(row[“reh”])
                    });
                }
            }


            return rssFeedItems;
        }


        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
// 종로구 가회동
            List<RssFeedData> aList = ReadFeed(“http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1111060000“);
            foreach (var item in aList)
                System.Diagnostics.Trace.WriteLine(item);


            label1.Text = PubDate;
            dataGridView1.DataSource = aList;
        }
    }
}

HW4

연습문제 (4)






단원 : C# WinForm


목표 : Collections & FileIO & Controls & Dialog & XML


주요 연습 내용 : RSS Feed, string, Gridview,


준비자료 : zone.csv, 기상청 동네예보 사이트, Resources(아이콘이미지)


 


3652079610.hwp4270977580.cs9327055152.zip
[
연습문제] Ex4 (Due by 12/06 24시까지)


-cyber 강의실 (cyber.dku.edu)source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex4.zip으로 묶어서 낼 것. 보고서 (30%)


기상청 동네예보 사이트 http://www.kma.go.kr/weather/forecast/timeseries.jsp


기상청 RSS 서비스 http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp


 


[연습문제]


1. Form1.cs (메인 폼)에 툴바와 각종 컨트롤을 추가한다. (10%)
사용자 삽입 이미지



메인폼(Form1)


Text: 날씨 동네예보 Rss


Size: 810,410


label1 : 발표시각


label2, label3 : 동네예보, 관심지역


textBox1 : 동네예보지역


comboBox1 : 동네예보 관심지역 리스트


button1 : 동네찾기폼 (Form2)으로 감


button2 : 등록추가폼 (Form3)으로 감


button3 : Image 속성지정. 현재 동네예보지역 RSS Link를 사용하여 기상청 링크로 감


dataGridView1 : 그리드뷰 (현재 동네예보지역의 날씨 RSS 정보)


imageList1 : 이미지 리스트 (날씨아이콘)


2. 비모달형 Form2.cs (동네예보 코드검색)에 각종 컨트롤을 추가한다. (10%)



사용자 삽입 이미지


동네예보 코드검색 (Form2)


-Text 속성은 동네예보 코드검색


-Size 속성은 310,160


label1 : 동이름


textBox1 : 동이름 입력 텍스트박스


button1 : 검색버튼


linkLabel1 : 검색된 동네예보 보기


 


3. 모달형 Form3.cs (동네예보 관심지역 설정)에 각종 컨트롤을 추가한다. (10%)


사용자 삽입 이미지
동네예보 코드검색
(Form2)


-Text 속성은 동네예보 코드검색


-Size 속성은 320,340


label1 : 동이름


textBox1 : 동이름 입력 텍스트박스


listBox1 : 추가된 동이름 리스트


button1 : 리스트박스에 동이름 추가버튼


button2 : “확인버튼


button3 : “취소버튼


 


3. DongCode, RssFeedData, RssManager 클래스를 구현함. (10%)


DongCode


-Code : 1111056000


-Name : 평창동


-ParentCode : 11110


-ParentName : 종로구


-X : 60


-Y : 127


RssFeedData


-Hour, Day, Temperature, MaximumTemperature, LowTemperature, Sky, Pty, WeatherForecast, Pop, Wind, WindDirection, Humidity, Rain, Snow // 시각, 날짜, 기온, 최대기온, 최저기온, 하늘상태코드, 강수상태코드, 날씨, 강수확률, 풍속, 풍향, 습도, 12시간 예상강수량, 12시간 예상적설량


public override string ToString() // csv format 출력


public virtual object[] ToDataRow() // Day, Hour, WeatherForecast, Pop, Rain, Temperature, Wind, WindDirection, Humidityobject[]로 묶어서 반환


 


RssManager


-static string PubDate 속성 : 발표 시각


-static string Category 속성 : 서울특별시 종로구 평창동


-static string Link 속성 : 기상청 사이트 바로가기 링크


http://www.kma.go.kr/weather/forecast/timeseries.jsp?searchType=INTEREST&dongCode=1111056000


public static List<RssFeedData> ReadFeed(string url)


 


4. Form1.cs에 각종 이벤트 핸들러를 추가한다. DongCode, RssManager를 사용함. (20%)


– public List<DoneCode> zoneList = new List<DongCode>();


– public List<RssFeedData> rssFeedList = null;


 


그리고 메소드는 다음을 포함한다.


– private void Form1_Load(object sender, EventArgs e) { … } // LoadZoneData, LoadImageList, ReadRss


– private void button1_Click(object sender, EventArgs e) { … } // Form2.Show()


– private void button2_Click(object sender, EventArgs e) { … } // Form3.ShowDialog()


– private void button3_Click(object sender, EventArgs e) { … } // InternetExplorer호출


private void ReadRss(string rss) // RssManager.ReadFeed를 이용하여 rss를 읽어들여 파싱해서 데이터를 로딩하고 dataGridView1, textBox1, label1를 update


– private void comboBox1_SelectedValueChanged(object sender, EventArgs e) { …} // item을 선택했을 시 해당 동네예보 사이트 정보로 ReadRss()


 


5. 비모달형 대화상자 (Modeless Dialog)Form2.cs에 각종 이벤트 핸들러를 추가한다. (10%)


– private void button1_Click(object sender, EventArgs e) { … } // 메인폼(Form1)zoneList에서 LINQ를 이용하여 textBox1.Text와 같은 것이 있는지 검색하여, DongCode를 찾았으면 linkLabel1.Text에 출력


– private void linkLabel1_LinkClicked(object sender, EventArgs e) { … } // 찾은 동코드를 이용하여 메인폼(Form1)ReadRss를 다시하고 데이터를 업데이트함


 


6. 모달형 대화상자 (Modal Dialog)Form3.cs에 각종 이벤트 핸들러를 추가한다. (10%)


– private void Form3_Load(object sender, EventArgs e) { … } // 호출되면 Form1comboBox1.Items를 이용하여 Form3listBox1.Items에 데이터 추가함


– private void button1_Click(object sender, EventArgs e) { … } // 메인폼(Form1)zoneList에서 LINQ를 이용하여 textBox1.Text와 같은 것이 있는지 검색하여, DongCode를 찾았으면 listBox1에 데이터 추가함


– private void listBox1_DoubleClick(object sender, EventArgs e) { … } // listBox1에 아이템을 선택하여 더블클릭하면 해당 아이템을 삭제함


 


7. 본인이 원하는 기능을 더 추가하고, 결과를 모두 출력해서 넣는다. (보고서 점수에 포함)


결과예시:


 

LINQ 사용하여 검색하기

1. WeatherInfo 리스트에서 LINQ 사용하여 검색하기

public IList<WeatherInfo> GetWeatherInfoListByTemperatureRange(double min, double max)
{
            IList<WeatherInfo> tList = (from w in wList where (w.AverageTemperature >= min && w.AverageTemperature <= max) orderby w select w).ToList();
            return tList;
}


2. WeatherInfo 리스트에서 FindAll과 delegate 사용하여 검색하기

public IList<WeatherInfo> GetWeatherInfoListByTemperatureRange2(double min, double max)
{
            IList<WeatherInfo> tList = wList.FindAll(delegate(WeatherInfo w)
            { return (w.AverageTemperature >= min && w.AverageTemperature <= max); });
            return tList;
}

Import

        // 디렉토리 안에 있는 모든 파일을 읽는다
        public static void Import(string Path, string ext, ref List<WeatherInfo> tList)
        {
            //if (File.Exists(Path))
            if (Directory.Exists(Path))
            {
                Console.WriteLine(Path);
                string[] files = Directory.GetFiles(Path, ext);
                foreach (var file in files)
                    Import(file, ref tList);
            }
        }

       // 개별 파일을 읽는다
        public static void Import(string filename, ref List<WeatherInfo> vList)
        {
               // 파일이 존재하면 읽는다.
        }

HW3 class

————————————————————————-
Program.cs
Main()
– WeatherInfoFileManager.Import(디렉토리, 파일확장자명, ref wList)
while (종료하지않는다면) {
-LINQ 쿼리 (사용자 입력은 쿼리방식 지정)
-WeatherInfoFileManager.Export(쿼리파일명, ref queriedList)
-WeatherInfoManger Sort 후(사용자 입력은 Sort방식 지정)
-WeatherInfoFileManager.Export(소스된파일명, ref sortedList)
}


————————————————————————-
WeatherInfo: IComparable<WeatherInfo>, IEquatable<WeatherInfo> 
– 년,월,일,기온,… WindChillTemperature & HeatIndex 추가


————————————————————————-
WeatherInfoComparer.cs (여러개의 컴패어러 클래스들 포함)
-class WeatherYearComparer : IComparer<WeatherInfo>
-class WeatherMonthComparer : IComparer<WeatherInfo>
….


————————————————————————-
WeatherInfoManager
public List<WeatherInfo> wList = new List<WeatherInfo>();
-public void Sort(SortMode mode) { // 내부구현 필요 }
-public void Print()
-LINQ 사용해서 특정날짜나 특정 기준에 맞는 쿼리를 함


————————————————————————-
WeatherInfoFileManager
-public static void Import(string path, string ext, ref List<WeatherInfo> tList)


   string[] files = Directory.GetFiles(path, ext);




-public static void Import(string filename, ref List<WeatherInfo> tList)
-public static void Export(string filename, ref IList<WeatherInfo> tList)

HW3

연습문제 (3)







단원 : C# 기초


목표 : C# 객체지향 프로그래밍


주요 연습 내용 : collections, class, interface, 속성, FileIO, LINQ 연습


준비자료 : 기상데이터


  8043775710.zip


연습문제 Ex3 (Due by 11/15 24시까지)


-cyber 강의실 (cyber.dku.edu)source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex3.zip으로 묶어서 낼 것. 보고서 (30%)


 


[연습문제]


1. WeatherInfo.cs 파일에 WeatherInfo 클래스를 정의하라. (10%)


다음 속성(Property)를 지정하여 외부에서 사용할 수 있도록 한다.


– public int Year { get; set;}


– public int Month { get; set;}


– public int Day { get; set;}


– public double MaximumTemperature { get; set;} // 최대기온 (섭씨 도)


– public double AverageTemperature{ get; set;} // 평균기온 (섭씨 도)


– public double LowTemperature{ get; set;} // 최저기온 (섭씨 도)


– public double Humidity { get; set;} // 평균습도(%)


– public double Wind { get; set;} // 평균풍속 (m/s)


– public double DaylightHours { get; set;} // 일조시간 (hr)


– public double Precipitation{ get; set;} // 강수량 (mm)


– public double SnowAccumulation { get; set;} // 최심신적설 (cm)


– public double AverageCloudCover { get; set;} // 일평균운량 ()




– public double WindChillTemperature { get; } // 체감온도 (11~3) 내부구현필요


– public double HeatIndex{ get; } // 열지수 (6~9) 내부구현필요


또한 다음 메소드를 포함한다.


– WeatherInfo() // 기본 생성자 내부구현 필요


– WeatherInfo(int, int, int, double, double, double, double, double, double, double, double, double)// 생성자 내부구현필요


– public override string ToString() // WeatherInfo의 모든 정보를 csv 포맷으로 출력하는 메소드 내부구현 필요


 


2. WeatherInfo클래스에 IComparable<WeatherInfo>IEquatable<WeatherInfo> 인터페이스를 상속받고 다음 메소드를 구현한다. (10%)


– public int CompareTo(WeatherInfo other) { // Year 순서대로 비교하는 내부구현 필요}


– public bool Equals(WeatherInfo other) { // Year & Month & Day가 일치하는지 내부구현 필요 }


 


3. WeatherInfoComparer.cs 파일에는 IComparer<WeatherInfo> 인터페이스를 상속받은 각종 비교 클래스들을 구현한다. WeatherInfoManager 클래스의 Sort 메소드에서 사용됨. (10%)


– class WeatherYearComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherMonthComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherDayComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherTemperatureComparer: IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherHumidityComparer: IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherWindComparer: IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherPrecipitationComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


 


4. WeatherInfoManager.cs 파일에는 WeatherInfoManager 클래스를 정의하라. (10%)


http://msdn.microsoft.com/en-us/library/system.collections.arraylist(VS.71).aspx


SortMode 열거형을 정의한다.


enum SortMode { Year, Month, Day, Temperature, Humidity, Wind, Precipitation }


WeatherInfoManager클래스는 리스트를 데이터 멤버로 포함한다.


public List<WeatherInfo> wList = new List<WeatherInfo>();


그리고 메소드는 다음을 포함한다. 


// 선택한 모드에 따라서 리스트의 데이터를 Year, Month, Day, Temperature, Humidity, Wind, Precipitation 순서로 정렬


// WeatherMonthComparer, WeatherDayComparer 등 사용


– public void Sort(SortMode mode) { // 내부구현 필요 }


// 리스트에 모든 WeatherInfo를 출력


– public void Print() { foreach (var w in wList) Console.WriteLine(w); }


5. WeatherInfoFileManager.cs 파일에는 WeatherInfoFileManager 클래스를 정의하라. (10%)


// 지정한 디렉토리 (path)에 지정한 파일확장자 (ext)인 모든 파일을 읽어서 Import


– public static void Import(string path, string ext, ref List<WeatherInfo> tList) { // 내부적으로 Import(string filename, ref List<WeatherInfo> tList) 호출 }


// cvs(comma separated value) 텍스트를 읽어서 wList에 추가


// StreamReader 사용


– public static void Import(string filename, ref List<WeatherInfo> tList) { // 내부구현 필요 }


// 지정한 파일명(filename)으로 tList의 모든 원소를 cvs(comma separated value) 텍스트로 저장


// StreamWriter 사용


– public static void Export(string filename, ref IList<WeatherInfo> tList) { // 내부구현 필요 }


 


6. WeatherInfoManger클래스 또는 Program 클래스의 Main 함수에서 본인이 더 테스트해보고 싶은 Method를 추가하라. 디렉토리에 데이터를 읽어서, 여러 가지 방법으로 정렬 및 LINQ 쿼리를 한 후 새로운 파일에 저장한다. (20%)



// LINQ를 이용하여 리스트에서 지정한 평균온도 내에 있는 것만 List로 추출


public IList<WeatherInfo> GetWeatherInfoListByTemperatureRange(double min, double max) { // 내부구현 필요 – LINQ 와 ToList() 사용  }


 


// LINQ를 이용하여 리스트에서 지정한 평균습도 내에 있는 것만 List로 추출


public IList<WeatherInfo> GetWeatherInfoListByHumidityRange(double min, double max) { // 내부구현 필요 – LINQ 와 ToList() 사용 }


 


// LINQ를 이용하여 11~ 익년 3월 기간 동안 것만 List로 추출하여 체감온도 계산


// LINQ를 이용하여 6~ 9월 기간 동안의 것만 List로 추출하여 열지수 계산


public IList<WeatherInfo> GetWeatherInfoListByMonthRange(double min, double max) { // 내부구현 필요 – LINQ 와 ToList() 사용  }


ArrayList wicList

ArrayList wicList = new ArrayList();
do
{
/// 중간 생략
               WeatherIndex calc = WeatherIndexFactory.GetInstance(value);
                wicList.Add(calc);
/// 중간 생략
} while (Console.ReadKey().Key != ConsoleKey.Escape);

foreach (WeatherIndex wic in wicList)
{
/// 중간 생략
}

열지수 공식 계산

// F: 화씨온도 R: 상대습도
double HI = (-42.379 + (2.04901523 * F) + (10.14333127 * R) – (0.22475541 * F * R) – (0.00683770 * F * F) – (0.05481717 * R * R) + (0.00122874 * F * F * R) + (0.00085282 * F * R * R) – (0.00000199 * F * F * R * R));
HI = (HI – 32) / 1.8; // 화씨를 섭씨온도로 변환
HI = Math.Round(HI * 10) / 10.0;

WeatherInfo

// 섭씨 기온

public double Temperature
{

     get;

     set;

}

 

// 화씨 기온

public double Fahrenheit

{

     get

     {

          return  (Temperature에서 섭씨 -> 화씨 변환하는 공식으로 화씨값 반환)

     }

     set

     {

           value에서 화씨 -> 섭씨 변환하는 공식으로 Temperature 셋팅

     }

}


// 풍속 (m/s)

public double Wind
{

     get;

     set;

}


// 풍속 (Km/h)  1 m/s = 3.6 Km/h = (1/1000) Km / (1/3600) h

public double WindKmh
{

     get
     {
          return (Wind에서 변환하여 Kmh값 반환)
     }

     set
     {
          value에서 변환하여 Wind 셋팅
     }

}