Консольное приложение на языке c#. Запись классов и объектов на c#
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Консольное приложение на языке c#. Запись классов и объектов на c#
1) Основные сведения о языке C# и NET Framework. Консольное приложение C#
Компиляции программы с одного из языков NET Framework(C#, C++, Visual basic )
выполняется в код CIL (common intermediate language - общий промужуточный язык.
Далее перед выполнением запускается JIT (just in time) компилятор для перевода программы в машинный язык.
CLR (common language runtime - общая среда времени выполнения) - среда предназначена для выполнения специально скомпилированной программы (managed - управляемого кода). Среда для managed кода обеспечивает автоматическое выделение и освобождение памяти. C# - только managed код!
Программа на C# .cs -> код CIL ->управляемый машинный код с помощью JIT -> выполнение средой CLR.
Сравнение с Java:
исходная программа .java -> байт код .class -> выполнение JVM(java virtual machine)
Консольное приложение:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}
2) Пример консольного приложения C#
Пример программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double z, x;
int y;
string s; // string - встроенный базовый тип для java и c#
Console.WriteLine("Введите x:"); // вывод строки
s=Console.ReadLine(); // ввод строки
x = Convert.ToDouble(s); // Convert - преобразование одного типа в другой
s=Console.ReadLine();
y=Convert.ToInt32(s);
z = Math.Sin(x) + y; // Math.sin(x) - статическая функция как в java math.
s = Convert.ToString(z);
Console.WriteLine(s);
Console.ReadKey(); // ожидание нажатия символа
}
}
}
Форматный вывод:
Console.WriteLine("Результат:{0}",s);
double y0=1,y1=2;
int y2=3;
Console.WriteLine("Первый:{2} Второй {1}, Третий {0}",y0,y1,y2); // значение y2, y1, y0
3 2 1
double y0=1.3456,y1=213.1;
int y2=3;
Console.WriteLine("Первый:{0:f2} Второй {1:e}, Третий {2,4}",y0,y1,y2); // 2,4 - 4 позиции для y2
Первый: 1.35 Второй 2,131000e002, Третий: 3
оператор выбора c#
Аналогичен C++, но break обязателен.
Пример.
Ввести номер дня недели и вывести его название
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int k;
string s;
s=Console.ReadLine();
k = Convert.ToInt32(s);
switch (k)
{
case 1: s = "Понедельник"; break;
case 2: s = "Вторник"; break;
case 3: s = "Среда"; break;
case 4: s = "Четверг"; break;
case 5: s = "Пятница"; break;
case 6: s = "Суббота"; break;
default: s = "Воскресенье"; break;
}
Console.WriteLine(s);
Console.ReadKey();
}
}
}
8
Воскресенье
default: s = "Воскресенье"; break; ->
case 7: s = "Воскресенье"; break;
8
8 // ни один case не подошел
Отличие от Си и С++ для условий на java и c#
В Си можно писать, например,
while(1)
{
....// выход при выполнении некоторого условия
}
или
k=10;
while|(k)
{
.....
k--;
}
В Си и иС++ - проверка, что выражение не равно 0.
В c# и java возможны только логические выражения.
k=10;
while(k>0)
{
....
k--;
}
bool Flag;
Flag=true;
while(Flag) // или while(Flag==true)
{
...
Flag=false;
}
циклы
Операторы while, do while, for, break, continue. Аналогичны c++
break прерывает работу цикла while, do while, for. Сразу выполняется команда, следующая за областью действия цикла.
continue - пропускает выполнение операторов до проверки нового условия
продолжения/ окончания цикла.
Пример использования for, break, continue
Вещественные числа вводятся по одному, не более заданного n и вычисляется их сумма. Если введенное число меньше заданного a, оно не добавляется к сумме, если больше b, суммирование прекращается и выводится полученная сумма.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double a, b,x,y;
int n,i;
string s;
Console.Write("Введите a: ");
s = Console.ReadLine();
a = Convert.ToDouble(s);
Console.Write("Введите b: ");
s = Console.ReadLine();
b = Convert.ToDouble(s);
Console.Write("Введите n: ");
s = Console.ReadLine();
n = Convert.ToInt32(s);
y = 0.0;
for (i = 0; i < n; i++) // цикл максимум n слагаемых
{
s=Console.ReadLine();
x = Convert.ToDouble(s); // очередное число
if (x < a)
continue; // не добавлять переход на ввод следующего
else
if (x > b)
break; // выход из цикла for
else
y += x; // обычное продолжение, добавка числа
}
Console.WriteLine("Сумма: {0}", Convert.ToString(y));
Console.ReadKey();
}
}
}
3) Массивы на C#
Массивы как в java являются ссылками и требуют инициализации.
Пример - инициализация массива и сложение всех его элементов
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] mas1; // объявление массива целых чисел
string s = "";
int i = 0;
int k = 0;
s=Console.ReadLine();
k = Convert.ToInt32(s); // k-размер массива пусть введен 15
mas1 = new int[k]; // инициализация массива mas1 - 15 элементов все нули
mas1 = new int []{1,3,5,7,9}; // повторно, теперь 5 элементов, нечетные числа
k = 0;
for (i = 0; i < mas1.Length; i++) // mas1.Length-размер массива равен 5
{
k+= mas1[i];
}
Console.WriteLine(Convert.ToString(k)); // сумма всех элементов = 25
Console.ReadKey();
}
}
}
Пример работы двумерного массива
double[,] matr1; // объявление массива
int m, n,j;
matr1 = new double[4, 3]; // инициализация 4x3
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
{
matr1[i, j] = i + j; // заполнение элементов
}
}
m = matr1.Length; // m=12=4x3 всего элементов
n = matr1.Rank; // n=2 размерность массива
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
{
s = Convert.ToString(matr1[i, j]);
s = s + " ";
Console.Write(s); // вывод элемента
}
Console.WriteLine(); // перевод на другую строку
}
Console.WriteLine("{0} {1}", m, n); // 12 2
Console.ReadKey();
0 1 2
1 2 3
2 3 4
3 4 5
12 2
4) Ввод нескольких чисел с консоли
После приглашения ввода трех чисел , пользователь вводит их с несколькими пробелами и табуляциями
2 4 6
Преобразованные числа записываются в массив Data.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] s1; // массив строк для разбивки строки на числа
string s = "";
int[] Data = new int[100]; // максимальное возможное количество
int N = 0; // количество чисел в массиве
Console.WriteLine("Введите 3 числа:");
s = Console.ReadLine();
// разбивать строку по пробелам и табуляциям убрав пустые элементы
s1 = s.Split(new char[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries);
for (i = 0; i < s1.Length; i++) // s1[0]=2 s1[1]=4 s1[2]=6
{
Data[N] = Convert.ToInt32(s1[i]);
N++;
}
for (i = 0; i < N; i++)
{
Console.WriteLine(Convert.ToString(Data[i]));
}
Console.ReadKey();
}
}
}
считана строка:
s="2 4 6"
Split разбивает на подстроки , разбивая по пробелу и табуляции:
s1[0]="2"
s1[1]="4"
s1[2]=" "
s1[3]="6"
RemoveEmptyEntries удаляет пустые:
s1[0]="2"
s1[1]="4"
s1[2]="6"
s1.Length=3
вывод:
2
4
6
5) Проверка правильности ввода чисел с консоли
При вводе строки через ReadLine() и переводе в число Convert.ToDouble(s) возможен случай, когда введенные символы в строку s в число не переводятся.
1 вариант. Использование Convert с исключениями try catch.
2 вариант. Использование функций TryParse
int k;
double y;
string s;
s = Console.ReadLine();
k = Convert.ToInt32(s); // обычный перевод
bool p;
p = int.TryParse(s,out k); // p=true - перевод удался в k - результат
p = double.TryParse(s, out y); // y - результат
out - параметр, возвращающий значение
Пример с повторением ввода в случае ошибки при вводе.
double y;
string s;
bool p;
p = false;
Console.WriteLine("Введите k:");
while (!p)
{
s = Console.ReadLine();
p = int.TryParse(s, out k);
if (!p)
{
Console.WriteLine("Повторите ввод:");
}
}
6) Классы на C#
Создать новое консольное приложение.
Проект - добавить класс
имя: Record
создан файл Record.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
}
}
В C# кроме полей и методов имеются свойства (property) для задания доступа к private полям.
работа со свойствами
Record.cs
namespace ConsoleApplication1
{
class Record
{
private int min;
private int sec; // поле
public int Sec // свойство
{
get
{
return sec;
}
set
{
if (value >= 0 && value < 60)
{
sec = value;
}
}
}
}
}
Program.cs
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Record a=new Record(); // как в java инициализация
a.Sec = 26; // set - вызов метода у свойства
a.Sec=72; // не присвоилось осталось прежнее 26
int b;
b = a.Sec; // get - вызов метода у свойства
}
}
}
Добавление методов, полный пример класса Record.
Record.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min;
private int sec;
lic int Sec
{
get
{
return sec;
}
set
{
if (value >= 0 && value < 60)
{
sec = value;
}
}
}
public void Init(int m,int s)
{
min=m;
sec=s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: "+s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
public void Read()
{
string s="";
s= Console.ReadLine();
string[] s1;
s1 = s.Split(new char[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries);
min = Convert.ToInt32( s1[0]);
sec = Convert.ToInt32(s1[1]);
}
public int Numbersec()
{
return min * 60 + sec; // число секунд
}
public Record Add(Record a, Record b) // сложение 2 Record
{
Record c;
c = new Record();
c.min = a.min + b.min;
c.sec = a.sec + b.sec;
if (c.sec >= 60)
{
c.min++;
c.sec = c.sec - 60;
}
return c; // результат тип Record
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Record a=new Record();
a.Sec = 26;
a.Sec = 72; // не присвоилось a.sec=26 прежнее значение
int k;
k = a.Sec; // k=26
Record b = new Record();
b.Init(2, 10); // 2 min, 10 sec
b.Display();
Record c = new Record();
c.Read();
c.Display();
k = b.Numbersec();
Console.WriteLine("{0}", k);
Record d = new Record();
d = a.Add(b, c);
d.Display();
Console.ReadKey();
}
}
}
7) Несколько классов на C#
Record.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: " + s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
public int Numbersec()
{
return min * 60 + sec; // число секунд
}
public Record Add(Record a, Record b) // сложение 2 Record
{
Record c;
c = new Record();
c.min = a.min + b.min;
c.sec = a.sec + b.sec;
if (c.sec >= 60)
{
c.min++;
c.sec = c.sec - 60;
}
return c; // результат тип Record
}
}
}
Sportsman.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Sportsman
{
private string fam; // фамилия
public string Fam // свойство
{
get
{
return fam;
}
}
private Record r1 = new Record(); // первый результат
private Record r2 = new Record(); // второй результат
public void Init(string f, int m1, int s1, int m2, int s2)
{
fam = f;
r1.Init(m1, s1); // задание значений 1 результата
r2.Init(m2, s2); // задание значений второго результата
}
public void Display()
{
string s;
s = "Фамилия: " + fam;
Console.WriteLine(s); // вывод фамилии
Console.Write("первый результат: ");
r1.Display(); // вывод 1 результата
Console.Write("второй результат: ");
r2.Display(); // вывод 2 результата
}
public Record Sumrez()
{
return r1.Add(r1,r2); // возвращает суммарный результат Record (r1+r2)
}
public Sportsman Better(Sportsman a, Sportsman b) // лучший из 2 спортсменов
{
int k1, k2;
k1 = a.r1.Numbersec() + a.r2.Numbersec(); // общее число секунд первого
k2 = b.r1.Numbersec() + b.r2.Numbersec();// общее число секунд второго
if (k1 < k2)
return a;
else
return b;
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Sportsman P1,P2,P3;
P1 = new Sportsman();
P2 = new Sportsman();
P3 = new Sportsman();
P1.Init("Иванов", 2, 56, 3, 12);
P1.Display(); // вывод информации P1 (1)
P2.Init("Петров", 2, 48, 3, 19);
P3=P3.Better(P1,P2); // P3 - лучший из P1, P2
string s;
s = P3.Fam; // s - фамилия лучшего
Console.WriteLine("Спортсмен " + s + " лучше");
Record r;
r = P3.Sumrez(); // Record r - сумма 2 результатов P3
Console.WriteLine("Его результат:");
r.Display();
Console.ReadKey();
}
}
}
8) Массивы объектов на C#
Массивы объектов аналогичны java
Record[] ms;
ms = new Record[5];
int i;
for(i=0;i<5;i++)
{
ms[i] = new Record(); // инициализация каждого элемента
}
for (i = 0; i < 5; i++)
{
ms[i].Init(1, i);
}
int[] c = new int[5];
for (i = 0; i < 5; i++)
{
c[i] = ms[i].Numbersec();
}
for (i = 0; i < 5; i++)
{
Console.WriteLine(Convert.ToString(c[i]));
}
9) Присваивание объектов в c++, java,c#
во всех языках объекты можно присваивать друг другу.
с++
Присваивание обычных объектов
#include "stdafx.h"
#include
class Record
{
private:
int min,sec;
public:
void Init(int m,int s);
void Display();
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
void Record::Display()
{
printf("%d %d \n",min,sec);
}
int _tmain(int argc, _TCHAR* argv[])
{
Record a,b;
a.Init(3,5); // 3 min 5 sec
b.Init(4,6); // 4 min 6 sec
a=b; // теперь a (4 min 6 sec) поля копируются !
b.Init(7,8); // меняется b (7 min 8 sec)
b.Display(); // 7 8 что проинициализировано, то выводится
a.Display(); // 4 6 что присвоено, то выводится
}
7 8
4 6
Присваивание динамических объектов
Record *c,*d;
c=new Record;
d=new Record;
c->Init(3,5); // 3 min 5 sec
d->Init(4,6); // 4 min 6 sec
c=d; // теперь d(4 min 6 sec) c и d - один и тот же адрес !
d->Init(7,8); // меняется d (7 min 8 sec)
d->Display(); // 7 8 что проинициализировано
c->Display(); // 7 8 !!!
7 8
7 8
// меняем d и одновременно меняется c !!!
// c и d указывают на одну и ту же ячейку (одинаковые адреса)
// меняя поля одного объекта, меняются поля другого
На java и c# объекты - ссылки, также при присваивании получаются одинаковые адреса
Присваивание на java
class Record
{
private int min,sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
public void Display()
{
System.out.printf("%d %d \n",min,sec);
}
}
public class lab1
{
public static void main(String[] args)
{
Record c,d;
c=new Record();
d=new Record();
c.Init(3, 5);
d.Init(4, 6);
c=d;
d.Init(7, 8);
d.Display();
c.Display();
}
7 8
7 8
// как с указателями на c++
Присваивание на c#
class Record
{
private int min;
private int sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: "+s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
}
static void Main(string[] args)
{
Record c, d;
c = new Record();
d = new Record();
c.Init(3, 5);
d.Init(4, 6);
c = d;
d.Init(7, 8);
d.Display();
c.Display();
min: 7 sec: 8
min: 7 sec: 8
// как с указателями на c++ и ссылками на java
10) Структуры на c#
Структура на c # аналогична классам на c++ . Объекты структуры не являются ссылками.
При присваивании копируются поля.
struct Record
{
private int min, sec;
public void Init(int m, int s)
{
min = m;
sec = s;
}
public void Display()
{
string s, s1;
s1 = Convert.ToString(min);
s = "min: " + s1 + " ";
s1 = Convert.ToString(sec);
s = s + "sec:" + s1;
Console.WriteLine(s);
}
}
class Program
{
static void Main(string[] args)
{
Record c,d;
c = new Record();
d = new Record();
c.Init(3, 5);
d.Init(4, 6);
c = d;
d.Init(7, 8); // у c прежние значения, c,d - различные объекты
d.Display();
c.Display();
Console.ReadKey();
}
}
}
min: 7 sec: 8
min: 4 sec: 6 // !!!
// как с обычными объектами на c++
Структуры не являются ссылками и их можно не инициализировать new.
public int min, sec;
...........................
Record c;
c.min = 3;
c.sec = 4;
c.Init(3, 5);
c.Display();
min: 3 sec:5
Если записать:
private int min, sec;
....................
Record c;
c.Init(3,5); // ошибка компиляции c - не задано значение,
// хотя у структур min=0 sec=0 при определении Record c;