IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> с++ динамического массива увеличение
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


У меня в программке ошибка спотыкаюсь на 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;
}



--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 10)
сообщение
Сообщение #2


Гость






Вообще-то для того, что ты написал, предназначен std::vector:

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

, и не надо ничего никуда копировать.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


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


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ну, тогда все понятно...

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


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


Мне задали сделать программку чтобы с файла брала только слова и считала сколько каких слов повторяется сделал с вектором

#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=""; }
}


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


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

Добавлено через 7 мин.
А ведь в паскале можно увеличивать динамический масив


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

#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

Цитата
А ведь в паскале можно увеличивать динамический масив
Некоторые компиляторы Паскаля вообще ничего про динамические массивы не знают.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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

Получается, надо писать обертку над realloc-ом, которая будет работать с классами корректно. И придумывать свой std::vector. Оно надо?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ну дык не надо использовать классы, если руками с памятью работаешь.
Если сказали руками - значит руками, никаких std::string, только char*.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.11.2020 12:55
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name