У меня в программке ошибка спотыкаюсь на mas[j-1]="privet"; Надо написать программку чтобы динамическая массив постоянно увеличивался на 1 и записывался в ячейку сразу данные а у меня чего то не выходит наверное неправильно рассчитал
вот сама программка
#include <stdafx.h> #include <string> #include <iostream> using namespace std; int main() { cout<<"test"<<endl; int i,j; j=0; string *mas,*ms; for(i=0; i<50;i++) { j++; if (j ==1) { mas =new string [j]; mas[j-1]="0"; } cout<<"j = "<<j<<endl; if (j>1) { ms = new string [j-1]; ms=mas; mas =new string [j]; mas=ms; cout<<"mas ["<<j-2<<"] = "<<mas[j-2]<<endl; mas[j-1]="privet"; //cout<<mas[j-1]<<endl; } } cout<<"ppppppppppppp"<<endl; //for (i=0; i<=j; i++) cout<<"mas = "<<mas<<" i = "<<i<<" j = "<<j<<endl; cout<<"end"<<endl; return 0; }
volvo
11.11.2010 18:14
Вообще-то для того, что ты написал, предназначен std::vector:
vector<string> mas; for(i = 0; i < 10; i++) { string s = "privet"; mas.push_back(s); }
, и не надо ничего никуда копировать.
maksimla
11.11.2010 18:16
Я знаю что вектор предназначен для этого но сказали сделать без вектора чтобы меньше ресурсов кушала
volvo
11.11.2010 18:28
Ну, тогда все понятно...
Кто тебе сказал, что вектор - это много ресурсов? Вообще-то это все очень хорошо оптимизировано, и превзойти стандартные алгоритмы/структуры тебе вряд-ли удастся. И по скорости и по ресурсам. Тем более, когда ты работаешь с классом std::string - лучше предоставить это вектору, чем химичить что-либо самому. Но дело твое: хочешь велосипед - делай...
maksimla
11.11.2010 18:40
Мне задали сделать программку чтобы с файла брала только слова и считала сколько каких слов повторяется сделал с вектором
#include <iostream> #include <fstream> #include <vector> #include <string> #include <cmath> using namespace std; #define max 10000
string mas[max],mas1[max]; int i,a,j,s,su,x,y,mas2[max];
ifstream fin2("mano.txt", ios::in);//citaem po odnomu simbolu i delaem slovo vikidivaem vse lisnee while(fin2.good())//zapisivaem v vektor { cRai = fin2.get(); if(fin2.good())
{ for ( i=0; i<=26; i++) { if (cRai == simb[i]) a++; } if (a == 0) if (cRai !=t) if (cRai != '"') if (cRai !=' ') { word+=cRai; } if (cRai == st) { iV.push_back(word); word = ""; } if (cRai ==t) { iV.push_back(word); word = ""; } a=0; } }
// cout<<"+++++++++++++masive++++++++++++"<<endl; //cout<<i<<endl; // sortiruem slova for ( j = 1; j<=i; j++) for (a = j+1; a<=i; a++) if (mas[j]>mas[a]) { word = mas[j]; mas[j]=mas[a]; mas[a]=word; }
ofstream fin1("rez.txt", ios::out); fin1<<"Slova povtorialis"; fin1<<endl; //smotrim skolko slov napisano gde i vivodim daze esli slovo tolko v odnom meste s=1; for ( j = 1; j<=i-1; j++) { for (a = j+1; a<=i; a++) { if (mas[j] == mas[a]) su++; }
fin1<<" slovo "<<mas[j]<<" naxoditsia v "<<su+1<<" mestax"; fin1<<endl; j=j+su; su=0; } fin1.close(); fin2.close(); return 0; }
Одна ошибка там пустое место записывает Сказали переделать вместо вектора сделать динамический массив чтобы меньше памяти использовала исправить ошибку и оптимизировать программу ну я сделал вот так
{ for ( i=0; i<=26; i++) { if (cRai == simb[i]) a++; } if (a == 0) if (cRai !=t) if (cRai != '"') if (cRai !=' ') { s++; word+=cRai; } if (cRai == st) { j++; s++; ms=ms+word+" "; word = ""; } if (cRai ==t) { j++; s++; ms=ms+word+" "; word = ""; } a=0; } } j++; s++; ms=ms+word+" "; word=""; //cout<<ms<<" j ="<<j<<endl;
mas = new string [j];
//cout<<s<<endl; x=0; for (i=0;i<s;i++) { if (ms[i] != st) word=word+ms[i]; if (ms[i] == st) { mas[x]=word; x++; word=""; } }
// cout<<"+++++++++++++masive++++++++++++"<<endl; //cout<<i<<endl; // sortiruem slova for ( j = 1; j<x; j++) for (a = j+1; a<x; a++) if (mas[j]>mas[a]) { word = mas[j]; mas[j]=mas[a]; mas[a]=word; }
////smotrim skolko slov napisano gde i vivodim daze esli slovo tolko v odnom meste //s=1; su=1; for ( j = 1; j<x-1; j++) { for (a = j+1; a<x; a++) { //cout<<mas[j]<<" "<<mas[a]<<" j = "<<j<<" a = "<<a<<endl; if (mas[j] == mas[a]) su++; else a=x; }
fin1<<" slovo "<<mas[j]<<" naxoditsia v "<<su<<" mestax"; fin1<<endl; j=j+su; su=1; } if (mas[x-2] != mas[x-1]) fin1<<" slovo "<<mas[x-1]<<" naxoditsia v "<<su<<" mestax"; fin1<<endl; fin1.close(); fin2.close(); return 0; }
и теперь хотел избавится от одного цикла
for (i=0;i<s;i++) { if (ms[i] != st) word=word+ms[i]; if (ms[i] == st) { mas[x]=word; x++; word=""; } }
volvo
11.11.2010 19:09
Цитата
Сказали переделать вместо вектора сделать динамический массив чтобы меньше памяти использовала
Чтоб программа использовала меньше памяти - надо не описывать массивы так:
#define max 10000 string mas[max],mas1[max];
, а использовать для хранения строк те же векторы, или еще лучше - map какой-нибудь. Не надо делать смесь чистого С и С++, ни к чему хорошему это не приводит. Если уж пишешь программу на С++ - так используй его библиотеки.
maksimla
11.11.2010 19:43
Ого а я думал что С не знаю так как его не проходил а о map я первый раз слышу
Добавлено через 7 мин. А ведь в паскале можно увеличивать динамический масив
volvo
11.11.2010 22:29
Если интересно - вот решение задачи (если я правильно понял, тебе надо разбить текст файла на слова, удаляя все "ненужные" символы, и посчитать, сколько раз каждое слово встречалось?)
struct is_sym: public std::unary_function<char, bool> { public: // Это работает только с латинскими символами, но переделать // на любые другие - не проблема, добавится еще пара строк... bool operator ()(char ch) const { return !isalpha(ch); } };
А ведь в паскале можно увеличивать динамический масив
Некоторые компиляторы Паскаля вообще ничего про динамические массивы не знают.
TarasBer
12.11.2010 10:40
Не понял, зачем вручную копировать старый массив на новый, есть же оператор realloc (если так не хочется стандартные алгоритмы брать).
volvo
12.11.2010 10:56
realloc - это С-стиль. При работе с POD-типами все ясно и понятно. Но при работе с классами (а у автора здесь именно классы используются, std::string например) можно такого наворотить, что не разгребешь потом.
Получается, надо писать обертку над realloc-ом, которая будет работать с классами корректно. И придумывать свой std::vector. Оно надо?
TarasBer
12.11.2010 11:05
Ну дык не надо использовать классы, если руками с памятью работаешь. Если сказали руками - значит руками, никаких std::string, только char*.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.