dlaczego nie wchodzi do switch-a

0

Cześć, proszę na mnie nie krzyczeć dopiero zaczynam ;-)

Ćwiczenie polega na wykonaniu iloczynu i wyplucie wyniku.
Jednak prawdziwym celem było dorobienie funkcji AM_ifplik();
coby była przygotowana na nie/istnienie pliku.

Po skompilowaniu nie wiem dlaczego wspomniana funkcja nie wchodzi mi do
wewnętrznych warunków switch...

pozdrawiam

Artur M.

#include <stdio.h>
#include <conio.h>
/* najpierw jakies operacje na liczbach potem 
   wyswietlenie wyniku (testowo na ekranie) docelowo do pliku.
*/


FILE *file;
void AM_ifplik();

int main (){
int i=0, AM_liczba=3; //ilosc wprowadzanych liczb
float AM_l, AM_i=1;   //liczba i iloczyn liczb


for (i=0; i<3; i++)                      
{
    printf ("\nWprowadz liczbe do pomnozenia: \n"); 
    scanf ("%f", &AM_l);
    --AM_liczba;
    
    if (AM_liczba!= 0)
    printf ("\tJeszcze %i\n", AM_liczba);

    if (AM_l==0){
                printf ("\nwpisales 0 !!!");
                printf ("\nZadna z liczb nie moze byc ZEREM");
                getche();
                return 0;
                }
                else 
    AM_i=AM_i*AM_l;
                     
}

    printf ("\n\nIloczyn = %0.2f", AM_i);



//##################################################
// wywoluje funkcje dostepu do pliku
AM_ifplik();
   
//##################################################
getche ();
return 0;
}     


// opis funkcji sprawdzajacej czy jest plik

void AM_ifplik() {
    
char AM_czy, AM_n; // utworzyc, nadpisac
    
  
file = fopen("alamakota.TXT", "r");
if(file==NULL){   //jesli nie ma pliku ...
     printf("\n\n\n Blad: nie moge otworzyc pliku.\n");
     printf("\n Czy wykreowac nowy plik? T/N\n"); scanf("%c",&AM_czy);
     printf("%c\n",AM_czy);
     getche();
     
     switch (AM_czy)
     {
            case 'N':
            case 'n':
                 printf  ("\n Nie tworze pliku.");
                 break; 
            case 't':
            case 'T':
                 printf ("\n Tworze brakujacy plik");
                 getche();
                 file = fopen("alamakota.TXT", "a");
                 break;
     }
     } // konczy duzego IFa
else {
     printf ("\n\n\n\t U W A G A, plik juz istnieje !\n");
     printf ("\n\t*N* adpisac czy  *D* opisac na koncu?");
     printf ("\n\n\tN / D  ?"); scanf ("%c", &AM_n);
     printf("%c\n",AM_n);
     getche();
     
     switch (AM_n)
     {
            case 'n':
            case 'N':
                 file = fopen("alamakota.TXT", "w");
                 printf  ("\n Plik nadpisany.");
                 getche();
                 break; 
            case 'd':
            case 'D':
                 file = fopen("alamakota.TXT", "a");
                 printf  ("\n Dopisano na koncu pliku.");
                 
                 break;
     } //koniec switcha
     
     } // konczy elsa
     }
0

formatowanie kodu sie klania. jakbys poswiecil wiecej czasu na ukladanie bialych znakow - konkretnie spacji/tabulacji na poczatkach wierszy - sam bys zauwazyl, ze po getche(); zapomniales } zamykajacego if(==NULL) ;)

ps. nie zrozum mnie zle - formatowanie masz jedne z lepszych jakie tutaj ludzie wrzucaja.. ale fakt/blad jest faktem/bledem:)

0
quetzalcoatl napisał(a)

formatowanie kodu sie klania. jakbys poswiecil wiecej czasu na ukladanie bialych znakow - konkretnie spacji/tabulacji na poczatkach wierszy - sam bys zauwazyl, ze po getche(); zapomniales } zamykajacego if(==NULL) ;)

Wybacz, siedzę już nad tymi kilkoma linijkami kilka godzin i nie bardzo wiem po czym piszesz.
Wszystkie klamry wydają się być "parzyste" - kompilator nic nie krzyczy.

Problem jest taki, że jeśli pliku nie ma to do pierwszego switch-a nie wchodzi "&AM_czy" i plik się tak naprawdę nie tworzy ...
I dalej, Jeśli plik już istnieje to nie wchodzi do drugiego switcha - nie sprawdza przypadków.

0

ugh... pardon, zle skopiowalem kod i mi obcielo sekcje
" } // konczy duzego IFa
else {
printf ("\n\n\n\t U W A G A, plik juz istnieje !\n");
"
sadzilem ze if-getche-switch w pierwszej sekcji to calosc koncowki

co wyswietla printf("%c\n",AM_n); ? wyswietla t/T/n/N czy nic? jesli nic, to znaczy ze po scanf%f pozostaly w stdin jeszcze znaki konca linii i to one Ci trafiaja do AM_czy/AM_n podczas scanf%c

0

Wczytywanie pojedynczych znaków za pomocą scanf bez sprawdzania rezultatu wywołania tej funkcji to bardzo zły pomysł. Jeżeli scanf nie wczyta pola wejściowego (z dowolnego powodu - błędu we/wy, złego formatu danych itp.), to podaje jako rezultat tyle wczytanych pól ile udało się wczytać. W przypadku pojedynczego pola znakowego oznacza to, że rezultat 1 jest ok, a zero lub mniejszy od zera to błąd wczytywania. Jeżeli wczytanie się nie uda, to wartość zmiennej pozostaje bez zmian, co w przypadku zmiennej indeksowanej na stosie oznacza, że są tam przypadkowe śmiecie - poprzednie dane innych zmiennych lub czasem nawet kawałki instrukcji maszynowych.

Lepszym sposobem przy wczytywaniu pojedynczych znaków jest użycie funkcji znakowych. Np. coś takiego:

#include <conio.h>
#define ESC 0x1b
void main(void)
{
	int c;
	puts("Klawisz ESC kończy program");
	do
	{
		if((c = getch()) == '\0')
			printf("Kod znaku: 0h, %02Xh\n", c = getch());
		else
			printf("Kod ASCII znaku: %02Xh\n", c);
	}while(c != ESC);
}

Programik ten wczytuje naciśnięty znak, po rezultacie sprawdza czy jest to znak ASCII czy kod klawisza bez przypisanego znaku i wypisuje to na wyjściu. Na bazie getch() można sobie stworzyć banalną funkcję do wypisywania pytania, wczytywania znaku i oddawania rezultatu w czymś bardziej sensownym niż kod ASCII, który wcale przecież nie musi nastąpić.

Jedyny problem to ten, że conio.h nie jest przenośne i w systemach poza Windows funkcje z tego nagłówka praktycznie nie istnieją.

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