Program obliczający zwarcia do poprawy

0

Witam tworze program na zaliczenie na studia i mam z kolegą pewien problem. Nie działają nam ani odczyt z pliku ani zapis do pliku, i nie wiemy co jest tego przyczyną gdyż wcześniejsze programy które pisaliśmy z podobnymi formułami odczytu zapisu działały poprawnie. Goni nas termin i pomoc jest nam bardzo potrzebny działający program....

Treść zadania zamieszczam gdyby ktoś chciał dokładniej się przyjrzeć o co w programie ma chodzić:

Treść zadania:

Napisać program wyliczający prąd zwarcia w instalacji nn.
Zakładamy, że sieć pracuje w układzie TN-S, przekroje wszystkich żył w jednym odcinku są jednakowe, przewody miedziane. Program ma wczytywać z pliku dane sieci: listę łuków, przekroje i długość przewodów oraz dla łuku transformator jego parametry umożliwiające wyliczenie R oraz X. Program ma umożliwiać edycję parametrów sieci (ze zmianą topologii sieci) oraz zapis sieci do pliku. Można przyjąć, że graf opisujący sieć jest grafem skierowanym. W przypadku niespójności sieci, program ma wypisywać komunikat. Program ma umożliwiać użytkownikowi wybór miejsca zwarcia (w jednym z węzłów) oraz rodzaj zwarcia (jednofazowe bądź trójfazowe). Program ma wyliczyć prąd zwarcia.

Błędy pokazujące się w programie

------ Build started: Project: zwarcia, Configuration: Debug Win32 ------
Compiling...
main.cpp
.\main.cpp(125) : error C2360: initialization of 'plik2' is skipped by 'case' label
.\main.cpp(114) : see declaration of 'plik2'
.\main.cpp(138) : error C2360: initialization of 'plik2' is skipped by 'case' label
.\main.cpp(114) : see declaration of 'plik2'
Build log was saved at "file://c:\Documents and Settings\malenstwo\Pulpit\CPP\Projekt\zwarcia\zwarcia\Debug\BuildLog.htm"
zwarcia - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

A o to treść pliku nagłówkowego oraz głównego main

plik "luk.hh"

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

class luk
{
public:
// pola danych klasy luk

string nazwa;
int wpocz;
int wkoniec;
float r;
float x;
float z;

//metody klasy luk
luk();
virtual void wprowadz_parametry();
virtual void zapisz_do_f(ofstream & s);
virtual void wczytaj_z_f(ifstream & s);
virtual void wypisz();
};
//
//Definicje metod klasy luk
//
///////////////////////////////konstruktor
luk::luk()
{
nazwa='0';
wpocz=0;
wkoniec=0;
r=0;
x=0;
z=0;
}
///////////////////////////////metoda wprowadzania danych
void luk::wprowadz_parametry()
{
int poczatek;
int koniec;
float rez;
float reak;
string name;

cout << "Podaj nazwe luku\n";
cin >> name;
nazwa = name;
cout << "Podaj wezel poczatkowy\n";
cin >> poczatek;
wpocz = poczatek;
cout << "Podaj wezel koncowy\n";
cin >> koniec;
wkoniec = koniec;
cout << "Podaj rezystancje luku\n";
cin >> rez;
r = rez;
cout << "Podaj reaktancje luku\n";
cin >> reak;
x = reak;
z=sqrt((r*r)+(x*x));

}
////////////////////////////////////////////////metoda zapisu do pliku
void luk::zapisz_do_f(ofstream & s)
{
s << nazwa << " " << wpocz << " " << wkoniec << " "
<< r << " " << x << "\n";

}
////////////////////////////////////////////////metoda wczytania z pliku
void luk::wczytaj_z_f(ifstream & s)
{
s>> nazwa;
s>> wpocz;
s>> wkoniec;
s>> r;
s>> x;
z=sqrt((r*r)+(x*x));

}
////////////////////////////////////////////////metoda wypisu na ekran
void luk::wypisz()
{
cout << "Luk\t" <<"Wpocz\t" <<"Wkoniec\t"<<"R\t" <<"X\t" <<"Z\n"
<< nazwa <<"\t" <<wpocz<<"\t" <<wkoniec <<"\t" <<r<<"\t"<<x<<"\t"<<z<<"\n";

}

//
//Koniec definicji metod klasy luk
//

class trafo: public luk
{
private:
// pola klasy trafo jednoznacznie zdefiniowane
//string nazwa="trafo";
//int wpocz=0;
//int wkoniec=1;
public:
//metody klasy trafo
trafo();
virtual void wprowadz_parametry();
virtual void zapisz_do_f(ofstream & s);
virtual void wczytaj_z_f(ifstream & s);
virtual void wypisz();
};
//
//Definicje metod klasy trafo
//
//konstruktor klasy trafo
trafo::trafo()
{
nazwa="trafo";
wpocz=0;
wkoniec=1;
r=0;
x=0;
z=0;
}
///////////////////////////////metoda wprowadzania danych
void trafo::wprowadz_parametry()
{

float rez;
float reak;

cout << "Podaj rezystancje trafo\n";
cin >> rez;
r = rez;
cout << "Podaj reaktancje trafo\n";
cin >> reak;
x = reak;
z=sqrt((r*r)+(x*x));

}
////////////////////////////////////////////////metoda zapisu do pliku
void trafo::zapisz_do_f(ofstream & s)
{
s << nazwa << " " << wpocz << " " << wkoniec << " "
<< r << " " << x << "\n";

}
////////////////////////////////////////////////metoda wczytania z pliku
void trafo::wczytaj_z_f(ifstream & s)
{
s>> nazwa;
s>> wpocz;
s>> wkoniec;
s>> r;
s>> x;
z=sqrt((r*r)+(x*x));

}
////////////////////////////////////////////////metoda wypisu na ekran
void trafo::wypisz()
{
cout << "Trafo\t" <<"Wpocz\t" <<"Wkoniec\t"<<"R\t" <<"X\t" <<"Z\n"
<< nazwa <<"\t" <<wpocz<<"\t" <<wkoniec <<"\t" <<r<<"\t"<<x<<"\t"<<z<<"\n";

}

//
//Koniec definicji metod klasy trafo
//
class linia: public luk
{
public:
// pola klasy linia
float dlugosc; //dlugosc w metrach
float przekroj; //przekroj w mm kwadratowych
int konduktywnosc; //konduktywnosc w MS/m
//metody klasy linia
linia();
virtual void wprowadz_parametry();
virtual void zapisz_do_f(ofstream & s);
virtual void wczytaj_z_f(ifstream & s);
virtual void wypisz();
};
//
//Definicje metod klasy linia
//
//konstruktor klasy linia
linia::linia()
{
nazwa='0';
wpocz=0;
wkoniec=0;
r=0;
x=0;
z=0;
dlugosc=0;
przekroj=0;
konduktywnosc=56;
}
///////////////////////////////metoda wprowadzania danych
void linia::wprowadz_parametry()
{

cout << "Podaj nazwe linii\n";
cin >> nazwa;
cout << "Podaj nr wezla poczatkowego linii\n";
cin >> wpocz;
cout << "Podaj nr wezla koncowego linii\n";
cin >> wkoniec;
cout << "Podaj dlugosc linii w metrach\n";
cin >> dlugosc;
cout << "Podaj przekroj linii w mm^2\n";
cin >> przekroj;
r=dlugosc/(przekroj*konduktywnosc);
x=0.1*r;
z=sqrt((r*r)+(x*x));

}
////////////////////////////////////////////////metoda zapisu do pliku
void linia::zapisz_do_f(ofstream & s)
{
s << nazwa << " " << wpocz << " " << wkoniec << " "
<< dlugosc << " " << przekroj << "\n";

}
////////////////////////////////////////////////metoda wczytania z pliku
void linia::wczytaj_z_f(ifstream & s)
{
s>> nazwa;
s>> wpocz;
s>> wkoniec;
s>> dlugosc;
s>> przekroj;
r=dlugosc/(przekroj*konduktywnosc);
x=0.1*r;
z=sqrt((r*r)+(x*x));

}
////////////////////////////////////////////////metoda wypisu na ekran
void linia::wypisz()
{
cout << "Linia\t" <<"Wpocz\t" <<"Wkoniec\t"<<"dl\t" <<"przek\t" <<"Z\n"
<< nazwa <<"\t" <<wpocz<<"\t" <<wkoniec <<"\t" <<dlugosc<<"\t"<<przekroj<<"\t"<<z<<"\n";

}
//
//Koniec definicji metod klasy linia

Plik główny

/*zadanie do realizacji
tresc */
#include "luk.hh"
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <math.h>
#include <cstdlib>

#include <conio.h>

using namespace std;

int main ()
{
float z_zwarcia;
float r_zwarcia=0;
float x_zwarcia=0;
float ik1f;
float ik3f;
int a; //pkt 7 menu
int elementy=20; //pkt 7 menu
float procent_zwarcia; //pkt 7 menu
int nr_luku_zwarcia; //pkt 7 menu
int znak; // wybor opcji z menu
//int znak1; // do pkt 1 menu
int nr_luku; //potrzebny do wyboru luku w pkt 2 w menu
vector<linia> siec(20);
//vector<luk> petla(20);
trafo transformator;
int kolejny=0; //potrzebny w pkt 1 menu
char czy_dalej; // potrzebny w pkt 1 w menu
int i=0; // do odczyty/zapisu do pliku
int l=0; // do odczyty/zapisu do pliku
int wypisywanie=20; //punkt 6

do
{
cout <<"MENU :\n";
cout <<"1 - Wprowadz dane sieci \n" //jest
<<"2 - Zmien parmetry Luku\n" //jest
<<"3 - Wczytaj siec z pliku siec1.txt\n" //jest
<<"4 - Wczytaj siec z pliku siec2.txt\n" //jest
<<"5 - Zapisz siec do pliku siec2.txt\n"
<<"6 - Wyswietl siec na ekranie\n"
<<"7 - Wybierz miejsce zwarcia\n"
<<"8 - Zakoncz program\n" ;

cin >> znak;
switch (znak)
{
case 1 : // wprowadzanie parametrów sieci

transformator.wprowadz_parametry();
do
{
siec[kolejny].wprowadz_parametry();
cout << "Czy chcesz wprowadzac dalej? (t/n)\n";
cin >> czy_dalej;
kolejny++;
}
while((kolejny<=19)&&(czy_dalej=='t'));
// koniec wprowadzania parametrów sieci

case 2: //zmiana parametrow konkretnego luku
cout << "Podaj nr luku ktorego parametry chcesz zmienic:\n";
cin >> nr_luku;
siec[nr_luku].wprowadz_parametry();
//koniec zmiany parametrow konkretnego luku

case 3 : //wczytywanie parametrow z pliku siec1.txt

/* cout << "Wczytuje z pliku siec1.txt .....\n";

ifstream plik("siec1.txt");
plik.open();
transformator.wczytaj_z_f(plik);
while(plik.good())
{
siec[i].wczytaj_z_f(plik);
i++;
l++;

}
plik.close(); */

//koniec wczytywania parametrow z pliku siec1.txt

case 4 : //wczytywanie parametrow z pliku siec2.txt

cout << "Wczytuje z pliku siec2.txt .....\n";

/* ifstream plik2("siec2.txt");
transformator.wczytaj_z_f(plik2);
while(plik2.good())
{
siec[i].wczytaj_z_f(plik);
i++;
l++;

}
plik2.close(); */
//koniec wczytywania parametrow z pliku siec2.txt

case 5 : //zapis parametrow do pliku siec2.txt

cout << " zapis nowych parametrow do pliku siec2.txt ................\n";
ofstream plik2("siec2.txt");
transformator.zapisz_do_f(plik2);
for (i=0;i<l;i++)
{
cout <<"luk nr " << (i) <<" .....................................";
siec[i].zapisz_do_f(plik2);
cout <<"zapisany\n";
}
plik2.close();
//koniec zapisu do pliku siec2.txt

case 6 : //wyswietlanie sieci
cout << "Siec:\n";
transformator.wypisz();
for(int c=0;c<20;c++)
{
siec[c].wypisz();
}

//koniec wyswietlania sieci

case 7 : //wybor i liczenie miejsca zwarcia
cout << "Podaj numer luku w ktorym chcesz zrobic zwarcie\n";
cin >> nr_luku_zwarcia;
cout << "Podaj w ktorym procencie dlugosci linii jest zwarcie\n";
cin >> procent_zwarcia;
r_zwarcia=transformator.r+(procent_zwarcia*0.01*(siec[nr_luku_zwarcia].r));
x_zwarcia=transformator.x+(procent_zwarcia*0.01*(siec[nr_luku_zwarcia].x));
cout <<"R zwarcia = " << r_zwarcia <<"\n";
while(siec[nr_luku_zwarcia].wpocz!=1)
{
cout<<"w petli do do zwarcia\n";
for (a=0;a<elementy;a++) // obliczanie impedancji petli zwarcia
{
cout<<"w petli for do zwarcia\n";
if(siec[a].wkoniec==siec[nr_luku_zwarcia].wpocz)
{
r_zwarcia=r_zwarcia+siec[a].r;
x_zwarcia=x_zwarcia+siec[a].x;
nr_luku_zwarcia=a;
}

}
}

// obliczanie zwarcia
z_zwarcia=sqrt((r_zwarcia*r_zwarcia)+(x_zwarcia*x_zwarcia));
ik1f=230/z_zwarcia;
ik3f=(1.1*400)/((sqrt(3.0))*z_zwarcia);
cout << " Prad zwacia 1f wynosi Ik1f = " << ik1f <<"A\n" ;
cout << " Prad zwacia 3f wynosi Ik3f = " << ik3f <<"A\n" ;

//koniec wyboru i liczenia zwarcia

}
}
while(znak!=8);
return (0);
}
3

Jak wynika z informacji o błędzie initialization of 'plik2' is skipped by 'case' label, definicja pliku

ofstream plik2("siec2.txt");

znajduje się w nieodpowiednim miejscu. Spróbuj przenieś ją bezpośrednio przed instrukcję switch.

3

Cały problem sprowadza się do tego, że masz main na 140 linii.
Każda funkcja, która nie mieści się w 20-30 liniach to crap code.
Najlepiej jak funkcje nie są dłuższe niż 8-15 linii, a pedanci redukują funkcje do 3-4 linii.

To jest tak jak w języku naturalnym: jak ktoś mówi/piszę zdaniami wielokrotnie złożonymi, to odbiorcy słyszą/widzą tylko bełkot.

1

Jeśli chcesz definiować zmienne pod case'em to trzeba dodać klamry przy danym kejsie:

case 5 :
{
    ofstream plik2("siec2.txt");
    ...
    break;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1