download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Задачка на C++ [СЕСТРАТА МОЛИ ЗА ПОМОЩ]

Автор
Съобщение
anonymous
Пет, 25.05.12, 22:22
Условие: Да се състави програма, която въвежда във файл броя на елементите на един масив и самите елементи. Отваря файла за четене и намира средноаритметичното на елементите на масива.

Компилатор: Code::Blocks - последна версия
#include <iostream>
#include <fstream.h>
using namespace std;
int main()
{int n,i,a[i],r=0;
cin>>n;
for (i=0;i<n;i++)
cin>>a[i];
fstream  f;
f.open("Masiv.txt",ios::out);
{f<<n;
for (i=0;i<n;i++)
f<<a[i];
};
f.close ();
f.open ("Masiv.txt",ios::in);
for (i=0;i<n;i++)
{f<<a[i];
r=r+a[i];}
f.close ();
cout<<r/n<<endl;
return 0;
}

При опит за пускане изкарва грешка 0xc00000fd

Process returned -1073741571 (0xC00000FD) execution time : 3.500 s
Press any key to continue.

kookki
Пет, 25.05.12, 22:58
Така и не продължих да уча този език, защото интересите ми се промениха.
Кода няма да ти работи, защото е тотално объркан. Сестра ти не знае елементарни неща. По-добре да се върне в основите и да започне със синтаксиса на езика. Да види какво е блок от данни, (в кода има странни импровизации), как се декларира и използва променлива, какво е видимост и област на действие на променлива и т.н.
Сори че не помагам с решение, но не ми се разправя със С-то.
anonymous
Пет, 25.05.12, 22:59
Че не знае, не знае... И тя го знае т'ва . Ама така са я научили и така го прави.
pdtomov
Съб, 26.05.12, 07:34
 
#include <iostream>
//#include <fstream.h> стара библиотека - не се поддържа от новите компилатори!
#include <fstream> // ново
using namespace std;
int main()
//{int n,i,a[i],r=0; не може да се декларира масив(a[i]) с неопределен размер!
{int n,i,r=0;
cin>>n;
int *a = new int[n]; //ново - динамично заделя памет за масив a[n]
for (i=0;i<n;i++)
cin>>a[i];
fstream  f;
f.open("Masiv.txt",ios::out);
{f<<n;
for (i=0;i<n;i++)
f<<a[i];
};
f.close ();
f.open ("Masiv.txt",ios::in);
for (i=0;i<n;i++)
{f<<a[i];
r=r+a[i];}
f.close ();
cout<<r/n<<endl;
return 0;
}

Бих препоръчал да използва Visual C++ 2008 или Visual C++ 2010 на Microsoft.

anonymous
Съб, 26.05.12, 16:30
Извинявам се за спама в темата, но Томов, на мене едно рамо можеш ли да удариш да дебъгнем един код на C++?
редактиран от anonymous на 26.05.12 17:10
редактиран от anonymous на 26.05.12 17:10
редактиран от anonymous на 26.05.12 17:10
anonymous
Съб, 26.05.12, 16:46
pdtomov, благодарим за помощта!
pdtomov
Съб, 26.05.12, 19:53
” Извинявам се за спама в темата, но Томов, на мене едно рамо можеш ли да удариш да дебъгнем един код на C++? „
Колкото и парадоксално да е, но дебъгера не съм го използвал никога. Старая се да пиша без грешки, а когато ги правя, си ги откривам без него. Сигурно това не е добра практика, но за сега е така.
Но ако кода не е голям, пусни го в нова тема, може да опитам (с него или без него), а може и някой друг да помогне!
phrozencrew
Съб, 26.05.12, 22:37
Хай! Искаше ми се да се включа в тая задачка по-рано, но съм затрупан от работа. Изненадаха кодовете, които сте пуснали, не разбирам защо C++ приема един цикъл, който се появява от нищото. Ако може някой да ми го обясни:
f.open("Masiv.txt",ios::out);
----> {f<<n;

Моя интерпретация на задачката, като не чете от файла, а само пише в него. Използвам динамичен масив, който не се интересува колко са елементите, а зависи от натискане на ЕНТЕР два пъти:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
int main () {
	vector<string> myvector; // динамичен масив
	string a;
	int sum=0;
 
	while(1){
		getline(cin, a);
		if (a.empty())
			break;
		myvector.push_back (a); // добавяне на ел. в динамичния масив
		sum = sum+atoi(a.c_str());
	}
 
	ofstream myfile ("example.txt");
	myfile << myvector.size() << endl;
	
	for(int i = 0; i < myvector.size(); i++ ){
		myfile << myvector[i] << endl;
	}
 
	cout<<1.0f*sum/myvector.size()<<endl;
}

Кодовете по-горе няма как да изкарат средно аритметична стойност, защото се използва целочислена аритметика. За да се избегне тази неточност има една хитрост, първия елемент в дясно на уравнението да е float (1.0f).

pdtomov
Нед, 27.05.12, 11:21

RE: Задачка на C++ [СЕСТРАТА МОЛИ ЗА ПОМОЩ]

” ......... не разбирам защо C++ приема един цикъл, който се появява от нищото. Ако може някой да ми го обясни:
f.open("Masiv.txt",ios::out);
----> {f<<n;

f.open("Masiv.txt",ios::out);  
{f<<n;
for (i=0;i<n;i++)
f<<a[i];
};

Този цикъл записва масива във файла, както се изисква от условието. Сега забелязах, че фигурните скоби и ";" в горния код са излишни, но това не пречи на изпълнението на програмата.
За прецизност, наистина средно аритметичното число може да се представи с плаваща запетая, като предпоследния ред стане така:
cout<<(float)r/n<<endl;

Кода го пипнах минимална, за да работи правилно и изпълнява условието, с идеята, че е писан от сестрата на risticha и съответно разбира как работи.

phrozencrew
Нед, 27.05.12, 12:51
В такъв случай би имало смисъл от блока в ъгловите скоби, ако се сложи if, който да провери, дали файла е отворен.
Примерно:
f.open("Masiv.txt",ios::out);
if(f.is_open()) {
    f<<n;
    for (i=0;i<n;i++)
    f<<a[i];
}

Казвам го, защото е добре да се схване идеята за циклите в програмирането. Няма значение на какъв език е писана задачката. Във всички езици за програмиране, които използват ъглови скоби (Curly-bracket languages), принципа за отваряне и затваряне на блок има един и същ смисъл.
Искам да наблегна и на още нещо - добрия кодинг стил, т.е. как се форматира кода. Това е нещото с което трябва да започва ученето да програмираш. Ползите от писане на четим код са безбройни, особено ако се наложи кода да ви го чете някой друг или вие самите след време. Препоръчвам една книжка, която детайлно разглежда темата:
The Art of Readable Code

Може да се изтегли от тук
или тук
или тук

anonymous
Вто, 29.05.12, 09:57
Отново благодарности към отзовалите се и за допълнителните размишления!

Сестрата си свали тази книга и ще я прегледа ако не забрави.
Причината така е да е написала първоначалният код е, че така ги учат. До колкото разбирам им преподават само основни работи и като гледам "по стари данни", което до някаква степен е загуба на време.
Фрозен, сестра ми каза, че 90% от таговете/командите или там както се наричат, които си използвал дори не са ги виждали в училище и няма как да копира този, защото няма как да го обясни на г-жата. Въобще такива неща не са правили.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.