ЛабРаб_ООП
.pdfВказівки до завдання 3.
Елементам управління рекомендується дати такі імена: lhsOperand, rhsOperand, expression, result –
для полів типа TextBox; remainder, division, multiplication, subtraction, addition – для елементів типа RadioButton; quit, calculate – для кнопок Button.
Для обчислень корисно ввести методи, подібні такому:
private void subtractValues()
{
int lhs = int.Parse(lhsOperand.Text); int rhs = int.Parse(rhsOperand.Text); int outcome;
outcome = lhs – rhs;
expression.Text = lhsOperand.Text + " – " + rhsOperand.Text; result.Text = outcome.ToString();
}
Тут значення, що вводяться користувачем, перетворяться до цілого типу за допомогою методу int.Parse().
Вказівки до завдання 4.
На форму треба помістити два елементи управління типа DateTimePicker, назвавши їх first і second. (Ці елементи управління відображають календар, в якому можна вибрати дату.) У початковий момент ці елементи управління повинні відображати поточну дату.
Обробник натиснення на кнопку Compare може мати приблизно такий вигляд:
private int compare_Click(object sender, System.EventArgs e)
{
int diff = dateCompare(first.Value, second.Value);
info.Text = |
""; |
show("first |
== second", diff == 0); |
show("first |
!= second", diff != 0); |
show("first |
< second", diff < 0); |
show("first |
<= second", diff <= 0); |
show("first |
> second", diff > 0); |
show("first >= second", diff >= 0);
}
Тепер залишилося написати методи dateCompare і show. Структура методу dateCompare може бути така:
private int dateCompare(DateTime leftHandSide, DateTime rightHandSide)
{
// TO DO return . . .;
}
Параметри типа DateTime мають властивості Year, Month, Day. Їх треба використовувати в методі dateCompare.
Метод show показує результати порівняння в полі info типа TextBox.
21
Приклади [29]
Приклад #1: Прості типи даних |
|
|
class TestMain |
|
|
{ |
|
|
public static void Main( ) // Code Starts Here |
||
{ |
|
|
bool b=true; |
System.Console.WriteLine(b); |
// boolean |
byte by=200; |
System.Console.WriteLine(by); |
// byte |
sbyte sby=-100; System.Console.WriteLine(sby); // signed byte |
||
decimal dec=10m; System.Console.WriteLine(dec);//decimal(28-29 signif) |
double dbl=12.2e23; System.Console.WriteLine(dbl); // double prec. float fl=12.2f; System.Console.WriteLine(fl); // single prec.
char c='A'; |
System.Console.WriteLine(c); |
|
// unicode character |
|||
short sh=10; |
System.Console.WriteLine(sh); |
// |
signed 16 bit |
|||
ushort ush=10; |
System.Console.WriteLine(ush); |
// unsigned 16 bit |
||||
int i=10; |
System.Console.WriteLine(i); |
// |
signed 32 bit |
|||
uint ui=10; |
System.Console.WriteLine(ui); |
// unsigned 32 bit |
||||
long l=10; |
System.Console.WriteLine(l); |
// signed 64 bit |
||||
ulong ul=10; |
System.Console.WriteLine(ul); |
// unsigned 64 bit |
||||
} |
|
|
|
|
|
|
} |
|
|
|
|
|
|
Приклад #2: Приведення типів |
|
|
|
|
||
class TestMain |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
public static void Main( ) |
// Code Starts Here |
|
||||
{ |
|
|
|
|
|
|
int x; |
|
|
|
|
|
|
x='A'; |
// implicit cast (неявне приведення) |
|
||||
x= (int) 34.34F; // explicit cast (явне приведення) |
||||||
decimal dec=x; // implicit cast |
|
|
|
|||
dec = (decimal)6.673e-11 ; |
//explicit cast |
|
|
|||
dec=12+'A'; |
// implicit cast |
|
|
|
||
System.Console.WriteLine(dec); |
|
|
|
|||
} |
|
|
|
|
|
|
} |
|
|
|
|
|
|
Приклад #3: Функції
using System; class TestMain
{
private static int Sum(int x,int у) int total;
total=x+y; return total;
}
private static void Sum(int x,int у,out int total) // out modifier
{
total=x+y;
}
private static void Sum(int x,int у,ref int total) // by ref
{
Console.WriteLine("Total = "+total); total=x+y;
}
public static void Main( )
22
{
Console.WriteLine("Sum="+Sum(10,20)); int ans;
Sum(20,30,out ans); // Must call with out Console.WriteLine("Sum="+ans);
ans=123;
Sum(30,40,ref ans); // Must Call with ref Console.WriteLine("Sum="+ans);
}
}
Приклад #4: Призначене для користувача введення
using System;
class TestMain
{
public static void Main( )
{
Console.Write("Enter A Line: "); String line=Console.ReadLine(); Console.WriteLine("You Entered: "+line);
}
}
Приклад #5: Операція ==
using System;
class Disk
{
private String mName;
public Disk(String name) { mName=name; } String GetName() { return mName; }
}
class TestMain
{
public static void Main( )
{
Disk x=new Disk("One"); Disk y=new Disk("Two");
if(x==y) // Check if x references same object as у Console.WriteLine("x+y reference same object"); }
x=y;
if(x==y) // Check if x references same object as у Console.WriteLine("Now x+y reference same object"); }
// In Strings the == operator is overloaded to compare the values of strings Console.Write("Enter а string:");
String str1=Console.ReadLine(); // Read а string in Console.Write("Enter а string:");
String str2=Console.ReadLine(); // Read а string in
if(str1==str2)
Console.WriteLine("Both strings are the same"); } else
Console.WriteLine("Strings are different"); }
}
}
23
Приклад #6: Перетворення типа String в будь-який простий тип using System;
class TestMain
{
public static void Main( )
{
String one="111111";
int i=Convert.ToInt32(one); // Conversions may throw exceptions double db=Convert.ToDouble(one);
decimal dec=Convert.ToDecimal(one);
}
}
Приклад #7: Структури
using System;
struct Point
{
public int x,y;
}
class TestMain
{
public static void Main( ) Point pt;
pt.x=10; pt.y=20;
}
}
Приклад #8: Перерахування
using System;
enum Colors { BLUE=0xFF0000,GREEN=0x00FF00,RED=0x0000FF}
class TestMain
{
static void Main()
{
Console.WriteLine("Data: "+Colors.BLUE);
Colors x=Colors.GREEN;
Console.WriteLine("Data: "+x);
}
}
Приклад #9: Форматоване виведення
using System; class TestMain
{
private static void Main()
{
Console.WriteLine("{0}={1}+{2}",23,20,3);
Console.WriteLine("{0} {1} {1} {1} {2} {2} {2}","Hello",123,45.5); Console.WriteLine("{0}"");
// format specifier
Console.WriteLine("{0:c}",123); // Print in Currency Console.WriteLine("{0:x}",2222321); // print in hexidecimal Console.WriteLine("{0:f}",1.2343); // print as float
// Total Space
24
Console.WriteLine("-- |
>{0,10}<-- |
",800); |
// 10 spaces on right |
|
Console.WriteLine("-- |
>{0-10}<--",800); |
// |
10 spaces on left |
|
Console.WriteLine("-- |
>{0,10}<-- |
",1234.5); |
|
Console.WriteLine("-->{0-10}<--",1234.5);
// Total Space+format specifier Console.WriteLine("-->{0,10:f}<--",56); Console.WriteLine("-->{0,10:x}<--",56); Console.WriteLine("-->{0-10:x}<--",561);
// Extra modifers
Console.WriteLine("-->{0:f4}<--",1.23); // 4 spaces after decimal Console.WriteLine("-->{0:x6}<--",1234);//Print 6 spaces + pad with zero Console.WriteLine("-->{0:c2}<--",1234.2323); // print 2 spaces after zero
// What is the output? Console.WriteLine("-->{0,10:f4}<--",123); Console.WriteLine("-->{0-10:f4}<--",123); Console.WriteLine("-->{0,20:c2}<--",1231121); Console.WriteLine("-->{0-20:c2}<--",12321212);
}
}
Лабораторна робота №2. Цикли, рядки, файли в C#.
Мета роботи: засвоїти основні управляючі конструкції мови C#, набути практичних навичок роботи з рядками і файлами.
Завдання.
1.Розробити консольний і графічний варіант простого переглядача текстових файлів. Використовувати елементи управління Button, Label, TextBox, OpenFileDialog і оператор циклу while. Зразок вигляду головного вікна програми в графічному варіанті:
25
2.Розробити програму, що демонструє кроки перетворення цілого числа в рядок з використанням циклу do . . . while. Зразковий вид головного вікна програми.
Хід роботи.
1.Виконати Вправу 1.
2.Виконати Вправу 2.
3.Виконати завдання 1-2.
Вправа 1. Використання класу FileStream для читання з файлу з довільним доступом
Наступний приклад демонструє прочитування даних з файлу з довільним доступом. Як файл, з якого проводитиметься читання, використовується файл .cs самого застосування.
1.Відкрийте Visual Studio 2005 і створіть нове C# Console Application, назвавши його
ReadFile.
2.Додайте два наступні оголошення просторів імен в самий початок файлу Class1.cs. Простір імен System.IO необхідний для класу FileStream, а простір імен System.Text буде потрібний для здійснення перетворення, яке нам доведеться виконувати над байтами, що прочитуються з файлу.
using System; using System.IO; using System.Text;
3. Додайте наступний код в метод Main():
static void Main(string[] args)
{
byte[] byData = new byte[100]; char[] charData = new char[100]; try
{
FileStream aFile = new FileStream(“../../Class1.cs”,FileMode.Open); aFile.Seek(55, SeekOrigin.Begin);
aFile.Read(byData, 0, 100);
}
catch(IOException e)
{
Console.WriteLine(“An IO exception has been thrown!”);
26
Console.WriteLine(e.ToString());
Console.ReadLine();
return;
}
Decoder d = Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0);
Console.WriteLine(charData);
Console.ReadLine();
return;
}
4. Запустіть застосування.
Вправа 2. Відрядкове читання з файлу за допомогою класу StreamReader
1.Відкрийте Visual Studio 2005 і створіть нове C# Console Application, назвавши його
StreamRead.
2.Додайте оголошення простору імен System.IO.
3.Додайте наступний код в метод Main():
static void Main(string[] args)
{
string strLine; try
{
FileStream aFile = new FileStream(“Log.txt”,FileMode.Open); StreamReader sr = new StreamReader(aFile);
strLine = sr.ReadLine(); //Відрядкове прочитування даних while(strLine != null)
{
Console.WriteLine(strLine); strLine = sr.ReadLine();
}
sr.Close();
Console.ReadLine();
}
catch(IOException e)
{
Console.WriteLine(“An IO exception has been thrown!”); Console.WriteLine(e.ToString());
Console.ReadLine();
return;
}
return;
}
4.Створіть в директорії StreamRead\bin\Debug файл Log.txt.
5.Запустіть застосування.
Методичні вказівки та теоретичні відомості.
Цикли
Щоб багато разів виконати послідовність програмних інструкцій, необхідно організувати цикл. У мові C# циклічні конструкції представлені в багатому асортименті.
27
Цикл for
Загальний формат запису циклу for для повторного виконання однієї інструкції має наступний вигляд:
for(ініціалізація; умова; ітерація)Інструкція;
Якщо цикл for призначений для повторного виконання програмного блоку, то його загальний формат виглядає так:
for(ініціалізація; умова; ітерація)
{
Послідовність інструкцій
}
Елемент ініціалізація зазвичай є інструкцією привласнення, яка встановлює початкове значення змінній циклу. Ця змінна діє як лічильник, який управляє роботою циклу. Елемент умова є вираз типу bool, в якому тестується значення змінної циклу. Результат цього тестування визначає, виконається цикл for ще раз чи ні. Елемент ітерація – це вираз, який визначає, як змінюється значення змінної циклу після кожної ітерації. Зверніть увагу на те, що всі ці елементи циклу for повинні відділятися крапкою з комою. Цикл for виконуватиметься до тих пір, поки обчислення елементу умова дає дійсний результат. Як тільки умова стане помилковою, виконання програми продовжиться з інструкції, наступної за циклом for.
Приклад.
class TestMain
{
public static void Main( )
{
for(int i=0;i<10;++i)
{
if(i==5) { continue; }// continue
if(i>8) { break; }// break
System.Console.WriteLine(i);
}
}
}
Цикл while
Загальна форма циклу while має такий вигляд:
while (умова) інструкція;
Тут під елементом інструкція розуміється або одиночна інструкція, або блок інструкцій. Роботою циклу управляє елемент умова, який є допустимим виразом типу bool. Елемент інструкція виконується до тих пір, поки умовний вираз повертає значення true. Як тільки ця умова стане помилковою, управління передається інструкції, яка слідує за цим циклом.
Приклад.
class TestMain
{
public static void Main( ) int i;
i=0;
while(i<10)
{
i=i+1;
if(i==5) { continue; } if(i>8) { break; }
System.Console.WriteLine(i);
28
}
}
}
Цикл do-while
Третім циклом в C# є цикл do-while. На відміну від циклів for і while, в яких умова перевіряється при вході, цикл do-while перевіряє умова при виході з циклу. Це означає, що цикл do-while завжди виконується хоч би один раз. Його загальний формат має такий вигляд:
do {
інструкції;
} while (умова);
У наступній програмі цикл do-while використовується для відображення в зворотному порядку цифр, що складають задане ціле число.
using System;
class DoWhileDemo {
public static void Main() {
int num;
int nextdigit;
num = 198;
Console.WriteLine(“Число: ” + num);
Console.WriteLine(“Число із зворотним порядком цифр: ”);
do {
nextdigit = num % 10; Console.Write(nextdigit); num = num / 10;
} while(num > 0);
Console.WriteLine();
}
}
Цикл foreach
Цикл foreach використовується для опиту елементів колекції. Колекція – це група об'єктів. C# визначає декілька типів колекцій, і одним з них є масив. Формат запису циклу foreach має такий вигляд:
foreach (тип ім’я_змінної in колекція) інструкція;
Тут елементи тип і ім’я_змінної задають тип і ім'я ітераційної змінної, яка при функціонуванні циклу foreach набуватиме значень елементів з колекції.
Приклад.
using System;
public class ForEachLoop
{
public static int Main(string[] args)
{
int [] primes = {2, 3, 5, 7, 11, 13}; int sum = 0;
foreach (int prime in primes)
{
Console.Write("{0} ", prime); sum += prime;
}
Console.WriteLine(); Console.WriteLine("sum = {0}", sum); return 0;
}
29
}
Робота з рядками і символами
Клас Char
У C# є символьний тип char, заснований на класі System.Char і що використовує двобайтове кодування Unicode представлення символів. Для цього типу в мові визначені символьні константи
-символьні літерали. Константу можна задавати:
•символом в одинарних лапках;
•escape-послідовністю, що задає код символу;
•Unicode-послідовністю, що задає Unicode-код символу.
Ось декілька прикладів оголошення символьних змінних і роботи з ними:
public void TestChar()
{
char ch1='A', ch2 ='\x5A', ch3='\u0058'; char ch = new Char();
int code; string s; ch = ch1;
//перетворення символьного типу в тип int code = ch; ch1=(char) (code +1); //перетворення символьного типу в рядок
//s = ch;
s = ch1.ToString()+ch2.ToString()+ch3.ToString(); Console.WriteLine("s= {0}, ch= {1}, code = {2}",
s, ch, code); }//TestChar
Клас Char, як і всі класи в C#, успадковує властивості і методи батьківського класу Object. Але у нього є і власні методи і властивості, і їх немало. Зведення цих методів приведене в таблиці 3.
Таблиця 3. Методи класу Char
Метод |
|
|
Опис |
GetNumericValue |
Повертає чисельне значення |
символу, якщо він є цифрою, і (-1) |
|
|
інакше |
|
|
GetUnicodeCategory |
Всі символи розділені на категорії. Метод повертає Unicode |
||
|
категорію символу. |
|
|
IsControl |
Повертає true, |
якщо символ |
є таким, що управляє |
IsDigit |
Повертає true, |
якщо символ |
є десятковою цифрою |
IsLetter |
Повертає true, |
якщо символ |
є буквою |
IsLetterOrDigit |
Повертає true, |
якщо символ |
є буквою або цифрою |
IsLower |
Повертає true, |
якщо символ |
заданий в нижньому регістрі |
IsNumber |
Повертає true, |
якщо символ |
є числом (десятковою або |
|
шістнадцятковою цифрою) |
|
|
IsPunctuation |
Повертає true, |
якщо символ |
є розділовим знаком |
IsSeparator |
Повертає true, |
якщо символ |
є роздільником |
IsSurrogate |
Деякі символи Unicode з кодом в інтервалі [0x1000, 0x10FFF] |
||
|
представляються двома 16-бітовими "сурогатними" символами. |
||
|
Метод повертає |
true, якщо символ є сурогатним |
|
IsUpper |
Повертає true, |
якщо символ |
заданий у верхньому регістрі |
IsWhiteSpace |
Повертає true, |
якщо символ |
є "білим пропуском". До білих |
|
пропусків, крім пропуску, відносяться і інші символи, |
||
|
наприклад, символ кінця рядка і символ переведення каретки |
||
|
|
30 |
|