Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Opět ahoj všem a vás prosím o radu.
V C++ čtu matici ze souboru BIN, sotva však napíšu název souboru, který chci číst a odentruju, tak mi program zhavaruje.
Nevíte proč ???
void Matice::Cti_bin() {
char nazev_souboru[40];
int velikost;
char znak;
int i=0,j=0;
velikost=(pocet_sloupcu-1);
cout << "Zadej nazev BIN souboru" << endl;
cin >> nazev_souboru;
cout << endl;
ifstream vstup(nazev_souboru, ios::in|ios::binary);
if (vstup) {
while (vstup.get(znak)) {
Nastav_matici(j,i,(int)znak);
i++;
if (i==velikost) {
j++;
i=0;
}
}
vstup.close();
}
else cout << "Soubor nelze otevrit" << endl;
}
Offline

Možná by bylo lepší kdyby jsi sem dal celý kód i tu třídu Matice a funkci Nastav_matici.
Offline
no fakt nemuzu na to prijit :((
#include<iostream>
#include<iomanip>
#include<fstream>
#include "matice.h"
#include<string>
using namespace std;
Matice::Matice(int x, int y) {
pocet_radku=x;
pocet_sloupcu=y;
pole=new int *[pocet_radku];
for (radky=0;radky<pocet_radku;radky++) pole[radky]=new int[pocet_sloupcu];
}
Matice::~Matice() {
for (radky=0;radky<pocet_radku;radky++) delete[] pole[radky];
delete[] pole;
}
// vypsani matice na obrazovku
void Matice::Vypis_matice() {
for (radky=0;radky<pocet_radku;radky++)
{
for (sloupce=0;sloupce<pocet_sloupcu;sloupce++) cout << setw(5) << pole[radky][sloupce];
cout << endl;
}
cout << endl;
}
// Nastaveni matice
void Matice::Nastav_matici(int x, int y, int z) {
radky=x;
sloupce=y;
int a=z;
pole[radky][sloupce]=a;
}
// cteni matice z textoveho souboru
void Matice::Cti_txt() {
char nazev_souboru[40];
int velikost;
int z;
int i=0,j=0;
velikost=(pocet_sloupcu-1);
cout << "Zadej nazev TXT souboru" << endl;
cin >> nazev_souboru;
cout << endl;
ifstream vstup;
vstup.open(nazev_souboru,ios::in);
if (vstup) {
while (vstup>>z,vstup) {
Nastav_matici(j,i,z);
if (i==velikost) {
j++;
i=-1;
}
i++;
}
vstup.close();
}
else cout << "Soubor nelze otevrit" << endl;
}
//cteni matice z binarniho souboru
void Matice::Cti_bin() {
std::string nazev_souboru;
int velikost;
char znak;
int i=0,j=0;
const char* c_str();
velikost=pocet_sloupcu;
cout << "Zadej nazev BIN souboru" << endl;
cin >> nazev_souboru;
cout << endl;
ifstream vstup(nazev_souboru.c_str(), ios::in|ios::binary);
if (vstup) {
while (vstup.get(znak)) {
// cout << i << endl;
// cout << j << endl;
cout << (int)znak << endl;
system("PAUSE");
Nastav_matici(j,i,(int)znak);
if(i==velikost){
j++;
i=-1;
}
i++;
}
vstup.close();
}
else cout << "Soubor nelze otevrit" << endl;
}
//zapis matice do textoveho souboru
void Matice::Zapis_txt() {
char nazev_souboru[40];
int velikost;
int z;
velikost=(pocet_sloupcu-1);
cout << "Zadej nazev souboru TXT pro zapis" << endl;
cin >> nazev_souboru;
ofstream vystup;
vystup.open(nazev_souboru,ios::out);
if (vystup) {
for (int i=0;i<=(pocet_sloupcu-1);i++) {
for (int j=0;j<=(pocet_sloupcu-1);j++) {
vystup << pole[i][j] << endl;
}
}
vystup.close();
cout << "Data jsou ulozena" << endl;
}
else cout << "Soubor nelze otevrit" << endl;
}
// zapis matice do binarniho souboru
void Matice::Zapis_bin() {
char nazev_souboru[40];
int velikost;
velikost=(pocet_sloupcu-1);
cout << "Zadej nazev souboru BIN pro zapis" << endl;
cin >> nazev_souboru;
cout << endl;
ofstream vystup(nazev_souboru);
if (vystup) {
for (int i=0;i<=(pocet_sloupcu-1);i++) {
for (int j=0;j<=(pocet_sloupcu-1);j++) {
vystup.put (pole[i][j]) << endl;
}
}
vystup.close();
cout << "Data jsou ulozena" << endl;
}
else cout << "Soubor nelze otevrit" << endl;
}
//nacteni matice z klavesnice
void Matice::Cti_klavesnice(){
int z;
cout << "Zadej pole" << endl;
for (int i=0;i<=(pocet_sloupcu-1);i++) {
for (int j=0;j<=(pocet_sloupcu-1);j++) {
cin >> z;
Nastav_matici(i,j,z);
}
}
cout << endl;
}
//transponovana matice
void Matice::Transpozice() {
int pom[pocet_radku][pocet_sloupcu];
for (int i=0;i<=(pocet_sloupcu-1);i++) {
for (int j=0;j<=(pocet_sloupcu-1);j++) {
pom[i][j]=pole[i][j];
}
}
for (int i=0;i<=(pocet_sloupcu-1);i++) {
for (int j=0;j<=(pocet_sloupcu-1);j++) {
pole[j][i]=pom[i][j];
}
}
}
//soucet prvku nad hlavni diagonalou
void Matice::Vypis_souctu_nad() {
int soucet=0;
for (int i=0;i<=(pocet_sloupcu-1);i++) {
for (int j=0;j<=(pocet_sloupcu-1);j++) {
if (i<j) soucet=soucet+pole[i][j];
}
}
cout << "Soucet prvku nad hl. diagonalou je : " << soucet << endl << endl;
}
//soucet prvku pod hlavni diagonalou
void Matice::Vypis_souctu_pod() {
int soucet=0;
for (int i=0;i<=(pocet_sloupcu-1);i++) {
for (int j=0;j<=(pocet_sloupcu-1);j++) {
if (i>j) soucet=soucet+pole[i][j];
}
}
cout << "Soucet prvku pod hl. diagonalou je : " << soucet << endl << endl;
}
// preskupeni radku matice podle souctu
void Matice::Preskup_radky() {
int pole_soucet[pocet_sloupcu][2];
int nove_pole[pocet_sloupcu][5];
int soucet=0;
int k=0,l=0;
int pom;
int pocetradku=0;
for (int i=0;i<=(pocet_sloupcu-1);i++){
for (int j=0;j<=(pocet_sloupcu-1);j++) soucet=soucet+pole[i][j];
pole_soucet[i][0]=i;
pole_soucet[i][1]=soucet;
soucet=0;
}
// serazeni pole se soucty
while (pocetradku !=pocet_sloupcu ) {
for (int i=0;i<(pocet_sloupcu-1);i++) {
if (pole_soucet[i][1]>pole_soucet[i+1][1]) { pom=pole_soucet[i+1][0];
pole_soucet[i+1][0]=pole_soucet[i][0];
pole_soucet[i][0]=pom;
pom=pole_soucet[i+1][1];
pole_soucet[i+1][1]=pole_soucet[i][1];
pole_soucet[i][1]=pom;
}
}
pocetradku++;
}
cout << endl;
for (int o=0;o<pocet_sloupcu;o++){
for (int p=0;p<pocet_sloupcu;p++) {
nove_pole[o][p]=pole[pole_soucet[o][0]][p];
}
}
for (int x=0;x<pocet_sloupcu;x++) {
for (int z=0;z<pocet_sloupcu;z++) {
pole[x][z]=nove_pole[x][z];
}
cout << endl;
}
}
Offline
#include<iostream>
using namespace std;
class Matice { // třída matice
public :
int radky, sloupce;
int pocet_radku,pocet_sloupcu; // promena pocty radku a sloupcu
int **pole; // ukazatel na pole ukazatelu
Matice(int,int); // konstruktor
~Matice(); // destruktor
void Vypis_matice(); // metoda vypise matici na obrazovku
void Nastav_matici(int,int,int); // metoda nastavi přectenou matici
void Cti_txt(); // metoda cteni matice z txt souboru
void Cti_bin(); // metoda cteni matice z bin souboru
void Zapis_txt(); // metoda zapisu matice do txt souboru
void Zapis_bin(); // metoda zapisu matice do txt souboru
void Cti_klavesnice(); // metoda cteni matice z klavesnice
void Transpozice(); // metoda pro transpozici matice
void Vypis_souctu_nad(); // metoda pro soucet prvku nad hl. diagonalou
void Vypis_souctu_pod(); // metoda pro soucet prvku pod hl. diagonalou
void Preskup_radky(); // metoda přeskupení řádků v matici
};
Offline

Je zajimave, ze Doctor pise, ze po vyzvani na zadani filename jej zada a program spadne az pak, i presto, ze nema kdo zavolat konstruktor tridy. Myslim, ze bez main to nejde ani zkompilovat. Moje teorie je, ze funkci main ma, vola z ni konstruktory objektu a pracuje uvnitr ni klasicky interakcne, tedy if-else metody co uzivatel chce s tou matici delat, apod, ovsem chyba bude nekde pri cteni souborů, tedy na volani funcke vstup(...)... Moc to sem asi nepatri, ale co je to ifstream?? neni snad ten datovy typ istream?
Offline

↑ frank_horrigan:
Kdyby tam měl překlep tak by mu to hlásilo chybu a né spadlo až po přeložení. (Opravdu je to ifstream)
Offline
jj..sry hosi neakou dobu jsem tu nebyl
tady je main
#include <cstdlib>
#include <iostream>
#include "matice.h"
using namespace std;
int menu() {
int cislo;
cout << "Zadejte cislo operace :" << endl;
do {
cout << "0 = Konec programu" << endl;
cout << "1 = Zadej matici z klavesnice" << endl;
cout << "2 = Nacti matici z textoveho souboru" << endl;
cout << "3 = Nacti matici z binarniho souboru" << endl;
cout << "4 = Vypis matici na obrazovku" << endl;
cout << "5 = Zapis matici do textoveho souboru" << endl;
cout << "6 = Zapis matici do binarniho souboru" << endl;
cout << "7 = Transponuj matici" << endl;
cout << "8 = Secti prvky nad hlavni diagonalou" << endl;
cout << "9 = Secti prvky pod hlavni diagonalou" << endl;
cout << "10 = Serad sestupne radky matice podle hodnot souctu radku" << endl;
cin >> cislo;
cout << endl;
if (cislo < 0 || cislo > 10 ){
cout << "Zvolili jste spatne" << endl;
cislo='n';
}
}
while (cislo=='n');
return cislo - 0;
}
int main(){
int cislo;
int rozmer_matice;
cout << "Zadejte rozmer ctvercove matice : " << endl;
cin >> rozmer_matice;
Matice mat(rozmer_matice,rozmer_matice);
do {
cislo=menu();
switch (cislo) {
case 1: mat.Cti_klavesnice(); break;
case 2: mat.Cti_txt(); break;
case 3: mat.Cti_bin(); break;
case 4: mat.Vypis_matice(); break;
case 5: mat.Zapis_txt(); break;
case 6: mat.Zapis_bin(); break;
case 7: mat.Transpozice(); break;
case 8: mat.Vypis_souctu_nad(); break;
case 9: mat.Vypis_souctu_pod(); break;
case 10: mat.Preskup_radky(); break;
}
}
while (cislo > 0);
// mat.~Matice();
return 0;
}
Offline
Stránky: 1