![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
InFuz |
![]()
Сообщение
#1
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
В общем закончили 1 семестр и во втором начался C++ (был и остался Pascal)
Посоветуйте какую нибудь книжку или самоучитель по C++. Пока читаю Г. Шилд "Самоучитель С++" И помогите разобраться с 1 лабой. Мало того, что в С++ пока не рублю так еще и задача... я ее даже на листке не решу не то что уж прогу по ней писать. Известны координаты вершин треугольника ABC: A(x1,y1), B(x2,y2) и C(x3,y3). Найти его площадь и периметр. Нашел в инете пару формул, хотя точно не уверен что те. Вот, что пока смог накорябать. # include <iostream.h> # include <stdio.h> # include <math.h> int main() { int x1,x2,x3,y1,y2,y3; double s,p,a,b,c; cout<<"\n Лабораторная работа №1"; cout<<"\n x1="; cin>>x1; cout<<"\n x2="; cin>>x2; cout<<"\n x3="; cin>>x3; cout<<"\n y1="; cin>>y1; cout<<"\n y2="; cin>>y2; cout<<"\n y3="; cin>>y3; a = sqrt((x1-x2)^2+(y1-y2)^2); b = sqrt((x1-x3)^2+(y1-y3)^2); c = sqrt((x2-x3)^2+(y2-y3)^2); p = a+b+c; cout<<"\n p=" <<p; /* cout<<"p="<<p; s=(x1-x3)*(y2-y3)*(x2-x3)*(y1-y3)/2; cout<<"s="<<s; */ } |
![]() ![]() |
Vahappaday |
![]()
Сообщение
#21
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
|
InFuz |
![]()
Сообщение
#22
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Лаба №4
Дан массив целых простых чисел. Переписать все простые числа из заданного массива в другой массив. Первый массив упорядочить по возрастанию, второй по убыванию. Создать функции для для определения простого числа и для сортировки элементов массива. P.S. "обязательное применение динамических массивов" Начал по лекциям разбираться с динамическим массивом, пытался отладить пример который нам давали но он выдает ошибку, не смог понять че ему надо # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> int main() { clrscr(); int i,n; float * a; float s; cout<<"n="; cin>>n; a=(float *) malloe (n * sizeof(float)); //<==тута "function 'malloe' should have a prototype" a=new float[n]; cout<<"El-ma \n"; for (i=0; i<n; i++) cin>>* (a+i); s+=*(a+i); cout<<"s=" <<s<<"\n"; return 0; getch(); } написал еще на pascale пока функцию для определения простое число или нет Writeln('Vvedite 4islo'); Readln( R ); if (R = 1) or (R = 2) then Writeln('Prostoe 4islo') else if (R mod 2 = 0) then Writeln('Sostavnoe 4islo') else begin I := 3; while R mod I <> 0 do I:= I + 2; if R <= I then Write('Prostoe 4islo') else Write('Sostavnoe 4islo'); end; Vahappaday надеюсь на ваши подсказки )) |
граф Монте-Кристо |
![]()
Сообщение
#23
|
Доцент ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 3 840 Регистрация: 27.9.2007 Из: Старый Оскол Город: Москва Учебное заведение: МФТИ/МАИ Вы: другое ![]() |
|
InFuz |
![]()
Сообщение
#24
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
|
Vahappaday |
![]()
Сообщение
#25
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
ой... а зачем и new и malloc? и ни разу не освобождена память))) ай-яй-яй))
Рекомендую почитать про выделение памяти в некоторых старых версиях Builder'a. Мне один опытный человек говорил, что у Borland был косяк либо с new/delete, либо с malloc/free, скорее с первым. Хотя я могу и ошибаться. getch() после return 0; не имеет смысла. Насчёт нового массива. Есть два варианта. 1. Функция сама изнутри сначала делает проход и считает. 2. Мы должны передавать функции указатель на уже выделенную область памяти. Первый вариант.... понадёжней, что ли. Исключает ошибки при вызове. Если будете делать по второму, то я бы сделал что-то типа int CopySimples(float *src, float *dst); И если передать dst=NULL, то ничего не копировать, а просто считать и возвращать количество элементов. Затем выделять память под такое количество элементов и уже передавать нормальный указатель. Я думаю в этом случае проще реализовать 1-й вариант. Главное, не забывать освобождать память, а то привыкнете. Ну, а насчёт определения простоты, это элементарно, тем более, что вариант уже есть, хотя на мой взгляд можно попроще структурно и ещё немножко оптимизировать. Если уж совсем плохо будет, напишу, а так предлагаю потренироваться самостоятельно. Насчёт сортировки: каким методом сортировать будем? Пузырьком? Чем-то посложнее? Можно вообще воспользоваться встроенным qsort'ом Добавлено: Пришла ещё мысль сделать функцию добавления массива к числу. То есть, мы должны выделить память на 1 больше имеющегося, скопировать старый в новый, дописать новое число, освободить память из под старого, вернуть указатель на новый. Вариантов куча на самом деле)) Определяйтесь, и пробуйте писать. Где будет тяжело - подмогу. |
InFuz |
![]()
Сообщение
#26
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Пока делаю без функций т.к. с ними еще не разобрался.
Вот так пока получается, вроде переделал функцию из паскалевской без изменений, там работала, а тут чот ни фига Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> int main() {//---------------------------------------------------------------- clrscr(); int w,i,j,n,s,g; int * yk; cout<<"n="; cin>>n; yk=new int[n]; cout<<"El-ma \n"; for (i=0; i<n; i++) { cin>>* (yk); s=*(yk); cout<<"\n s="<<s; //---------------------------------------------------------------- if (s==1 || s==2) { cout<<"\n s - Prostoe 4islo"; g=*(yk); cout<<"\n g="<<g;} if (s%2==0) cout<<"\n s - Sostavnoe 4islo"; else { w=3; while (s&w!=0) { w=w+2; if (s<=w) { cout<<"\n s - Prostoe 4islo"; g=*(yk); cout<<"\n g="<<g; } else cout<<"\n s - Sostavnoe 4islo"; } } } //----------------------------------------------------------------- delete yk; getch(); } |
Vahappaday |
![]()
Сообщение
#27
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
ой... не нравится мне этот код. Опишу в таком порядке, как бросилось в глаза.
1. Для освобождения памяти из под массива использовать надо Код delete []yk; Вы же удаляете бедную память как объект. 2. Память под массив выделяете и так её и не используете. Код cin>>* (yk); - это конечно здорово, что умеете пользоваться разыменовыванием, но тут всё делается проще. Код cin >> yk[i]; Так куда проще, а главное, так правильно)) Можно, конечно, инкрементировать указатель, но так он "испортится" - не будет уже указывать на начало массива. 3. Посмотрел, как определяется простота числа. Это плохо, так никто не пишет. 4 лаба, пора бы уже разобраться с функциями. Вообще, суть функции понятен или нет? Функция обязана что-то возвращать. Пусть возвращает bool (ну, или int) - 0, если число составное, 1 - если простое. 4. Кстати о функциях: int main ничего не возвращает, это ошибка синтаксическая. Это всё "стопроцентные" ошибки, я уже молчу про то, что код трудночитаем, плохо структурирован. К хорошему стилю лучше привыкать сразу. Советую написать-таки функцию типа bool, ну или в вашем случае int... int IsSimple(int x), которая отвечала бы за определение простоты числа. Сложное - возвращаем 0. Дошла до конца проверки - значит, число простое, возвращаем 1. Это обязательно хотя бы потому, что определение простоты здесь не самоцель а лишь служебная функция, которая используется как один из кусочков выполнения итоговой задачи. Когда напишете, будем разбираться с сортировкой и копированием. Массив нужно не просто завести, но и скопировать в него все входные числа. Как это сделать, я описал чуть выше. |
InFuz |
![]()
Сообщение
#28
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Гляньте функцию, еще хотел спросить как х присвоить yk[i]? Короче давайте еще подсказок, суть то функций понятен я имел в виду еще не совсем разобрался/"набил руку" как это все оформляется/выгядит конкретно в программе. Последовательность расположения функций в программе их взаимодействие другу с другом. От паскаля еще отвыкнуть не могу ))
Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> int main() { clrscr(); //---------------------------------------------------------------- int Chislo(int x); int i,n,j; { Chislo=0; for (i=0; i<n; i++) { if (x[i]%2==0) Chislo=0; else for (j=1; j>sqrt(x[i]); j+2) { if (x[i]%j!=0) Chislo=1; else { Chislo=0; break; } } } } //----------------------------------------------------------------- int w,i,j,n,s,g; int yk[99]; cout<<"n="; cin>>n; yk=new int[n]; cout<<"El-ma \n"; for (i=0; i<n; i++) { cin>>yk[i]; s=yk[i]; cout<<"\n s="<<s; } //----------------------------------------------------------------- delete []yk; getch(); } |
Vahappaday |
![]()
Сообщение
#29
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
На мой взгляд, вновь неверно... Теоретически функцию можно описывать внутри другой функции, но я не видел, чтоб к этому прибегали.
У Вас же Chislo описана внутри main. Также советую разобраться в синтаксисе определения функции. Код [тип возвращаемого значения] [имя функции]([список параметров]) { [код] } Никакой переменной с именем функции по умолчанию не создаётся. Все возвраты осуществляются оператором return. Захотели вернуть 0, пишем return 0; Захотели вернуть 1, пишем return 1; Захотели вернуть x, пишем return x; После выполнения оператора return выполнение функции прекращается и управление передаётся вызывающей функции. Объявлять все локальные переменные нужно уже в теле функции, там, где у меня написано [код]. То есть, если вы всё вот этот осознаете, то поймёте, что функция описана неверно. Остальные комментарии: 1. опять main ничего не возвращает - чего вы её так обижаете, такая же функция) Обещает отдавать int, значит, должна отдавать int)) 2. Зачем int yk[99]? Зачем Вы выделили память в стеке? Вы же её не используете... 3. Цитата как х присвоить yk[i]? А никак) Просто пишете Код Chislo(yk[i]); и всёВот небольшой примерчик с оформлением функций. У меня массив статический, но Вам так нельзя, не подходит по условию статический. Код int IsSimple(int x) { int i; if (x<2) return 0; //если меньше двух, дальше функция не будет выполняться for(i=2;i<x;i++) { if(!(x%i)) { return 0; //есть делитель больший или равный двойке, но меньше числа, опять же прекращаем } } return 1; //делителей не нашлось, число простое } int main() { int i; int x[50]; for(i=0;i<50;i++) { cin >> x[i]; if(IsSimple(x[i])) cout << "Prostoe\n"; else cout << "Sostavnoe\n"; } return 0; //заметьте, обещал вернуть int и вернул int } |
InFuz |
![]()
Сообщение
#30
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
(i=2;i<x;i++)?
Разве может быть делителем x число которое >1/2x (например числа >5 не могут быть делителями 10) можно сократитть количество проверок в цикле почти в 2 раза. С функциями вроде разобрались, терь надо с дин. массивом разобраться. yk[99] - получается статический *(yk) - тоже не верно а как тогда? Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> //---------------------------------------------------------------- int Chislo(int x) { int j; if (x<4) return 1; else { for (j=2; j<floor(x/2)+1; j++) if (x%j==0) return 0; } return 1; } //----------------------------------------------------------------- int mani() { clrscr(); int w,i,j,n,s,g,yk; cout<<"n="; cin>>n; yk=new int[n]; cout<<"El-ma \n"; for (i=0; i<n; i++) { cin>>yk[i]; s=yk[i]; cout<<"\n s="<<s; if (Chislo(yk[i])) cout<<"Prostoe\n"; else cout<<"Sostavnoe\n"; } delete []yk; getch(); return 0; } |
Vahappaday |
![]()
Сообщение
#31
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
(i=2;i<x;i++)? Разве может быть делителем x число которое >1/2x (например числа >5 не могут быть делителями 10) можно сократитть количество проверок в цикле почти в 2 раза. Тогда уж не до x/2 а до sqrt(x), обычно делается так, не стал писать, чтоб не усложнять. yk[99] - получается статический *(yk) - тоже не верно а как тогда? Объявлять и выделять память так: Код int* yk = new int[n] Обращаться же по индексу Код cin>>yk[i]; s=yk[i]; Пробуйте сортировать. Для сортировки сделайте функцию, которая в качестве параметра принимает указатель на начало массива. Можно конечно qsort, но так неинтересно. |
InFuz |
![]()
Сообщение
#32
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Вот отлаженный вариант
Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> //---------------------------------------------------------------- int Chislo(int x) { int j; if (x<4) return 1; else { for (j=2; j<ceil(sqrt(x))+1; j++) if (x%j==0) return 0; } return 1; } //----------------------------------------------------------------- int main() { clrscr(); int w,i,j,n,s,g; cout<<"n="; cin>>n; int* yk = new int[n]; cout<<"El-ma \n"<<"\n"; for (i=0; i<n; i++) { cin>>yk[i]; s=yk[i]; cout<<"s["<<i<<"]="<<s; if (Chislo(yk[i])) cout<<" - Prostoe\n"<<"\n"; else cout<<" - Sostavnoe\n"<<"\n"; } delete []yk; getch(); return 0; } прежде чем сорировать надо еще переписать в другой массив, а qsort что конкретно делает? надо сегодня доделать, а то завтро уже здавать. |
InFuz |
![]()
Сообщение
#33
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> //---------------------------------------------------------------- int Chislo(int x) { int j; if (x<4) return 1; else { for (j=2; j<ceil(sqrt(x))+1; j++) if (x%j==0) return 0; } return 1; } //----------------------------------------------------------------- int main() { clrscr(); int k,j,i,n; j=0; k=0; cout<<"n="; cin>>n; int* mas1 = new int[n]; int* mas2 = new int[n]; cout<<"El-ma \n"<<"\n"; for (i=0; i<n; i++) { cin>>mas1[i]; if (Chislo(mas1[i])) {mas2[j]=mas1[i]; j=j+1; k=k+1;} } for (i=0; i<n; i++) { cout<<"\nmas1["<<i<<"]="<<mas1[i]; } cout<<"\n"; for (j=0; j<k; j++) { cout<<"\nmas2["<<j<<"]="<<mas2[j]; } delete []mas1; delete []mas2; getch(); return 0; } вся щас буду сортировку пробовать делать. сортироваку тоже надо в виде функции делать. P.S. тут вопрос один. я под 2 массив виделяю памяти тоже n хотя там может столько и не потребоваться, как заранее просчитать сколько под него памяти веделять? или это не принципиально? |
Vahappaday |
![]()
Сообщение
#34
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
qsort - быстрая сортировка, хороший алгоритм, вопрос, зачтут ли его Вам.
Что делает? Сортирует массив. Требует указатель на массив, количество элементов, размер одного элемента и функцию сравнения. Вот тут хорошо описано, как раз для Вашего случая простых чисел. http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/ Под второй массив можно выделять и меньше. Для этого достаточно посчитать, сколько простых чисел, а потом ещё раз прогнать и скопировать. А можно выделить и столько же... Смотреть надо на объёмы данных и учитывать, что важнее - скорость обработки или экономичность по памяти. Сортировку, наверное, лучше написать свою. Пусть медленную, хоть пузырьком, но свою. Полезно)) |
InFuz |
![]()
Сообщение
#35
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Чот не знаю как пузырек оформить в виде функции, если просто в main дописать понятно, а как в функцию сортировки передать все значения что бы он с ними работала?
Хочу в функции сортировки сделать копию массива с которым надо рабоать, потом там его отсортировать и печатать то что получилось. |
Vahappaday |
![]()
Сообщение
#36
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Хочу в функции сортировки сделать копию массива с которым надо рабоать, потом там его отсортировать и печатать то что получилось. Плохое решение. Если Вы передаёте указатель на начало массива и количество элементов в нём, то изменяя элементы массива по указателю, Вы изменяете исходный массив. То есть, изменения будут "видны" и в вызывающей функции. Вы понимаете, чем отличаются локальные данные и глобальные, данные кучи и данные стека? Это то, с чего нам начали объяснять С на 1 курсе. И это правильно! Это надо понимать. В С/С++ надо уметь работать с указателями, вот мне и интересно, у Вас с этим всё ок? Поскольку сдавать завтра, скажу так: достаточно отсортировать массив по указателю, никуда его не копируя. А уже в main выводить его и всё прочее. Но вообще рекомендую с указателями разобраться. В качестве упражнения: выделите корректно память под трёхмерный массив, передайте его в функцию, отсортируйте как-нибудь, например, сначала по x, потом по y, потом по z (порядок сортировки сами выберите). А потом напечатайте и освободите корректно память - крайне полезное упражнения для начала. PS. Если такие уж сильные проблемы с сортировкой, пузырёк могу по-быстрому написать)) |
InFuz |
![]()
Сообщение
#37
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Вот пузырек реалезованый не как функция.
Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> //----------------------------------------------------------------- int Chislo(int x) { int j; if (x<4) return 1; else { for (j=2; j<ceil(sqrt(x))+1; j++) if (x%j==0) return 0; } return 1; } //----------------------------------------------------------------- /* int Sort() { return 0; } */ //----------------------------------------------------------------- int main() { clrscr(); int t,k,i2,j,j2,i,n; j=0; k=0; cout<<"n="; cin>>n; int* mas1 = new int[n]; int* mas2 = new int[n]; cout<<"El-ma \n"<<"\n"; for (i=0; i<n; i++) { cin>>mas1[i]; } for (i=0; i<n; i++) { cout<<"\nmas1["<<i<<"]="<<mas1[i]; } cout<<"\n"; //----------------------------------------------------------------- for (i2=1; i2<n; i2++) { for (i=0; i<n-1; i++) { if (mas1[i]>mas1[i+1]) { t=mas1[i]; mas1[i]=mas1[i+1]; mas1[i+1]=t; } } } //----------------------------------------------------------------- for (i=0; i<n; i++) { cout<<"\nmas1["<<i<<"]="<<mas1[i]; } cout<<"\n"; for (i=0; i<n; i++) { if (Chislo(mas1[i])==1) {mas2[j]=mas1[i]; j=j+1; k=k+1;} } for (j=0; j<k; j++) { cout<<"\nmas2["<<j<<"]="<<mas2[j]; } cout<<"\n"; //----------------------------------------------------------------- for (j2=1; j2<k; j2++) { for (j=0; j<k-1; j++) { if (mas2[j]<mas2[j+1]) { t=mas2[j]; mas2[j]=mas2[j+1]; mas2[j+1]=t; } } } //----------------------------------------------------------------- for (j=0; j<k; j++) { cout<<"\nmas2["<<j<<"]="<<mas2[j]; } delete []mas1; delete []mas2; getch(); return 0; } |
Vahappaday |
![]()
Сообщение
#38
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
а в чём проблема реализации как функции? Ведь то же самое!
Кстати, это нельзя считать ошибкой, но зачем Вы пишете, скажем, j=j+1; Ведь есть такой классный оператор инкремента) j++; Наверное, он даже где-то чуть-чуть оптимальнее. Рекомендую)) |
InFuz |
![]()
Сообщение
#39
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
j=j+1;
не знаю наверно привычка с паскаля еще так нагляднее, в паскалее вообщето то же есть альтернатива j:=j+1 или inc(j) )) а че тоже самое то? )) функция она,... допустим считывает 1 элемент но там нельзя в самой функции написать mas1[i+1] т.к. у нее нет самоого массива и несчем сравнить, а на следующей итерации уже нет предыдущего [i-1]. P.S. приняли в таком виде, там было не принцепиально, главное чтобы функции вообще были ну у меня и была одна Chislo. |
Vahappaday |
![]()
Сообщение
#40
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
В функцию нужно передавать весь массив, а не один элемент. Тогда после возврата из функции у вас на месте старого будет отсортированный массив.
например так Код void swap(int *p) { int t=p[0]; p[0]=p[1]; p[1]=t; } void sort(int *arr, int n) { int once_again, i; do { once_again=0; for(i=0;i<n-1;i++) { if(arr[i]<arr[i+1]) { swap(arr+i); once_again=1; } } }while(once_again); } Это простейший пузырёк, реализованный в виде функции. Сортирует по возрастанию. Принимает указатель на начало и количество элементов. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 23:00 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru