C ANSI - menu w switch i zapisywanie pliku wyjściowego

0

Witam, jestem nowym użytkownikiem forum a także osobą stawiającą pierwsze kroki w programowaniu w C. Mam za zadanie napisać program przetwarzający obrazy pgm. O ile same funkcje przetwarzające nie sprawiły mi większych problemów, to utknąłem w miejscu kiedy mam zrobić menu za pomocą funkcji switch w którym użytkownik może

  1. Wczytać obraz.
  2. Zakończyć działanie
    Jeśli w czyta obraz, to powinno mu się pojawić 5 nowych opcji
    1-4. jedna z funkcji przetwarzania
  3. wczytanie innego obrazu czyli powrót do poprzedniej części menu.
    Tej drugiej części zupełnie nie umiem napisać.

/* Menu które na razie ma tylko dwie funkcje */
int main() {
  int obraz[MAX][MAX] ;
  int wymx,wymy,odcienie;

  int odczytano = 0;
  FILE *plik;
  char nazwa[100];

  /* Wczytanie zawartosci wskazanego pliku do pamieci */
  while(1>0)
  {
  printf("Program przetwarza obrazy pgm.\nWybierz akcję: \n1. Wczytaj obraz\n2. Zakończ\n");
  int wybor;
  scanf("%d",&wybor);
  switch(wybor)
  {
     case 1:
  printf("Podaj nazwe pliku:\n");
  scanf("%s",nazwa);
  plik=fopen(nazwa,"r");

  if (plik != NULL)         /* co spowoduje zakomentowanie tego warunku */
    odczytano = czytaj(plik,obraz,&wymx,&wymy,&odcienie);

  fclose(plik);

  /* Wyswietlenie poprawnie wczytanego obraza zewnetrznym programem */
  if (odczytano != 0)
    wyswietl(nazwa);

  return odczytano;
  case 2:
     printf("Program zakończył działanie.\n");
     return 0;
  default:
  printf("Wybór nie poprawny!\n");
  }
  
  
}
}
 

Drugim problemem z którym się zmagam to funkcja wczytująca te obrazy. Należy ją bowiem jakoś wyposażyć w to by omijała komentarz (zaczynać się on powinien od #). Udało mi się stworzyć coś co sprawdza czy pierwsza linijka jest komentarzem, jeśli jest to ją pomija, jeśli nie to wraca do jej początku i normalnie pozwala programowi ją przeczytać. Nie wiem jak sprawić by sprawdzała wszystkie linijki w poszukiwaniu tego # i później je odrzucała jeśli są zbędne.

 /* Pominiecie komentarzy */
  do {
    if ((znak=fgetc(plik_we))=='#') {         /* Czy linia rozpoczyna sie od znaku '#'? */
      if (fgets(buf,DL_LINII,plik_we)==NULL)  /* Przeczytaj ja do bufora                */
   koniec=1;                   /* Zapamietaj ewentualny koniec danych */
    }  else {
      ungetc(znak,plik_we);                   /* Gdy przeczytany znak z poczatku linii */
    }                                         /* nie jest '#' zwroc go                 */
  } while (znak=='#' && !koniec);   /* Powtarzaj dopoki sa linie komentarza */
                                    /* i nie nastapil koniec danych         */

Jednak najważniejszą rzeczą jest zapisywanie pliku wyjściowego. Tu dostałem gotowy kod, który jednak nie wiem, chyba po prostu nadpisuje zmiany pliku wejściowego o ile wgle to robi, natomiast powinno zgodnie ze specyfikacją tworzyć nowy plik wyjściowy. Np wczytany zostanie obraz kubus.pgm, później coś tam mu się stanie i wyjściowo powinno być np. newkubus.pgm.

 
/* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
  for (i=0;i<*wymy;i++) {
    for (j=0;j<*wymx;j++) {
      if (fscanf(plik_we,"%d",&(obraz_pgm[i][j]))!=1) {
   fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
   return(0);
      }
    }
  }
  return *wymx**wymy;   /* Czytanie zakonczone sukcesem    */
}                       /* Zwroc liczbe wczytanych pikseli */


 
 

Pilnie proszę o pomoc, ponieważ goni mnie termin oddania zadania. :( Z góry dziekuję za zainteresowanie tematem. 😆
Draggie.

0

Dwie opcje możesz: printf("Program przetwarza obrazy pgm.\nWybierz akcję: \n1. Wczytaj obraz\n2. Zakończ\n");
Zaś pięć już nie?

0

W skrócie:

 
int main()
{
while(1>0)
{
printf("Program przetwarza obrazy.\n Wybierz akcję:\n1. Wczytaj obraz\n2. Zakończ\n");
int wybor;
scanf("%d",&wybor);
printf("\n");
switch(wybor)
{
case 1:
//tu jest funkcja wczytująca obraz
int wybor2;
printf("Obraz wczytano poprawnie, wybierz funkcję przetwarzania:\n1.Funkcja 1\n2. Funkcja 2\n3. Funkcja 3\n4. Funkcja 4\n5. Wczytaj inny obraz.\n");
scanf("%d",&wybor2);
printf("\n");
switch(wybor2)
{
case 1:
funkcja 1;
break;
case 2:
funkcja 2;
break;
case 3:
funkcja 3;
break;
case 4:
funkcja 4;
break;
case 5:
break;
default:
printf("Wybór nie poprawny!\n");
}
case 2:
printf ("Program zakończył działanie\n");
return 0;
default:
printf("Wybor nie poprawny!\n");
}
}
}
1
  1. Poczytaj o formatowaniu
  2. wynieś int wybor2; przed switch lub wszystko pod case 1: weź w klamry.
  3. funkcja 1; - co to ma być?
0

To tak mniej więcej to co ma być, rzeczywiście po wyciągnięciu

int wybor2;

przed nawias wszystko ładnie działa : D Teraz mam tylko pytanie malutkie do tej części, jak sprawić by po wybraniu już jakiejś opcji ( np. na początku wczytaj obraz czyli 1 , później funkcja 2) program wracał do pierwszych dwóch opcji ? Tzn z powrotem do opcji 1. Wczytaj 2. Zakończ ?

 
#include <stdio.h>
void wczytaj ()
{
	printf("Obraz został wczytany\n");
    	
}
void koniec ()
{
	printf ("Program zakończył działanie\n");
	
}
void funkcja1 ()
{
	printf ("Wykonano akcję 1\n");

}
void funkcja2 ()
{
	printf ("Wykonano akcję 2\n");
    
}
void funkcja3 ()
{
	printf ("Wykonano akcję 3\n");
    
}
void funkcja4 ()
{
	printf ("Wykonano akcję 4\n");
    
}
int main() {
	while(1>0) {
printf("Przetwarzanie obrazów\n");
printf("Wybierz akcję:\n ");
printf("Wczytaj\n");
printf("Zakończ\n");
        int wybor;
	scanf("%d",&wybor);	
	
        int wybor2;
	
        switch(wybor){
	case 1 :
        wczytaj;
		
  printf("Obraz wczytano poprawnie, wybierz funkcję przetwarzania:\n");
  printf("1.Funkcja 1\n");
  printf("2. Funkcja 2\n");
  printf("3. Funkcja 3\n");
  printf("4. Funkcja 4\n");
  printf("5. Wczytaj inny obraz.\n");
  
  scanf("%d",&wybor2);
  
  printf("\n");

        switch(wybor2){
        case 1:
        funkcja1() ;
        break;

        case 2:
        funkcja2 ();
        break;

        case 3:
        funkcja3 ();
        break;

        case 4:
        funkcja4 ();
        break;

        case 5:
        break;

        default:
  printf("Wybór nie poprawny!\n");
  break;
}
	case 2 :
	koniec;
	return 0;
		
}
}
}
0

Dopóki nie pojmiesz idei formatowania będziesz tkwić w takich błędach bez przerwy.
Sformatuj kod.

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