Справочник от Автор24
Поделись лекцией за скидку на Автор24

Свойства объектов в языках С++, Java, C#. Часть 1

  • 👀 354 просмотра
  • 📌 291 загрузка
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Свойства объектов в языках С++, Java, C#. Часть 1» doc
Свойства объектов в языках С++, Java, C# 1) Вызов метода внутри класса Метод может вызвать другой метод класса, при этом методу передаются значения полей С++ Класс треугольник, метод вычисления площади по 3 сторонам. p=(a+b+c)/2 - полупериметр Пусть периметр - вспомогательный метод, нужен только для вычисления площади, тогда метод P() – private #include #include class treug { public: float S(); // вычисление площади void Read(); private: float P(); // вычисление периметра, метод нужен только для вычисления S float a,b,c; }; void treug::Read() { scanf("%f %f %f",&a,&b,&c); } float treug::P() { return a+b+c; } float treug::S() { float p; p=P()/2; // вызов P() - без использования объекта типа trug x; p=x.P()/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } int _tmain(int argc, _TCHAR* argv[]) { treug D; float x; D.Read(); x=D.S(); printf("%f \n",x); x=D.P(); // ошибка, P() - private x=S(); // ошибка функция S() отсутствует return 0; } На Java и C# аналогично. 2) Константы в C++, Java, C# Константа на Си: #define N 10 .......... int mas[N],mas1[N]; Константа на С++: const int N=10; .................. int mas[N],mas1[N]; Константа на Java: final static int N=10; ................... int mas[] = new int[N]; Константа на C#: const int N = 10; ............ int[] mas = new int[N]; 3) Пакеты на Java Пакет позволяет разнести классы по отдельным файлам и обеспечить связь между полями и методами различных классов. Пакет – отдельный каталог, в котором размещается несколько файлов – public классов. Пример создания пакета Создание проекта: file – new – java project (lab4) Создание пакета: file – new – Package (sports) Создание отдельных 3 файлов-public классов file - new – class package sports; public class Record { protected int min,sec; public void Init(int m,int s) { min=m; sec=s; } public int Numbersec() { return min*60+sec; } } package sports; public class Sportsman { private int Straf; // дополнительное поле private Record r1 = new Record(); // поле типа Record private Record r2 = new Record(); // поле типа Record public void Init(int v,int m1,int s1,int m2,int s2) { Straf=v; r1.Init(m1, s1); // инициализация первого результата r2.Init(m2, s2); // инициализация второго результата } public int Sum() // общее число секунд { int k; k=r1.Numbersec(); // секунды первого k=k+r2.Numbersec(); // плюс секунды второго k=k+Straf*60; // штраф return k; } package sports; public class worksport { public static void main (String args[] ) { Sportsman a=new Sportsman(); int k,m; a.Init(1,2,6,1,55); k=a.r1.Numbersec(); m=a.Sum(); System.out.printf("ответ %d %d",k,m); } } Размещение: lab4\\src\\sports\\ record.java Sportsman.java worksport.java 4)Массивы вспомогательных объектов на Java и C# Замена полей объектов вспомогательных классов массивом объектов вспомогательных классов C++ динамический массив #include "stdafx.h" #include #include #include const int N=10; // максимальное число результатов 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); } class Sportsman { private: Record *records; // динамический массив int n; // текущее количество char fam[30]; public: void Init(char *f); void AddResult(int m, int s) ; // добавление в конец массива void Display(); void Insert(int k,int m,int s) ; }; void Sportsman::Init(char*f) { strcpy(fam,f); records=new Record[N]; // N - максимальное число результатов n=0; // у нового спорсмена нет результатов } void Sportsman::Display() { int i; printf("%s\n",fam); for(i=0;iInit(m,s); records[n]=*c; n++; } void Sportsman::Insert(int k,int m,int s) // вставка результата на место k { int i; for(i=n;i>k;i--) { records[i] = records[i - 1]; } Record *c; c=new Record; c->Init(m, s); records[k] = *c; n++; } int _tmain(int argc, _TCHAR* argv[]) { Sportsman a; a.Init("Иванов"); a.AddResult(3, 5); a.AddResult(3, 6); a.AddResult(3, 7); a.AddResult(3, 8); a.AddResult(3, 9); a.Insert(2, 4, 1); a.Display(); return 0; } Java package javaapplication4; 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 Sportsman { final static int N=10; // константа на java private String fam; private Record [] records =new Record[N]; int n; public void Init(String f) { fam=f; n=0; } public void Display() { int i; System.out.printf("%s\n",fam); for (i = 0; i < n; i++) // вывод всех результатов { records[i].Display(); } } public void AddResult(int m, int s) // добавка результата в конец массива { Record c=new Record(); c.Init(m, s); records[n] = c; n++; } public void Insert(int k,int m,int s) // вставка результата на место k { int i; for(i=n;i>k;i--) { records[i] = records[i - 1]; } Record c=new Record(); c.Init(m, s); records[k] = c; n++; } public static void main(String[] args) { Sportsman a=new Sportsman(); a.Init("Иванов"); a.AddResult(3, 5); a.AddResult(3, 6); a.AddResult(3, 7); a.AddResult(3, 8); a.AddResult(3, 9); a.Insert(2, 4, 1); a.Display(); } } 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); } } } Sortsman.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Sortsman { const int N=20; private string fam; private Record[] records = new Record[N]; // массив результатов (не более N) int n; public void Init(string f) { fam = f; n = 0; // для нового спортсмена результатов нет } public void AddResult(int m, int s) // добавка результата в конец массива { Record c=new Record(); c.Init(m, s); records[n] = c; n++; } public void Display() { int i; Console.WriteLine(fam); for (i = 0; i < n; i++) // вывод всех результатов { records[i].Display(); } } public void Insert(int k,int m,int s) // вставка результата на место k { int i; for(i=n;i>k;i--) { records[i] = records[i - 1]; } Record c=new Record(); c.Init(m, s); records[k] = c; n++; } } } Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Sortsman a = new Sortsman(); a.Init("Иванов"); a.AddResult(3, 5); a.AddResult(3, 6); a.AddResult(3, 7); a.AddResult(3, 8); a.AddResult(3, 9); a.Insert(2, 4, 1); a.Display(); Console.ReadKey(); } } } 5) Передача аргументов методов на C++ и C# перегрузка функций В 3 языках в одном модуле можно определить несколько функций с одинаковыми именами. Необходимо, чтобы у них было различное число аргументов и/или различный тип аргументов. Различие в возвращаемом типе недостаточно. На языке Си для вычисления абсолютной величины числа необходимо задать 2 функции: int abs(int x) { if(x>=0) return x; else return -x; } float fabs(double x) { if(x>=0) return x; else return -x; } main: double y,z; int a,b; ....... z=fabs(y); ...... b=abs(a); На C++, Java, C# возможны функции с одинаковыми именами в одном модуле, перегрузка функций. Пример С++ int abs(int x) // 1 функция { if(x>=0) return x; else return -x; } float abs(double x) // 2 функция, обе функции названы одинаково! { if(x>=0) return x; else return -x; } main: double y,z; int a,b; ....... z=abs(y); // какая функция вызвана, определяется типом фактического параметра 2 функция ...... b=abs(a); // вызывается 1 функция // float abs(int x) // ошибка, с такими аргументами функция есть, различие типов // недостаточно Функция ввода: int scanf("%d",&x); В x находится значение, введенное с консоли, а функция вернет 1( одно, число введено). Возможен также случай, когда необходимо тоже вернуть результат не через функцию, а через один из аргументов (например, в случае получения нескольких результатов). Си: Обычные аргументы не возвращают значений - передача параметра по значению. Неверное решение. class Record { private: int min,sec; public: void Init(int m,int s); int Numbersec(); // результат- через функцию void Numbersec(int x); // через аргумент, обе функции в одном классе, перегрузка }; void Record::Init(int m,int s) { min=m; sec=s; } int Record::Numbersec() { return min*60+sec; } void Record::Numbersec(int x) { x=min*60+sec; return; } main() { ... Record a; int k,m; a.Init(2,10); k=1; m=a.Numbersec(); // m=130, правильно a.Numbersec(k); // вызов второго метода k=1, значение прежнее ! } Для получения значения через аргумент в Си используются указатели. class Record { private: int min,sec; public: void Init(int m,int s); int Numbersec(); // результат через функцию void Numbersec(int *x); // параметр указатель }; ...... void Record::Numbersec(int *x) { *x=min*60+sec; // присваивание через указатель return; } main() { ... Record a; int k,m; a.Init(2,10); k=1; m=a.Numbersec(); // m=130, правильно a.Numbersec(&k); // передача адреса k=130 } C++ На C++ возможно получение значения через параметр ссылку. class Record { private: int min,sec; public: void Init(int m,int s); int Numbersec(); // результат через функцию void Numbersec(int *x); // через параметр указатель void Numbersec(int &x); // через параметр ссылку }; void Record::Init(int m,int s) { min=m; sec=s; } int Record::Numbersec() { return min*60+sec; } void Record::Numbersec(int *x) { *x=min*60+sec; return; } void Record::Numbersec(int &x) { x=min*60+sec; return; } main() { ... Record a; int k,m,n; a.Init(2,10); k=1; m=1; n=1; m=a.Numbersec(); // вызов первого методаm=130, правильно a.Numbersec(&k); // вызов второго метода k=130 a.Numbersec(n); // вызов третьего метода n=130 } Java На Java переменные передаются по значению (не возвращаемый параметр), а объекты по ссылке (возвращаются измененные поля объекта). Пример возвращения целого числа через вспомогательный класс из одного поля. class Rezult // вспомогательный класс для получения результата Numbersec { public int param; // единственное поле } 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 int Numbersec() // значение через функцию { return min*60+sec; } public void Numbersec(Rezult k) // значение через аргумент - класс { k.param=min*60+sec; // param – public – есть доступ из др. класса } } public class lab4 { public static void main(String[] args) { Record c=new Record(); int m,k; Rezult z=new Rezult(); // объект класса для получения результата c.Init(2, 10); m=c.Numbersec(); // первый метод c.Numbersec(z); // второй метод k=z.param; // k - результат, param - public System.out.printf("%d %d\n",m, k); } } 130 130 C# На C# имеется 2 типа возвращаемого параметра ref и out. Вариант с out 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 int Numbersec() { return min * 60 + sec; } public void Numbersec(out int k) // out - возвращаемый параметр { k = min * 60 + sec; } } class Program { static void Main(string[] args) { int k, m, n; Record a = new Record(); a.Init(2, 10); m = a.Numbersec(); // m=130 a.Numbersec(out n); // n=130 при вызове out указывается } } } Вариант с ref 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 int Numbersec() { return min * 60 + sec; } public void Numbersec(ref int k) // возвращаемый параметр ref { k = min * 60 + sec; } } class Program { static void Main(string[] args) { int k, m, n; Record a = new Record(); a.Init(2, 10); m = a.Numbersec(); n = 1; // ! перед вызовом ref параметр должен иметь значение a.Numbersec(ref n); // ref при вызове указывается a.Numbersec(ref k); // ! ошибка k – не задано значение } } } Вариант не работает out public void Numbersec(ref out k) // возвращаемый параметр ref { if(k<0) // ! ошибка компиляции. При проверке k должен быть задан k=0; else k = min * 60 + sec; } 6) Указатель (ссылка) на объект, вызывающий метод - this C++ В классе Record к методу Srednee с двумя аргументами добавим метод Srednee с одним (вторым) аргументом (Перегрузка). Первым аргументом будет вызывающий объект class Record { public: void Init(int m,int s); Record Srednee(Record a,Record b); Record Srednee(Record b); private: int min; int sec; }; void Record::Init(int m,int s) { min=m; sec=s; } Record Record::Srednee(Record a,Record b) { Record c; int k; c.min=a.min+b.min; k=a.sec+b.sec; if(k>=60) { c.min++; k=k-60; } c.min=c.min/2; c.sec=k/2; return c; } Record Record::Srednee(Record b) { Record c; int k; c.min=this -> min+b.min; // this -> - указатель на объект, который вызовет метод k=this -> sec+b.sec; if(k>=60) { c.min++; k=k-60; } c.min=c.min/2; c.sec=k/2; return c; } int main(int argc, char* argv[]) { int m,s,k; Record x,y,z; x.Init(4,36); // min=4 sec=36 y.Init(2,4); // min=2 sec=4 z=z.Srednee(x,y); // вызов 1 функции z.min=3 z.sec=20 (x+y) /2 z=x.Srednee(x,y); // вызов 1 функции z.min=3 z.sec=20 z=x.Srednee(y); // вызов 2 функции z.min=3 z.sec=20 (x+y) /2 z=z.Srednee(y); // вызов 2 функции z.min=2 z.sec=12 (z+y) /2 } Указатель this-> можно не использовать (this->min заменить на min). Поле без объекта методе означает поле вызывающего объекта. c.min=min+b.min; Java public class Record { private int min; private int sec; public int Numbersec() { return min*60+sec; } public void Init(int m,int s) { min=m; sec=s; } public Record Better(Record a,Record b) // с двумя аргументами лучшее время из двух { int s1,s2; s1=a.Numbersec(); s2=b.Numbersec(); if(s1= 60) { c.min++; c.sec -= 60; } return c; } public Record add(Record b) // с одним аргументом { Record c = new Record(); c.min = this.min + b.min; c.sec =this.sec + b.sec; if (c.sec >= 60) { c.min++; c.sec -= 60; } return c; } } class Program { static void Main(string[] args) { int k, m, n; Record a = new Record(); Record b = new Record(); Record c = new Record(); a.Init(2, 10); b.Init(2, 57); c = c.add(a, b); // можно c=a.add(a,b); c=a+b c: 5 7 c = a.add(b); // c=a+b c: 5 7 } } } 7) Дружественные функции на C++ Дружественная функция данного класса - это свободная функция ( не принадлежащая какому-либо классу) или метод другого класса, который имеет доступ к private полям данного класса. Пример. Дружественная функция округления объекта Record до минут. Если число секунд >=30 вернуть количество минут+1. #include "stdafx.h" class Record { private: int min,sec; public: void Init(int m,int s); friend int Roundmin(Record x); // дружественная функция свободная, вне класса }; void Record::Init(int m,int s) { min=m; sec=s; } int Roundmin(Record x) // нет Record:: { if(x.sec>=30) return x.min+1; else return x.min; } int _tmain(int argc, _TCHAR* argv[]) { int k; Record a,b,c,d; a.Init(2,35); k=Roundmin(a); // k=3 return 0; } Если убрать строку : friend int Roundmin(Record x); ошибка: int Roundmin(Record x) { if(x.sec>=30) // доступ к private полю sec вне класса return x.min+1; // min - private ! else return x.min; } Если min, sec сделать public, Roundmin работает без указания friend. Можно сделать класс A полностью дружественным B. В C# дружественные функции отсутствуют 8) Перегрузка операторов на C++ и C# Примеры перегрузки операторов на C++ char a,b; b=12; // в двоичной системе 00001100 a= b << 2; // логический сдвиг a: 00110000 Если слева от оператора << объект cout, выполняется вывод значения величины справа от << cout << a; Аналогично можно выполнить перегрузку операторов ++, +, * и т.д. для произвольных объектов. C++ Пример перегрузки оператора + для класса Record. При сложении двух объектов Record складываются значения полей, при добавлении к объекту числа, оно добавляется к sec. class Record { private: int min,sec; public: void Init(int m,int s); Record operator + (Record b); // сложение двух объектов operator + }; void Record::Init(int m,int s) { min=m; sec=s; } Record Record::operator+(Record b) { Record c; c.min=this->min+b.min; c.sec=this->sec+b.sec; if(c.sec>=60) { c.min++; c.sec -= 60; } return c; } int _tmain(int argc, _TCHAR* argv[]) { Record a,b,c,d; a.Init(2,25); b.Init(2,45); c.Init(3,5); d=a+b+c; // d: min = 8 sec = 15 return 0; } Перегрузка '+' , когда справа от '+' - число. #include "stdafx.h" class Record { private: int min,sec; public: void Init(int m,int s); Record operator + (Record b); Record operator + (int b); // сложение с числом справа }; void Record::Init(int m,int s) { min=m; sec=s; } ......... Record Record::operator+(int b) // сложение с числом справа { Record c; c.min=this->min; c.sec=this->sec+b; // добавка к секундам if(c.sec>=60) { c.min++; c.sec -= 60; } return c; } int _tmain(int argc, _TCHAR* argv[]) { int k; Record a,b,c,d; a.Init(2,35); a=a+45; // a: min=3 sec=20 return 0; } #include "stdafx.h" class Record { private: int min,sec; public: void Init(int m,int s); Record operator + (Record b); Record operator + (int b); friend Record operator +(int b,Record x); // дружественный оператор }; void Record::Init(int m,int s) { min=m; sec=s; } ..... Record operator +(int b,Record x) // отсутствуют Record:: { Record c; int k; c.min=x.min; c.sec=b+x.sec; if(c.sec>=60) { c.min++; c.sec=c.sec-60; } return c; } int _tmain(int argc, _TCHAR* argv[]) { int k; Record a,b,c,d; a.Init(2,35); b=15+a; // b: min =2 sec =50 return 0; } Аналогично можно перегрузить *, / и т.д. , определив операции над объектами Record, но приоритет операций сохраняется. z=x+a*v; - сначала умножение, потом сложение. Пример перегрузки префиксного и постфиксного оператора ++ Операторы увеличивают значение min на 1. Различие между операторами: int n,m; n=1; m=2; n=++m; // m=3 n=3 сначала увеличить, потом присвоить n=1; m=2; n=m++; // n=2, m=3 сначала присвоить, потом увеличить class Record { private: int min,sec; public: void Init(int m,int s); Record & operator ++(); Record operator ++(int unused); }; void Record::Init(int m,int s) { min=m; sec=s; } Record & Record::operator ++() // prefix { this->min++; return *this; } Record Record::operator++(int unused) // postfix { Record c = *this; ++*this; return c; } int _tmain(int argc, _TCHAR* argv[]) { Record a,b; a.Init(2,35); b=++a; //a: min=3 sec=35 b: min=3 sec=35 a.Init(2,35); b=a++; //a: min=3 sec=35 b: min=2 sec=35 return 0; } C# Перегрузка бинарных операторов выполняется методом класса с двумя аргументами, унарных с одним аргументом. 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 static Record operator +(Record a, Record b) // Record+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; } public static Record operator +(Record a, int b) // Record+int { Record c; c = new Record(); c.min = a.min; c.sec = a.sec + b; if (c.sec >= 60) { c.min++; c.sec = c.sec - 60; } return c; } public static Record operator +(int a, Record b) // int+Record { Record c; c = new Record(); c.min = b.min; c.sec = a + b.sec; if (c.sec >= 60) { c.min++; c.sec = c.sec - 60; } return c; } public static Record operator ++(Record x) // ++ один префикс и постфикс! { ++x.min; return x; } } class Program { static void Main(string[] args) { int k, m, n; Record a = new Record(); Record b = new Record(); Record c = new Record(); a.Init(3, 56); b.Init(4, 13); c.Init(5,10); c = a + b; // c: min=8 sec=9 c = c + 50; // c: min=8 sec=59 c = 10 + c; // c: min=9 sec=9 a = a + b + 10; // a: min=8 sec=19 a.Init(3, 5); b = a++; // b: min=4 sec=5 a.Init(3, 5); b = ++a; // b: min=4 sec=5 тоже самое, при присваивании b и a указывают на // ту же память } } } 9)Работа со строками на C++, Java и C# строка на Си – массив char или указатель: #include #include // строки на Си #include Строки на Си – массив символов int main(int argc, char* argv[]) { int k; char a[30]; // массив char – 1 вариант строки, длина не более 29 символов, в конце 0 char *b; // указатель, необходимо выделить память b=(char *)calloc(30,1); // 2 вариант строки после выделения памяти strcpy(b,”1234”); // копирование строки b[0]=’1’ b[1]=’2’ b[2]=’3’ b[3]=’4’ b[4]=’\0’ // строка оканчивается нулевым кодом // b=”1234”; // присваивается указатель константы, источник многих ошибок // strcat(b,"567"); // для b теперь только 5 байт printf("%s\n ",b); // вывод строки на консоли: 1234 и перевод строки strcpy(a,b); // a: 1234 в конце нуль - вместо присваивания a=b strcat(a,”56”); // сцепление строк a: 123456 в конце нуль puts(a); // вывод строки на консоли: 123456 без перевода строки if(strcmp(a,b) ==1) // значения strcmp(a,b) -1:ab k=strlen(a); // если условие выполнено k=6 - длина строки free(b); // не забыть освободить память } На C++, Java, C# строки представляют отдельные классы С++ #include using namespace std; int main(int argc, char* argv[]) { string c; // объект с класса string } using namespace std; - пространство имен указывается для заголовочных файлов C++ <...> без .h (#include - библиотека Си) Некоторые варианты задания строк C++ string a; string b(“12345”); string c[10]; // массив строк от c[0] до c[9] string d[3]={“11”,”222”,”3333”}; // 1 параметр и инициализацией массива на C++ присваивание перегружено для строк: string a(“”); // пустая строка string b("12345"); a=b; // a=”12345” на C++ операторы < <= == > >= != перегружены - сравнение: string a("12345"); string b("1245"); if(a, == - для строк не определены. Для сравнения используется метод CompareTo: s1="1234567"; s2="123868"; k=s1.compareTo(s2); // k=-4 разность первых несовпадающих кодов (4-8) k<0 первая строка меньше второй, k=0 строки равны, k>0 первая строка больше второй К символам строки нельзя обращаться как к элементам массива. Выбор отдельного символа строки метод charAt: char c; s1="1234567"; c=s1.charAt(3); // c=’4’ Перевод строки в массив байт getBytes(): byte bt[]=new byte[20]; s1=”1234567”; bt=s1.getBytes(); // bt[0]=’1’ bt[1]=’2’ ... Выделение подстроки: s1="1234567"; s2=s1.substring(3, 5); // s2==”45” (с третьего по пятый-1)!! с нуля Поиск подстроки: int k; s1="1234567"; k=s1.indexOf("56"); // k=4 (k=0 с начала строки k=-1 не найдено) Длина строки: int k; s1="1234567"; k=s1.length(); // k=7 C# Задание строк Строки на C# string является ссылками, но при задании и сравнении операции ==, != работают со значениями. Операция сцепления строк '+' определена на C# как и на Java. string s,s1; s="12345"; k = 0; s1 = "12356"; if (s != s1) k = 1; // k=1 Операции <, > и т.д. не определены. На Java не определены и операции == , != . Доступ к символам как элементам массива и длина строки: string s="12345"; int k; char c; k=s.Length; // k=5 c=s[3]; // c='4' Сравнение строк s="12345"; k = 0; s1 = "12356"; k = String.Compare(s1, s); // статический метод класса String k=1 Выделение подстроки s = "12345"; s1 = s.Substring(1, 3); // с какого номера (с нуля), сколько s1="234" Поиск подстроки s = "12345"; k = s.IndexOf("34"); // k=2 k=-1 не найдено Массив строк static void Main(string[] args) { string[] s = new string[5]; int i; for (i = 0; i < 5; i++) s[i] = Convert.ToString(i); Console.ReadKey(); }
«Свойства объектов в языках С++, Java, C#. Часть 1» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot