Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Динамические структуры данных (Список)


Автор: Voovan 26.3.2010, 18:39
Вечер добрый. 
Нужна помощь. Задача такова: Написать программу, которая циклически выводит ФИО со смещением на один символ (бегущая строка):

Тоесть получается что-то вида: 
"
Иванов Иван Иванович
чИванов Иван Иванови
ичИванов Иван Иванов
........
вановичИванов Иван И
"

Необходимо все это реализовать с помощью зацикленного односвязного списка.
Заранее благодарен хоть в малейшей помощи.

Автор: world 26.3.2010, 22:41
Держи.

Код

#include <list>
#include <iostream>
#include <conio.h>
#include <cstdlib>
using namespace std;

int main(int argc, char* argv[])
{
    list<char> x;
    cout << "Vvedite text\n";
    char* a = new char[80];
    cin.getline(a, 80);
    int length = strlen(a);
    for(int i = 0; a[i] != '\0'; i++)
    {
        x.push_back(a[i]);
    }
    for(int i = 0; i < length + 1; i++)
    {
        for(list<char>::iterator j = x.begin(); j != x.end(); j++)
        {
            cout << *j;
        }
        cout << endl;
        char tmp = x.front();
        x.pop_front();
        x.push_back(tmp);
    }
    delete[] a;
    getch();
    return 0;
}

Автор: Voovan 27.3.2010, 12:01
Спасибо, но чето она у меня не копилится пишет:
error: '_TCHAR' has not been declared
error: ISO C++ forbids declaration of 'argv' with no type 

Автор: world 27.3.2010, 15:01
Забыл, что писал в MSVS с подключённым tchar.h.

Исправь 7 строчку на
Код

int main(int argc, char* argv[])


Исправил в первом посте

Автор: Voovan 27.3.2010, 15:52
Спасибо огромнейшее добряк=))) надеюсь не показаться совсем обнаглевшим, если тебя конечно же это не затруднит, не мог бы ты раскоментировать каждую строчку?)))

Автор: world 27.3.2010, 16:46
Та ладно, привык уже объяснять каждую строчку программы smile .

первые 4 строчки подключение заголовочных файлов (буду объяснять только те методы, кот. используются в программе)
1. list заголовочній файл, который содержит описание списка и методы для работы с ним
2. iostream заголовочный файл, который обеспечивает потоковый ввод-вывод(cin, cout)
3. conio.h заголовочный файл для работы с консольным вводом, нам из него понадобилась функция getch()
4. cstdlib стандартная библиотека С, нам из неё понадобилась функция strlen(char*)
5. Указываем, что будем работать в пространстве имён std
7. Объявление главной функции программы 
Подробней про 5 и 7 строчки отправлю тебя опять к моему посту в http://forum.vingrad.ru/index.php?showtopic=288999&view=findpost&p=2081939
9. Объявляем переменную x типа list<char> (список в котором каждый элемент имеет тип char)
10. Выводим строку-приглашение к работе (Vvedite text)
11. Создаём указатель на массив символов размером 80 элементов (в этот указатель мы считаем строку введённую пользователем, а 80 элементов выбрано потму, что имено столько символов может поместиться в строке стандартного консольного окна)
12. Вобщем-то считываем строку(но не более 80 символов!)
13. Создаём переменную length в которой будем хранить РЕАЛЬНОЕ количество считанных элементов (длина строки записаной по адресу указателя а)
14. Обрабатываем строку посимвольно, порка не дойдём до признака конца строки (символ '\0')
   16. Записываем очередной символ в конец списка
18. Выполняем цикл, количество элементов в строке + 1 раз(можно менять, тогда изменяется количество шагов, кот. делает бегущая строка).
   20. Создаём указатель на начало массива и перемещаемся по одному жэлементу пока, не дойдём до последнего элемента списка
      22. Выводим символ, на который указывает указатель (фактически выводим всю строку по-символьно)
   24. Совершаем переход на новую строку.
   25. Сохраняем значение первого элемента списка.
   26. Удаляем первый элемент списка.
   27. Записываем соранённое значение бывшего первого элемента списка в конец списка (да масло маслянное получилось, но по-другому объяснить не могу)
29. Освобождаем память из-под массива в котором мы хранили значение, которое считали из строки(при завершении работы функции это произойдёт автоматически, но удаление динамически созданных объектов памяти(через new) програмистом является хорошим тоном програмирования)
30. Делаем задержку консольного окна (что-бы не закрывалось сразу после завершения работы функции). Сама функция getch() принимает один символ введённый с клавиатуры.
31. Возвращаем код возврата 0, и завершаем работу.

Автор: fantazer3333 28.3.2010, 14:13
А можете написать такую же программу только на простом С?

Автор: Dov 31.3.2010, 01:49
"Бегущая строка" должна, как минимум, "бежать"...  smile 
Код
void printLine(char * buf)
{
    char * str = strdup(buf);
    int    len = strlen(str);

    puts("Press any key to quit...\n");
    while(!_kbhit())
    {
        printf("\r%s", str);
        
        char tmp = str[0];
        for(int i = 0; i < len - 1; i++)
            str[i] = str[i + 1];
        str[len - 1] = tmp;
        
        Sleep(200);
    }

    free(str);
    puts("");
}

int main()
{
    printLine("Ivanov Ivan Ivanovich ");
    _getch();

    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)