Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

динамические структуры и классы

49K
05 октября 2009 года
dom1nator
8 / / 05.10.2009
Помогите пожалуйста напсиать две прораммки к щавтрашнему дню
1)В составе программы описать функцию, которая заменяет в списке все вхождения элемента E1, значение которого введено с клавиатуры, на эле-мент E2, значение которого также введено с клавиатуры.
Вот мой вариант:
Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

struct list
{
    int info;
    list *next, *prev;
};

int NewEl(list* &Head, list* &Tail, int pos)
{
    int i;
    list *X, *Y;

    if (pos==1)
    {
        Y=new list;
        Y->info=random(10);
        Y->prev=NULL;
        Y->next=Head;
        Head->prev=Y;
        Head=Y;
    }
    else
    {
        X=new list;
        X=Head;
        for (i=0;i<=pos-2;i++)
        {
            if (X!=Tail)
                X=X->next;
            else
                return 1;
        }
        Y=new list;
        Y->info=random(10);
        Y->prev=X->prev;
        X->prev->next=Y;
        Y->next=X;
        X->prev=Y;
    }

    return 0;
}

void Replace(list *Head, list *Tail, int El1, int El2)
{
    list *X;
    X=new list;
    X=Head;

    while (X!=Tail)
    {
        if (X->info==El1)
            X->info=El2;
        X=X->next;
    }
    if (X->info==El1)
        X->info=El2;
}

void PrintList(list *Head, list *Tail)
{
    list *X;
    X=new list;
    X=Head;

    while (X!=Tail)
    {
        printf("%d ",X->info);
        X=X->next;
    }
    printf("%d ",X->info);
}

void main()
{
    clrscr();
    randomize();

    list *Head, *Tail;
    int el1, el2, i, n;

    Head=new list;
    Tail=new list;
    Head->info=random(10);
    Head->prev=NULL;
    Head->next=NULL;
    Tail=Head;
    printf("Enter number of elements: ");
    scanf("%d",&n);
    for (i=1;i<=n-1;i++)
        NewEl(Head,Tail,1);

    printf("Your list: ");
    PrintList(Head,Tail);
    printf("\nEnter element to replace: ");
    scanf("%d",&el1);
    printf("Enter element to replace with: ");
    scanf("%d",&el2);
    Replace(Head,Tail,el1,el2);
    printf("New list: ");
    PrintList(Head,Tail);

    delete Head;
    delete Tail;

    getch();
}

и 2)Определить класс-строку. В класс включить два конструктора: для опре-деления класса строки строкой символов и путем копирования другой строки (объекта класса строки). Предусмотреть функции сортировки слов в строке по-алфавиту и подсчёта количества слов.Не знаю как делать:confused:

[COLOR="Red"]Форматировать код по Правилам. [/COLOR]модератор.
416
06 октября 2009 года
MaitreDesir
380 / / 02.01.2008
Насчет строк смотри сюда:
http://program.rin.ru/razdel/html/194.html
29K
06 октября 2009 года
Ander Skirnir
109 / / 08.06.2009
Насколько я понял, Вам это на C++ делать надо. Можете заюзать готовый контейнер list:

Код:
#include <iostream>
#include <list>

using namespace std;

int main ()
{
    list<int> lst;
    int n, x, i = 0;

    cout << "How much list elements do u wanna add? "; cin >> n;
    cout << "Kay, lets do it:\n";

    while (i++ < n)
    {
        cout << i << ") lst << ";
        cin >> x;
        lst.push_back(x);
    }

    cout << "\nKay, nows whattawanna change? "; cin >> n;
    cout << "By what value? "; cin >> x;

    list<int>::iterator it;

    for (it = lst.begin(); it != lst.end(); ++it)
        if (*it == n) *it = x;

    cout << "\nIts done, get ur list:\n";

    for (it = lst.begin(), i = 0; it != lst.end(); ++it, ++i)
        cout << i << ") " << *it << "\n";
}
20K
06 октября 2009 года
sem2711
124 / / 23.09.2009
Вариант для работы со строками (задача №1) :
Код:
#include <iostream>
#include <string>

int main()
{
    using namespace std;
    cout << "Enter a list:\n";
    string source;
    getline(cin, source);
    string backup = source;
    cout << "Enter element to replace: ";
    string old_elem;
    cin >> old_elem;
    cout << "Enter element to replace with: ";
    string new_elem;
    cin >> new_elem;

    string::size_type count = old_elem.size();
    string::size_type begin;

    while ((begin = source.find(old_elem)) != string::npos)
        source.replace(begin, count, new_elem);

    cout << "Here is your old list:\n" << backup << endl;
    cout << "And here is your new list:\n" << source << endl;

    return 0;
}

Список в этом случае состоит из элементов, разделенных пробелами. Конец списка - перевод строки. Заменяет как меньшие на большие, так и большие на меньшие (по размеру) элементы.
20K
06 октября 2009 года
sem2711
124 / / 23.09.2009
Задача №2 подкреплена небольшой тестовой программкой. Прошу заметить, что при сортировке заглавные буквы младше прописных.
Код:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

class String
{
public:
    String(const char * line = "")
    {
        str_size = strlen(line);
        std::string word;
        size_t counter = 0;
        for (size_t i = 0; i <= str_size; ++i)
        {
            word.push_back(line);
            if (isspace(line) || line == '\0')
            {
                string.push_back(word);
                word = "";
                ++counter;
            }
        }
    }
    String(const String & str)
    {
        str_size = str.str_size;
        string = str.string;
    }
    String(const std::vector<std::string> & vec)
    {
        str_size = 0;
        for (size_t i = 0; i < vec.size(); ++i)
        {
            str_size += vec.size();
        }
        string = vec;
    }
    ~String() {}
    friend std::ostream & operator <<(std::ostream & os, const String & str)
    {
        for (size_t i = 0; i < str.string.size(); ++i)
        {
            os << str.string << " ";
        }
        return os;
    }
    size_t words_count() const
    {
        return string.size();
    }
   
    String sort() const
    {
        std::vector<std::string> temp = string;
        std::sort(temp.begin(), temp.end());
        return String(temp);
    }

private:
    std::vector<std::string> string;
    size_t str_size;
};

int main()
{
    String str("Here comes the sun");
    String str2("Good morning!");
    String str3;
    str3 = str2;
    std::cout << str << "\n" << str3 << std::endl;
    std::cout << "String str contains " << str.words_count() << " words.\n";
    String str4 = str.sort();
    std::cout << str4 << std::endl;
    return 0;
}
12K
06 октября 2009 года
Ghox
297 / / 26.07.2009
Цитата: sem2711
Прошу заметить, что при сортировке заглавные буквы младше прописных.


Может быть, вы хотели сказать "прописные буквы младше строчных"? Заглавные и прописные буквы - это одно и то же. :)

И что значит "младше"? То, что если в строке есть прописные и строчные буквы, то, после проведения сортировки, в начале строки будут идти строчные буквы, а за ними - прописные?

И не поясните - это вызвано особенностью используемого метода std::sort? Просто я знаю методы и контейнеры STL не сказать чтобы очень уж хорошо...

20K
06 октября 2009 года
sem2711
124 / / 23.09.2009
Цитата: Ghox
Может быть, вы хотели сказать "прописные буквы младше строчных"? ...



Я имел ввиду, что большие буквы младше маленьких :)

Цитата:
И что значит "младше"? То, что если в строке есть прописные и строчные буквы, то, после проведения сортировки, в начале строки будут идти строчные буквы, а за ними - прописные?



Да, это так.

Цитата:
это вызвано особенностью используемого метода std::sort?



Функция std::sort тут не при чем. Просто сортировка производится по значениям ANSI кодов (как и в функции strcmp()), а коды строчных (больших) букв меньше кодов прописных (маленьких). Можно, конечно, привести все символы к нижнему регистру, а потом уже сортировать. Пожалуй, так будет даже правильнее.

20K
06 октября 2009 года
sem2711
124 / / 23.09.2009
Вот так будет выглядеть метод String::sort() с учетом вышесказанного:

Код:
String sort() const
    {
        std::vector<std::string> temp = string;
        std::vector<std::string>::iterator iter;
        for (iter = temp.begin(); iter != temp.end(); ++iter)
        {
            for (size_t j = 0; j < (*iter).size(); ++j)
            {
                (*iter).at(j) = tolower((*iter).at(j));
            }
        }
        std::sort(temp.begin(), temp.end());
        return String(temp);
    }
12K
07 октября 2009 года
Ghox
297 / / 26.07.2009
Цитата: sem2711
Функция std::sort тут не при чем. Просто сортировка производится по значениям ANSI кодов (как и в функции strcmp()), а коды строчных (больших) букв меньше кодов прописных (маленьких).


Примерно понял, спасибо. Хотя вы и ошибаетесь насчет наименований букв... На самом деле прописными называются большие буквы (буквы в верхнем регистре), а строчными - маленькие (буквы в нижнем регистре).

Цитата: sem2711
Можно, конечно, привести все символы к нижнему регистру, а потом уже сортировать. Пожалуй, так будет даже правильнее.


А вот интересно было бы решить задачу сортировки в такой постановке. Функция сортировки должна сортировать слова из строки так, чтобы порядок старшинства букв был такой: A < a < B < b < ... < Z < z. Т.е. чтобы порядок соответствовал порядку букв в алфавите, а большая буква шла перед маленькой. И при этом, после проведения сортировки, регистр букв в самих строках должен остаться неизменным. Т.е. никаких преобразований в самих строках не должно быть, но допустимо создание временных копий и проведение преобразований в них.

20K
11 октября 2009 года
sem2711
124 / / 23.09.2009
Задача с сортировкой, независимой от регистра, решена мной так:
Код:
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <cstring>

class String
{
public:
    explicit String(const char * line = "")
    {
        std::string word;
        str_size = strlen(line);
        size_t counter = 0;
        for (size_t i = 0; i <= str_size; ++i)
        {
            word.push_back(line);
            if (isspace(line) || line == '\0')
            {
                string.push_back(word);
                word = "";
                ++counter;
            }
        }
    }
    explicit String(const String & str)
    {
        str_size = str.str_size;
        string = str.string;
    }
    explicit String(const std::vector<std::string> & vec)
    {
        str_size = 0;
        for (size_t i = 0; i < vec.size(); ++i)
        {
            str_size += vec.size();
        }
        string = vec;
    }
    ~String() {}
    friend std::ostream & operator <<(std::ostream & os, const String & str)
    {
        for (size_t i = 0; i < str.string.size(); ++i)
        {
            os << str.string << " ";
        }
        return os;
    }
    size_t words_count() const
    {
        return string.size();
    }
   
    void sort()
    {
        std::vector<std::string>::iterator iter1;
        std::vector<std::string>::iterator iter2;
        for (iter1 = string.begin(); iter1 != string.end(); ++iter1)
        {
            for (iter2 = iter1; iter2 != string.end(); ++iter2)
            {
                if (_stricmp((*iter1).c_str(), (*iter2).c_str()) <= 0) continue;
                // use strcasecmp() instead of _strcmp() in Linux
                std::string str = *iter1;
                *iter1 = *iter2;
                *iter2 = str;
            }
        }
    }

private:
    std::vector<std::string> string;
    size_t str_size;
};
/////////////////////////////////////////////////////////////////////
//      Main
/////////////////////////////////////////////////////////////////////
int main()
{
    String str("If tHe sky faLls we sHall caTch sKylArks");
    String str2("Good morning!");
    String str3;
    str3 = str2;
    std::cout << str << "\n" << str2 << std::endl;
    std::cout << "String str contains " << str.words_count() << " words.\n";
    String str4(str);
    str4.sort();
    std::cout << str4 << std::endl;
    return 0;
}

Я применил С-функцию stricmp() (или strcasecmp() для Linux-юзеров), также переделал метод String::sort() так, что теперь он вносит изменение в первоначальную строку. Пользователь класса должен сам позаботиться о резервной копии перед сортировкой, но применение этого метода стало (на мой взгляд) более удобным.
49K
11 октября 2009 года
dom1nator
8 / / 05.10.2009
блин раод,программа написанная мной не работает(можите подсказать где тут ошибка
53K
11 октября 2009 года
sireys
5 / / 07.10.2009
проблемы небольшие с языком С++.помоги написать 2 проги...я учусь на втором курсе..помогите остатся в инсте.
1 прога!
В составе программы описать функцию, которая формирует список М1 – копию списка М и список М2, представляющий собой ”перевернутый” список М.

Кто поможет всем заранее большое спасибо..очень признателен!(P.S. мне дали на это 2 дня)

[COLOR="Red"]Читать Правила раздела Студентам.[/COLOR]
297
11 октября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: dom1nator
блин раод,программа написанная мной не работает(можите подсказать где тут ошибка


Это какая программа? Та, что в первом посте? Хм... Скопипастил, заменил random() на rand(), выкинул clrscr() и randomize(), т. к. использую VisualStudio, а не Builder, - работает.
В код не вникал (в лом), но бросилось в глаза: в функциях PrintList и Replace можно выкинуть строки

 
Код:
X=new list;


[color=gray]Решил подсказать, где тут ошибки:
1. предложения начинаются с большой буквы;
2. раод - вообще непонятно, что такое (думаю, народ);
3. обращение должно выделяться запятыми;
4. после запятых должен идти пробел;
5. причастный оборот, применённый здесь, выделяется запятыми;
6. скобки всегда идут парами (а здесь они вообще не к месту);
7. можете пишется через е;
8. в конце вопросительного предложения ставится знак вопроса, не так ли?;
9. сложные предложения тоже разделяются запятыми (там, где нужно).
Если ещё учесть экспрессию, которую, похоже. хотел передать автор, итоговый текст выглядит так:
"Блин, народ, программа, написанная мной, не работает! Можете подсказать, где тут ошибка?"[/color]
Grammar Nazi негодуэ...
53K
11 октября 2009 года
sireys
5 / / 07.10.2009
напишите пожалуста прогу на С++.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог