Занимательные алгоритмы
Цитата: Удаленный пользователь от 07.09.2020, 18:55Хай, гайз! ✌
Как и обещал, делюсь с вами захватывающими задачками. С последними двумя у меня лично проблемы 😫, но ещё не вечер, как говорится. Не стесняйтесь предлагать свои идеи или находить какие-либо ошибки!
Содержание...
Начало и конец:
#include <iostream> using namespace std; int main() { ... ; return 0; }Обязательное условие для всех задач: необходимо использовать указатели!
1. Базовый ввод и вывод.
Ну, здесь всё просто:cout << "Hello, World!" << endl; int a, b; cin >> a >> b;2. Ввод и вывод полноценной строки.
Выполнимо 🤟:char line[80]; cin.getline(line, sizeof(line)); cout << line << endl;3. Кол-во символов.
Решение:int numberOfCharacters(char line[]) { int count = 0; char* p = line; while (*p) { count++; p++; } return count; }4. Кол-во слов.
Решение:int numberOfWords(char line[]) { int count = 0; char* p = line; bool isSpace = true; while (*p) { if (*p != ' ' && isSpace) { count++; isSpace = false; } if (*p == ' ') isSpace = true; p++; } return count; }5. Обнаружить палиндром.
Решение:bool isPalindrome(char line[]) { char* p1 = line; char* p2 = line; int charCount = numberOfCharacters(line); p2 += charCount - 1; for (int i = 0; i < charCount / 2; i++) { if (*p1 != *p2) return false; p1++; p2--; } return true; }6. Инверсия строки.
Потенциальное решение:char* reverseLine(char line[]) { char* p1 = line; char reversed[sizeof(line)]; char* p2 = reversed; int charCount = numberOfCharacters(line); p1 += charCount - 1; while (*p1) { *p2 = *p1; p1--; p2++; } return reversed; }Ввод:
abcdefg
Вывод:gfedcbcdefg7. Инверсия строки с сохранением в массив.
Потенциальное решение:void reverseLine(char line[], char* destination) { destination = reverseLine(line); } int main() { char array[80]; reverseLine(line, array); cout << array << endl; }Вывод: алгоритм не работает.
Присоединяйтесь и вы к увлекательному процессу мышления! 🐱
Хай, гайз! ✌
Как и обещал, делюсь с вами захватывающими задачками. С последними двумя у меня лично проблемы 😫, но ещё не вечер, как говорится. Не стесняйтесь предлагать свои идеи или находить какие-либо ошибки!
Содержание...
Начало и конец:
#include <iostream>
using namespace std;
int main() { ... ; return 0; }
Обязательное условие для всех задач: необходимо использовать указатели!
1. Базовый ввод и вывод.
Ну, здесь всё просто:
cout << "Hello, World!" << endl; int a, b; cin >> a >> b;
2. Ввод и вывод полноценной строки.
Выполнимо 🤟:
char line[80]; cin.getline(line, sizeof(line)); cout << line << endl;
3. Кол-во символов.
Решение:
int numberOfCharacters(char line[])
{
int count = 0;
char* p = line;
while (*p)
{
count++;
p++;
}
return count;
}
4. Кол-во слов.
Решение:
int numberOfWords(char line[]) {
int count = 0;
char* p = line;
bool isSpace = true;
while (*p) {
if (*p != ' ' && isSpace) {
count++;
isSpace = false;
}
if (*p == ' ')
isSpace = true;
p++;
}
return count;
}
5. Обнаружить палиндром.
Решение:
bool isPalindrome(char line[]) {
char* p1 = line;
char* p2 = line;
int charCount = numberOfCharacters(line);
p2 += charCount - 1;
for (int i = 0; i < charCount / 2; i++) {
if (*p1 != *p2)
return false;
p1++;
p2--;
}
return true;
}
6. Инверсия строки.
Потенциальное решение:
char* reverseLine(char line[]) {
char* p1 = line;
char reversed[sizeof(line)];
char* p2 = reversed;
int charCount = numberOfCharacters(line);
p1 += charCount - 1;
while (*p1) {
*p2 = *p1;
p1--;
p2++;
}
return reversed;
}
Ввод: Скопированоabcdefg
Вывод: Скопированоgfedcbcdefg
7. Инверсия строки с сохранением в массив.
Потенциальное решение:
void reverseLine(char line[], char* destination) {
destination = reverseLine(line);
}
int main() {
char array[80];
reverseLine(line, array);
cout << array << endl;
}
Вывод: алгоритм не работает.
Присоединяйтесь и вы к увлекательному процессу мышления! 🐱
Цитата: Удаленный пользователь от 08.09.2020, 20:47Фух, ушли сутки, но я всё осознал!
Вот, как правильно всё сделать. Лучше всего скачать исходный файл и ознакомиться самостоятельно:Getting_Started.cpp← [simple_tooltip content='']антивирусный отчёт[/simple_tooltip].
В скором времени будут ещё алгоритмы. ✍
Фух, ушли сутки, но я всё осознал!
Вот, как правильно всё сделать. Лучше всего скачать исходный файл и ознакомиться самостоятельно: СкопированоGetting_Started.cpp ← [simple_tooltip content='
']антивирусный отчёт[/simple_tooltip].
В скором времени будут ещё алгоритмы. ✍
Цитата: Удаленный пользователь от 18.09.2020, 18:25Ребятушки, я про вас не забыл! Буквально совсем скоро порадую вас файлами прямиком из университета и небольшими заданиями на функцию
fork()(только для Unix-подобных ОС).
Ребятушки, я про вас не забыл! Буквально совсем скоро порадую вас файлами прямиком из университета и небольшими заданиями на функцию Скопированоfork() (только для Unix-подобных ОС).
Цитата: Удаленный пользователь от 18.09.2020, 20:58Вторая часть, юху!
[spoiler]
В файлах ниже описаны два задания. Первое довольно простое, второе посложнее. Тем не менее стоит решить все.
Писать отчёт или нет — дело ваше. Ответы будут предоставлены чуть позже.Файлы:
Задание 1.pdf,Задание 2.pdf.Доп. задание на метод
fork():
- Реализовать
n-паралелльных потоков с помощью циклаfor;- Вывести их
Process ID(getpid()), — он должен быть разным, — иParent Process ID(getppid()), — он должен быть одинаковым, — для всех дочерних процессов;- (Доп.-Доп.) Разобрать смысл методов
wait()иwaitpid().Воспользуйтесь онлайн-справкой для доп. информации (это тоже часть задания).
[/spoiler]Спасибо за проявленный интерес. Будут вопросы — пишите!
Вторая часть, юху!
В файлах ниже описаны два задания. Первое довольно простое, второе посложнее. Тем не менее стоит решить все.
Писать отчёт или нет — дело ваше. Ответы будут предоставлены чуть позже.
Файлы: СкопированоЗадание 1.pdf, СкопированоЗадание 2.pdf.
Доп. задание на метод Скопированоfork():
- Реализовать
Скопированоn-паралелльных потоков с помощью циклаСкопированоfor; - Вывести их
СкопированоProcess ID(Скопированоgetpid()), — он должен быть разным, — иСкопированоParent Process ID(Скопированоgetppid()), — он должен быть одинаковым, — для всех дочерних процессов; - (Доп.-Доп.) Разобрать смысл методов
Скопированоwait()иСкопированоwaitpid().
Воспользуйтесь онлайн-справкой для доп. информации (это тоже часть задания).
Спасибо за проявленный интерес. Будут вопросы — пишите!
Цитата: Удаленный пользователь от 06.10.2020, 09:28@Вячеслав по поводу первой части,
Все-таки уклон ответов на Си, а не C++.
Строки в C++ это минимум класс std::string.
Работать с char * для поиска слов - слишком низкоуровнево.
@Вячеслав по поводу первой части,
Все-таки уклон ответов на Си, а не C++.
Строки в C++ это минимум класс std::string.
Работать с char * для поиска слов - слишком низкоуровнево.
Цитата: Удаленный пользователь от 06.10.2020, 09:41И вам здравствуйте, Михаил.
Мои алгоритмы и задачи идут по нарастающей. Причина тому — постепенное изучение C++, словно бы вас обучали в университете. По сути эта тема —
«Занимательные алгоритмы»— нужна тем, кто только начинает учиться или просто желает посоревноваться в качественном решении. При этом можно использовать любое решение, главное — своё, а затем сравнить его с проверенным и сделать выводы.С часу на час, как по плану, будут новые задания и высокий уровень. Успехов.
И вам здравствуйте, Михаил.
Мои алгоритмы и задачи идут по нарастающей. Причина тому — постепенное изучение C++, словно бы вас обучали в университете. По сути эта тема — Скопировано«Занимательные алгоритмы» — нужна тем, кто только начинает учиться или просто желает посоревноваться в качественном решении. При этом можно использовать любое решение, главное — своё, а затем сравнить его с проверенным и сделать выводы.
С часу на час, как по плану, будут новые задания и высокий уровень. Успехов.
Цитата: Удаленный пользователь от 06.10.2020, 10:29Ответ на
fork():[spoiler]
pid_t pid; int status; int n = 0; cout << "Enter the amount: "; cin >> n; cout << endl; cout << "Dad! — " << getpid() << endl; for (int i = 0; i < n; i++) if (!fork()) { cout << i + 1 << ". Daughter! — " << getpid() << ". Dad! — " << getppid() << "." << endl; return 0; } for (int i = 0; i < n; i++) { pid = wait(&status); cout << "Daughter " << pid << " is dead!" << endl; }[/spoiler]
Ответ на 1-е и 2-е задание:
Task #1.zipиTask #2.zip. На всякий случай не забудьте проверить на VirusTotal. Внутри лежат только.txtфайлы.Следующие задания:
Лекция.pptx,Задание №3.pdf,Задание №4.pdf.
Ответ на Скопированоfork():
pid_t pid;
int status;
int n = 0;
cout << "Enter the amount: ";
cin >> n;
cout << endl;
cout << "Dad! — " << getpid() << endl;
for (int i = 0; i < n; i++)
if (!fork()) {
cout << i + 1 << ". Daughter! — " << getpid() << ". Dad! — " << getppid() << "." << endl;
return 0;
}
for (int i = 0; i < n; i++) {
pid = wait(&status);
cout << "Daughter " << pid << " is dead!" << endl;
}
Ответ на 1-е и 2-е задание: СкопированоTask #1.zip и СкопированоTask #2.zip. На всякий случай не забудьте проверить на VirusTotal. Внутри лежат только Скопировано.txt файлы.
Следующие задания: СкопированоЛекция.pptx, СкопированоЗадание №3.pdf, СкопированоЗадание №4.pdf.