Loading...
BalioFVFX avatar BalioFVFX 40 Точки

Задача 8 от лекция 2

Здравейте, тотално забих на задача 8, може ли някакви насоки към решението на задачата? 

 

Засега имам функция която уж проверява string-а за числа.. 

 

int parseNumbers(string& str, int& resultLength)
{
	int number = 0;
	for (int i = 0; i < str.length(); i++)
	{
		if (str[i] == ' ') //If theres space
		{
			str[i + 1] = number += std::stoi(str);
		}
}
	
	return number;
}

Това което се опитвам да направя е да записвам number в масив, на прав път ли съм? 

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

Погледни този отговор: https://softuni.bg/forum/14876/homework-finds-the-longest-integer-cplusplus-memory-management#answer-38412 - там съм описал няколко варианта за четене на ред от конзолата и преобръщането му в масив от числа. Можеш да адаптираш някой от тях за твоите цели :)

Поздрави,

Жоро

1
BalioFVFX avatar BalioFVFX 40 Точки

Здравей, благодаря за бързия отговор!

То какви начини имало, а аз в какви филми се вкарвам! :D

А ето, че се вкарах в още един:
 

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int theArray[];

int parseNumbers(string& str, int& resultLength)
{
	stringstream inputStream(str);
	int arraysize = 0;
	int sumOfArray = 0;
	int myArray[10];

	//String to array
	while (inputStream >> myArray[arraysize])
	{
		arraysize++; //Elements of the array
	}

	for (int j = 0; j < arraysize; j++)
	{
		sumOfArray += theArray[j];
	}

	return true;
}
	

int main()
{
	
	string str;
	int resultLength;

	getline(cin, str);
	parseNumbers(str, resultLength);

	system("pause");
	return 0;
}

Получавам compile error: Error    LNK2001    unresolved external symbol "int * theArray" (?theArray@@3PAHA)

Тя се предизвиква от " sumOfArray += theArray[j]; " 

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Няколко неща ти пречат тук:

1) въвеждаш в myArray, пък се опитваш да събираш елементите на theArray (btw това не са много добри имена - my и the са ти ненужни, защото всички arrays в твоята програма са "my" по принцип :D и това най-вероятно те е объркало, ако ги беше кръстил примерно localArray и globalArray веднага щеше да забележиш, че записваш в едното пък сумираш другото Edit: localArray и globalArray също не са прекрасни имена, ама са по-добри от my и the)

2) Какво става, ако броят елементи е по-голям от 10? myArray е само 10 елемента. Това с arraysize трябва да го направиш първо, само че не въвеждай в масив а просто в някаква dummy променлива, колкото да преброиш елементите. След това направи myArray[arraySize] и направи нов stringstream по str и чак тогава въведи елементите, както ти ги въвеждаш (така вече знаеш, че myArray ще е достатъчно голям)

3) Това, което ти дава грешка, е че си декларирал глобален масив, без да му кажеш размер и без да му дадеш инициализация - int theArray[]; За C++ това означава "тук има ще един масив от int, на който по-късно ще му дам размер или ще го инициализирам, засега само казвам, че ще го има някъде из кода" (може да погледнеш в лекцията за функции - правихме нещо подобно с разделянето на декларация и дефиниция на функция) - но ти никога не му даваш размер и затова компилатора ти казва "абе тука ми казаха, че ще има един масив, ама го няма" (linker error). Предполагам, че си искал да напишеш int theArray[100]; примерно, което вече означава "създай един масив от 100 int елемента"

 

Поздрави,

Жоро

1
19/03/2017 17:47:36
BalioFVFX avatar BalioFVFX 40 Точки

Първо благодаря за отделеното време, че то вече стана доста занимавка с мен.

Това с грешката беше, че ползвам масив който изобщо не трябва да го има в програмата, но е останал от преди когато съм се опитвал да замажа нещата да работят :D

В момента събирам елементите по следния начин:
 

    int dummy = 0;

	
	while (inputStream >> dummy)
	{
		arraysize++;
    }

Но не намирам начин как да направя масива, ако се опитам да го направя след while цикъла по следния начин int myArray[arraysize]; , казва че arraysize трябва да е const, което не е нищо изненадващо. Ако се опитам да направя някакъв const int, който е равен на arraysize казва че отново не е const..

 

За сега това решение работи: 

#include <iostream>
#include <string>
#include <sstream>
using namespace std;



int parseNumbers(string& str, int& resultLength)
{
	stringstream inputStream(str);
	int arraysize = 0;
	int sumOfArray = 0;
	int myArray[100];
	
	//String to array
	while (inputStream >> myArray[arraysize])
	{
		arraysize++;
	}

	for (int j = 0; j < arraysize; j++)
	{
		sumOfArray += myArray[j];
	}
	
	cout << "Array elements sum is: " << sumOfArray << endl;
	
	return true;
}
	

int main()
{
	
	string str;
	int resultLength;
	getline(cin, str);
	parseNumbers(str, resultLength);

	system("pause");
	return 0;
}

Но така не се следва условието на задачата, също така resultLength не се използва..

0
19/03/2017 19:03:22
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Странно е защо не ти се компилира с не-константен размер, най-вероятно си с компилатор, който не е настроен да го разрешава. Но на теб така и така не ти трябва такъв размер - трябва ти динамично заделен масив, тоест масив заделен с new.

Тоест вместо да правиш int myArray[arraysize];, трябва да направиш int * myArray = new int[arraysize]; - това със сигурност ще работи и оттам нататък можеш да пишеш в myArray все едно си е нормален масив. Ако видиш условието на задачата, тя очаква функцията ти да върне точно такъв масив. След това в main правиш един for цикъл за всеки един ред, генерираш си масив с тази функция, смяташ му сумата (условието изисква да не смяташ сумата във функцията, а функцията ти да връща масив, който вече можеш да го обработиш както искаш от друг код) и продължаваш нататък. Не забравяй да delete[] резултата от функцията след го използваш в main.

1
BalioFVFX avatar BalioFVFX 40 Точки

За да използвам return стойноста в main трябва да нарпавя масив? Който да бъден = на фунцкията? И още един въпрос: Функцията трябва да връща return myArray; или return &myArray[];

0
19/03/2017 20:30:29
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

По-конкретно трябва да направиш pointer към масив - това връща и parse numbers

По условие: int * parseNumbers(...), значи резултатът е int *, за да го ползваш казваш int * parsed = parseNumbers(...), ползваш parsed като масив (примерно сумираш) и накрая delete[] parsed; за да освободиш паметта

0
BalioFVFX avatar BalioFVFX 40 Точки

Благодаря ти страшно много!
 

#include <iostream>
#include <string>
#include <sstream>
using namespace std;



int *parseNumbers(string& str, int& resultLength)
{
	stringstream inputStream(str);
	int arraysize = 0;
	int sumOfArray = 0;
	int * myArray = new int[arraysize];

	//String to array
	while (inputStream >> myArray[arraysize])
	{
		arraysize++;
	}

	
	
	return myArray;
}
	

int main()
{
	
	string str;
	int resultLength;
	getline(cin, str);
	int thesum = 0;
	int * parsed = parseNumbers(str, resultLength);

	for (int i = 0; i < 4; i++)
	{
		thesum += parsed[i];
	}
	
	cout << "The sum: " << thesum << endl;

	system("pause");
	return 0;
}


Ето това успях да напиша, остава resultLength, който не се използва никъде?  между другото програмата работи но ми дава exception.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.