Program operace s maticemi - problém se čtením souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Program operace s maticemi - problém se čtením souboru – C / C++ – Fórum – Programujte.comProgram operace s maticemi - problém se čtením souboru – C / C++ – Fórum – Programujte.com

 

Docctor0
Duch
11. 1. 2010   #1
-
0
-

Ahoj všichni, hned na začátek...prostě potřebuju poradit... dostal jsem za ukol napsat program v C kterej bude umět číst matice z textovýho souboru....bude je umět sčítat, odčítat, násobit....atd. Mám ale chybku, kterou nevím jak opravit. Když při zadáván vstupního textového souboru zadám špatný název, tak mi program skončí...tak je napsanej....ale je to chyba...program má pokračovat dále návratem do menu...posílám k tomu i zdroják, kdyby se našel někdo, kdo by poradil....díky

#include<stdio.h>
#include<stdlib.h>

/*******************************************************************************
* Vytvoreni uzivatelskeho menu *
*******************************************************************************/

int menu(void) {
int op;

printf("\nCo pro tebe mohu udelat?\n");
printf("0. Ukoncit program\n");
printf("1. Cti ctvercovou matici X z textoveho souboru\n");
printf("2. Cti ctvercovou matici Y z textoveho souboru\n");
printf("3. Vypis matici X na obrazovku\n");
printf("4. Vypis matici Y na obrazovku\n");
printf("5. Vypocet matice Z = X + Y\n");
printf("6. Vypocet matice Z = X - Y\n");
printf("7. Vypocet matice Z = X * Y\n");
printf("8. Vypis matice Z na obrazovku\n");
printf("9. Ulozeni matice Z do textoveho souboru\n");
printf("Zadej cislo operace\n");
do {
if (scanf("%d", &op)==0 || op<0 || op>9) {
printf("operaci jsi zadal spatne, znovu\n");
op = -1;
}
} while (op<0);
return op;
}

/*******************************************************************************
* Fce otevrni souboru pro ctení *
*******************************************************************************/

FILE *otevrivstsoubor(){ /*otevření vstupního souboru*/
FILE *soubor;
char jmenosouboru[40];

printf("Zadej jmeno vstupniho souboru\n");
scanf("%s",&jmenosouboru);
soubor=fopen(jmenosouboru,"r");
if (!soubor) {
printf("Soubor nenalezen, zadej nazev znova\n");
system("PAUSE");
}
return soubor;
}

/*******************************************************************************
* Fce otevrni souboru pro zapis *
*******************************************************************************/

FILE *oterenivystsoubor() { /*otevření výstupního souboru*/
FILE *soubor;
char jmenosouboru[40];

printf("Zadej jmeno vstupniho souboru\n");
scanf("%s",&jmenosouboru);
soubor=fopen(jmenosouboru,"w");
if (!soubor) {
printf("Soubor nenalezen\n");
system("PAUSE");
exit(1);
}
return soubor;
}




int main(void) {
FILE *maticex,*maticey,*maticez;
int polex[100][100],poley[100][100],polez[100][100];
int op,i,j,b,u,k=0,pocetprvkux=0,pocetprvkuy=0,pocetsloupcux,pocetradkuy;
char akt_cislo[10];
char znak,t[10];

do {
op = menu();
printf("%d tohle je OP",op);
system("PAUSE");
switch (op) {

/*******************************************************************************
* Načtení prvku ze souboru X *
*******************************************************************************/

case 1: i=0;
j=0;
b=0;
maticex=otevrivstsoubor();

while((znak=fgetc(maticex))!=EOF)
{
switch (znak)
{
case ' ':
akt_cislo="\0";
polex[i][j]=atoi(akt_cislo);
b=0;
i++;
break;
case '\n':
akt_cislo="\0";
polex[i][j]=atoi(akt_cislo);
b=0;
i=0;
j++;
break;
default:
akt_cislo=znak;
b++;

}
}
polex[i][j]=atoi(akt_cislo);
pocetsloupcux=i+1;
pocetprvkux=(j+1);
fclose(maticex);
break;

/*******************************************************************************
* Načtení prvku ze souboru Y *
*******************************************************************************/

case 2: i=0;
j=0;
b=0;
maticey=otevrivstsoubor();

while((znak=fgetc(maticey))!=EOF)
{
switch (znak)
{
case ' ':
akt_cislo="\0";
poley[i][j]=atoi(akt_cislo);
b=0;
i++;
break;
case '\n':
akt_cislo="\0";
poley[i][j]=atoi(akt_cislo);
b=0;
i=0;
j++;
break;
default:
akt_cislo=znak;
b++;

}
}
poley[i][j]=atoi(akt_cislo);
pocetradkuy=j+1;
pocetprvkuy=(j+1);
fclose(maticey);
break;

/*******************************************************************************
* Výpis načteného souboru X *
*******************************************************************************/

case 3: for(j=0;j<pocetprvkux;j++) {
for(i=0;i<pocetprvkux;i++)
printf(" %d",polex[i][j]);
printf("\n");
}
break;

/*******************************************************************************
* Výpis načteného souboru Y *
*******************************************************************************/

case 4: for(j=0;j<pocetprvkuy;j++) {
for(i=0;i<pocetprvkuy;i++)
printf(" %d",poley[i][j]);
printf("\n");
}
break;

/*******************************************************************************
* Součet matic X a Y *
*******************************************************************************/

case 5: if (pocetprvkux!=pocetprvkuy) { /*sečtení matice X a Y*/
printf("Matice nemají stejný rozměr, nelze je sečíst");
break;
}
for(i=0;i<pocetprvkux;i++) {
for(j=0;j<pocetprvkux;j++)
polez[i][j]=polex[i][j]+poley[i][j];
}

break;

/*******************************************************************************
* Rozdíl matice X a Y *
*******************************************************************************/

case 6: if (pocetprvkux!=pocetprvkuy) {
printf("Matice nemají stejný rozměr, nelze je odečíst");
break;
}
for(i=0;i<pocetprvkux;i++) {
for(j=0;j<pocetprvkux;j++)
polez[i][j]=polex[i][j]-poley[i][j];
}
break;

/*******************************************************************************
* Součin matic X a Y *
*******************************************************************************/

case 7: if (pocetsloupcux!=pocetradkuy) {
printf("Matice nemají stejný pocet sloupcu a radku, nelze je nasobit");
break;
}
for (i=0;i<pocetprvkux;i++){
for (j=0;j<pocetprvkux;j++){
polez[i][j]=0;
for (k=0;k<pocetprvkuy;k++) {
polez[i][j]=polez[i][j]+(polex[k][i]*poley[j][k]);
}
}
}
break;

/*******************************************************************************
* Zobrazení výsledné matice Z *
*******************************************************************************/

case 8: for(i=0;i<pocetprvkux;i++) {
for(j=0;j<pocetprvkuy;j++)
printf(" %d",polez[i][j]);
printf("\n");
}
break;

/*******************************************************************************
* Zapis vysledne matice do souboru *
*******************************************************************************/

case 9 : maticez=oterenivystsoubor();
for(i=0;i<pocetprvkux;i++) {
for(j=0;j<pocetprvkuy;j++){
printf(" %d",polez[i][j]);
u=polez[i][j];
sprintf(t," %i\0",u);
fprintf(maticez,t);
}
fprintf(maticez,"\n");
}
fclose(maticez);
break;
}
} while (op);
return 0;
}

Nahlásit jako SPAM
IP: 89.24.152.–
crAzY^
~ Moderátor
+10
Grafoman
11. 1. 2010   #2
-
0
-

FILE *nejakaMatice;

if( (nejakaMatice = otevriSoubor("soubor.txt")) == NULL)
tak to zopakuješ a vrátíš se do menu

do toho cyklu ve funkci main

do {
... tvuj kod ...
}while(op && !nejakaMatice);

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Docctor0
Duch
11. 1. 2010   #3
-
0
-

no zatim jsem to opravil takhle....primo tu fci co čte ten soubor.....

FILE *otevrivstsoubor(){ /*otevøení vstupního souboru*/
FILE *soubor;
char jmenosouboru[40];

printf("Zadej jmeno vstupniho souboru\n");
scanf("%s",&jmenosouboru);
soubor=fopen(jmenosouboru,"r");
if (!soubor) {
printf("Soubor nenalezen, zadej nazev znova\n");
while (!soubor) {
printf("Soubor nenalezen, zadej nazev znova\n");
scanf("%s",&jmenosouboru);
soubor=fopen(jmenosouboru,"r");
}
}
return soubor;
}

pravda, pokud ten soubor neexistuje, tak není možnost jak z programu vyskočit...lepší by bylo,kdyby se vrátil zpět do menu...ale to ještě nevím jak :(

Nahlásit jako SPAM
IP: 89.24.152.–
liborb
~ Redaktor
+18
Guru
12. 1. 2010   #4
-
0
-

V tom původním kódu, po otevření/neotevření souboru



maticex=otevrivstsoubor();


dej ještě podmínku, jestli je maticex platná (if (maticex) ...), pokud ano, tak proveď načtení souboru a pokud ne, tak jenom break a skočí ti to zpátky do menu, ne?

Nahlásit jako SPAM
IP: 85.207.166.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 61 hostů

Podobná vlákna

Problém se čtením vstupu... — založil eidam1995

Počítání s maticemi — založil Loloska

Pomoc se čtenim char — založil Zelenáč Uplný

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý