Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Занимательные алгоритмы

Хай, гайз! ✌

Как и обещал, делюсь с вами захватывающими задачками. С последними двумя у меня лично проблемы 😫, но ещё не вечер, как говорится. Не стесняйтесь предлагать свои идеи или находить какие-либо ошибки!

Содержание...

Начало и конец:

#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;
}

Вывод: алгоритм не работает.

Присоединяйтесь и вы к увлекательному процессу мышления! 🐱‍

admin, Удаленный пользователь и Удаленный пользователь отреагировали на эту запись.
adminУдаленный пользовательУдаленный пользователь

Фух, ушли сутки, но я всё осознал!
Вот, как правильно всё сделать. Лучше всего скачать исходный файл и ознакомиться самостоятельно: СкопированоGetting_Started.cpp ← [simple_tooltip content='']антивирусный отчёт[/simple_tooltip].
В скором времени будут ещё алгоритмы. ✍

Удаленный пользователь отреагировал на эту запись.
Удаленный пользователь

Ребятушки, я про вас не забыл! Буквально совсем скоро порадую вас файлами прямиком из университета и небольшими заданиями на функцию Скопированоfork() (только для Unix-подобных ОС).

Вторая часть, юху!

Спойлер

В файлах ниже описаны два задания. Первое довольно простое, второе посложнее. Тем не менее стоит решить все.
Писать отчёт или нет — дело ваше. Ответы будут предоставлены чуть позже.

Файлы: СкопированоЗадание 1.pdf, СкопированоЗадание 2.pdf.

Доп. задание на метод Скопированоfork():

  1. Реализовать Скопированоn-паралелльных потоков с помощью цикла Скопированоfor;
  2. Вывести их СкопированоProcess ID (Скопированоgetpid()), — он должен быть разным, — и СкопированоParent Process ID (Скопированоgetppid()), — он должен быть одинаковым, — для всех дочерних процессов;
  3. (Доп.-Доп.) Разобрать смысл методов Скопированоwait() и Скопированоwaitpid().

Воспользуйтесь онлайн-справкой для доп. информации (это тоже часть задания).

Спасибо за проявленный интерес. Будут вопросы — пишите!

@Вячеслав по поводу первой части,
Все-таки уклон ответов на Си, а не C++.
Строки в C++ это минимум класс std::string.
Работать с char * для поиска слов - слишком низкоуровнево.

И вам здравствуйте, Михаил.

Мои алгоритмы и задачи идут по нарастающей. Причина тому — постепенное изучение C++, словно бы вас обучали в университете. По сути эта тема — Скопировано«Занимательные алгоритмы» — нужна тем, кто только начинает учиться или просто желает посоревноваться в качественном решении. При этом можно использовать любое решение, главное — своё, а затем сравнить его с проверенным и сделать выводы.

С часу на час, как по плану, будут новые задания и высокий уровень. Успехов.

Ответ на Скопировано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.