Помощь - Поиск - Пользователи - Календарь
Полная версия: с++ динамического массива увеличение
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
maksimla
У меня в программке ошибка спотыкаюсь на 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
Вообще-то для того, что ты написал, предназначен std::vector:

vector<string> mas;
for(i = 0; i < 10; i++)
{
string s = "privet";
mas.push_back(s);
}

, и не надо ничего никуда копировать.
maksimla
Я знаю что вектор предназначен для этого но сказали сделать без вектора чтобы меньше ресурсов кушала
volvo
Ну, тогда все понятно...

Кто тебе сказал, что вектор - это много ресурсов? Вообще-то это все очень хорошо оптимизировано, и превзойти стандартные алгоритмы/структуры тебе вряд-ли удастся. И по скорости и по ресурсам. Тем более, когда ты работаешь с классом std::string - лучше предоставить это вектору, чем химичить что-либо самому. Но дело твое: хочешь велосипед - делай...
maksimla
Мне задали сделать программку чтобы с файла брала только слова и считала сколько каких слов повторяется сделал с вектором

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

int main()
{
char t =0X0a; //eto enter
char cRai, st =' ' ;//eto probel xote mozno bila 0X20
string simb(",.?!/\()%$#;:|©-1234567890+-"); //simboli kotorije v tekste mogut prisutstvovat kotorii nenuzni
string word;
vector <string> iV;

a=0;
word ="";

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

iV.push_back(word);

vector <string>::iterator iter;
vector <string>::iterator iter_sta;
vector <string>::iterator iter_end;


iter_sta = iV.begin();
iter_end = iV.end();

//cout <<"Zapixnul v vektor vot vektor" << endl; perepisivaem v masiv

i=0;
for (iter = iter_sta; iter < iter_end; ++iter)
{
// cout << *iter <<""<< endl;
i++;
mas[i] = *iter ;
}

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


Одна ошибка там пустое место записывает
Сказали переделать вместо вектора сделать динамический массив чтобы меньше памяти использовала исправить ошибку и оптимизировать программу
ну я сделал вот так

#include <stdafx.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int i,a,j,s,su,x,y;//,mas2[max];

int main()
{
char t =0X0a; //eto enter
char cRai, st =' ' ;//eto probel xote mozno bila 0X20
string simb (",.?!/\()%$#;:|©-1234567890+-"); //simboli kotorije v tekste mogut prisutstvovat kotorii nenuzni
string word;
string *mas,ms;
a=0;
word ="";
j=0;
s=0;

ifstream fin2("mano.txt", ios::in);
while(fin2.good())
{
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 !=' ')
{
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;
}

//for (i=0; i<x;i++)
// cout<<mas[i]<<endl;

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;
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
Цитата
Сказали переделать вместо вектора сделать динамический массив чтобы меньше памяти использовала
Чтоб программа использовала меньше памяти - надо не описывать массивы так:
#define   max   10000
string mas[max],mas1[max];
, а использовать для хранения строк те же векторы, или еще лучше - map какой-нибудь. Не надо делать смесь чистого С и С++, ни к чему хорошему это не приводит. Если уж пишешь программу на С++ - так используй его библиотеки.
maksimla
Ого а я думал что С не знаю так как его не проходил а о map я первый раз слышу

Добавлено через 7 мин.
А ведь в паскале можно увеличивать динамический масив
volvo
Если интересно - вот решение задачи (если я правильно понял, тебе надо разбить текст файла на слова, удаляя все "ненужные" символы, и посчитать, сколько раз каждое слово встречалось?)

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <functional>


struct is_sym: public std::unary_function<char, bool>
{
public:
// Это работает только с латинскими символами, но переделать
// на любые другие - не проблема, добавится еще пара строк...
bool operator ()(char ch) const
{
return !isalpha(ch);
}
};

int main()
{
std::string s;

typedef std::map<std::string, int> map_si;
map_si my_map;

std::ifstream in_file("mano.txt", std::ios::in);
while(in_file >> s)
{
s.erase(remove_if(s.begin(), s.end(), is_sym()), s.end());
if(s != "")
{
map_si::iterator pos = my_map.find(s);
if(pos != my_map.end())
{
pos->second += 1;
}
else
{
my_map.insert(map_si::value_type(s, 1));
}
}
}
in_file.close();

map_si::iterator pos;
// Это можно выводить не в cout, а в файл-результат...
for (pos = my_map.begin(); pos != my_map.end(); ++pos)
{

std::cout << "Word " << pos->first << " : " <<
pos->second << " time(s)" << std::endl;
}
return 0;
}
Ну, и скажи мне, какой код предпочтительнее? smile.gif

Цитата
А ведь в паскале можно увеличивать динамический масив
Некоторые компиляторы Паскаля вообще ничего про динамические массивы не знают.
TarasBer
Не понял, зачем вручную копировать старый массив на новый, есть же оператор realloc (если так не хочется стандартные алгоритмы брать).
volvo
realloc - это С-стиль. При работе с POD-типами все ясно и понятно. Но при работе с классами (а у автора здесь именно классы используются, std::string например) можно такого наворотить, что не разгребешь потом.

Получается, надо писать обертку над realloc-ом, которая будет работать с классами корректно. И придумывать свой std::vector. Оно надо?
TarasBer
Ну дык не надо использовать классы, если руками с памятью работаешь.
Если сказали руками - значит руками, никаких std::string, только char*.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.