динамические структуры и классы
1)В составе программы описать функцию, которая заменяет в списке все вхождения элемента E1, значение которого введено с клавиатуры, на эле-мент E2, значение которого также введено с клавиатуры.
Вот мой вариант:
#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]модератор.
#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";
}
#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;
}
Список в этом случае состоит из элементов, разделенных пробелами. Конец списка - перевод строки. Заменяет как меньшие на большие, так и большие на меньшие (по размеру) элементы.
#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;
}
Может быть, вы хотели сказать "прописные буквы младше строчных"? Заглавные и прописные буквы - это одно и то же. :)
И что значит "младше"? То, что если в строке есть прописные и строчные буквы, то, после проведения сортировки, в начале строки будут идти строчные буквы, а за ними - прописные?
И не поясните - это вызвано особенностью используемого метода std::sort? Просто я знаю методы и контейнеры STL не сказать чтобы очень уж хорошо...
Я имел ввиду, что большие буквы младше маленьких :)
Да, это так.
Функция std::sort тут не при чем. Просто сортировка производится по значениям ANSI кодов (как и в функции strcmp()), а коды строчных (больших) букв меньше кодов прописных (маленьких). Можно, конечно, привести все символы к нижнему регистру, а потом уже сортировать. Пожалуй, так будет даже правильнее.
{
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);
}
Примерно понял, спасибо. Хотя вы и ошибаетесь насчет наименований букв... На самом деле прописными называются большие буквы (буквы в верхнем регистре), а строчными - маленькие (буквы в нижнем регистре).
А вот интересно было бы решить задачу сортировки в такой постановке. Функция сортировки должна сортировать слова из строки так, чтобы порядок старшинства букв был такой: A < a < B < b < ... < Z < z. Т.е. чтобы порядок соответствовал порядку букв в алфавите, а большая буква шла перед маленькой. И при этом, после проведения сортировки, регистр букв в самих строках должен остаться неизменным. Т.е. никаких преобразований в самих строках не должно быть, но допустимо создание временных копий и проведение преобразований в них.
#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() так, что теперь он вносит изменение в первоначальную строку. Пользователь класса должен сам позаботиться о резервной копии перед сортировкой, но применение этого метода стало (на мой взгляд) более удобным.
1 прога!
В составе программы описать функцию, которая формирует список М1 – копию списка М и список М2, представляющий собой ”перевернутый” список М.
Кто поможет всем заранее большое спасибо..очень признателен!(P.S. мне дали на это 2 дня)
[COLOR="Red"]Читать Правила раздела Студентам.[/COLOR]
Это какая программа? Та, что в первом посте? Хм... Скопипастил, заменил random() на rand(), выкинул clrscr() и randomize(), т. к. использую VisualStudio, а не Builder, - работает.
В код не вникал (в лом), но бросилось в глаза: в функциях PrintList и Replace можно выкинуть строки
[color=gray]Решил подсказать, где тут ошибки:
1. предложения начинаются с большой буквы;
2. раод - вообще непонятно, что такое (думаю, народ);
3. обращение должно выделяться запятыми;
4. после запятых должен идти пробел;
5. причастный оборот, применённый здесь, выделяется запятыми;
6. скобки всегда идут парами (а здесь они вообще не к месту);
7. можете пишется через е;
8. в конце вопросительного предложения ставится знак вопроса, не так ли?;
9. сложные предложения тоже разделяются запятыми (там, где нужно).
Если ещё учесть экспрессию, которую, похоже. хотел передать автор, итоговый текст выглядит так:
"Блин, народ, программа, написанная мной, не работает! Можете подсказать, где тут ошибка?"[/color]
Grammar Nazi негодуэ...