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;
}
Fórum › C / C++
Program operace s maticemi - problém se čtením souboru
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);
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 :(
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?
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
K: program v JAVE na Operace s maticemi — založil nikyklada
Problém se čtením vstupu... — založil eidam1995
C# Problém se čtením DateTime z databáze — založil Attila
Počítání s maticemi — založil Loloska
Pomoc se čtenim char — založil Zelenáč Uplný
Moderátoři diskuze