[c] wczytywanie danych

kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

[c] wczytywanie danych

Post autor: kawafis44 »

Pierwszy problem dotyczy opcji 'a'. Po uruchomieniu programu wybieram opcję 'a', poprawnie mi czyta nazwę macierzy (użytkownik wybiera literę alfabetu, nie może ona być już zajęta, zaś zerem rezygnuje). Niestety nie potrafi wybrać rozmiaru macierzy, bo "wysypuje się" po wpisaniu np. "1 1", po prostu wychodzi z programu.

Drugi problem to #include . Przed jego dodaniem wszystko było ok. Po jego dodaniu cały dotychczasowy kod działa "inaczej". Jako przykład mogę podać zachowanie po wybraniu opcji 'a'. Bez conio nie czeka na potwierdzenie enterem, tylko od razu wchodzi w opcję, potem czeka na wprowadzenie litery, która ma być nazwą macierzy. Z conio zaś czeka na potwierdzenie enterem, robi jakieś niepotrzebne puste linie, nie wiadomo skąd zakłada, że została jako nazwa macierzy wybrana wartość nie będąca literą, choć nie wybrano żadnej wartości.

Pozdro!

Kod: Zaznacz cały

#include <stdio.h>
#include <conio.h>
//#include <cstdlib.h> //library for cleaning the screen

struct matrices
{
int owned; //do you own this matrix
int sizea, sizeb; //what is the size of matrix, a-rows, b-columns
int values[25][25]; //every element of this matrix
} matrix[27]; //there are 27 matrices

char choose_opt()
{
   char temp_opt;
   
   system("cls");
   printf("Matrix calculator \n\
   (a) Create new matrix \n\
   (b) Edit existing matrix \n\
   (c) Show existing matrix \n\
   (d) Delete existing matrix \n\
   (e) Save matrices to the file \n\
   (f) Load matrices from the file \n\
   (g) Transposition (MxN)^T = (NxM) \n\
   (h) Addition (MxN)+(MxN)=(MxN) \n\
   (i) Scalar multiplication c*(MxN)=(MxN) \n\
   (j) Matrix multiplication (MxN)x(NxP)=(MxP)\n\
   (k) Exponentiation (MxM)^c=(MxM) \n\
   (l) Determinant det[(MxM)]=c\n\
   (m) Inverse (MxM)^(-1)=(MxM) if det[(MxM)]<>0\n\
   (n) About the program\n\
   (o) Exit the application\n");
   
   do
   {
      printf("Choose your option.");
      temp_opt = getch();
      if ((temp_opt < 'a')||(temp_opt > 'o'))
         printf("\nImproper choice. ");
      else
         printf("\n");
   } while ((temp_opt < 'a')||(temp_opt > 'o'));
   return temp_opt;
}

void Show_owned()
{
   int i;
   int do_you_own_any_matrix=0; //check wheter there are any owned matrices
   for (i=0;i<27;i++)
    if (matrix[i].owned)
         {
            do_you_own_any_matrix=1;
            break;
         }
         
   if (do_you_own_any_matrix) //if there are, show which one
   {
      printf("You own these matrices: ");
      for (i=0;i<27;i++)
         {
         if (matrix[i].owned==1)
            printf("%c",'a'+i-1);
         }
   }
   else
      printf("You do not own any matrix.");
}

void Func_a()
{
   char temp_opt_local;
   int temp_opt_local_number;
   int siza,sizb; int error;
   Show_owned(); //show matrices owned by the user

   printf("\nChoose the letter for a new matrix (zero for exit).");
   do //choose the letter as a name for your new matrix
   {
      temp_opt_local = getch();
      if (temp_opt_local == '0') {printf("\nYou have not created new matrix");break;}
      if ((temp_opt_local < 'a')||(temp_opt_local > 'z'))
         {printf("\nYou must choose the letter. ");continue;}
      temp_opt_local_number = (int)temp_opt_local-(int)'a'+1; //int x; char y; x=(int)y writes number of symbol y in ascii table
      if (matrix[temp_opt_local_number].owned==1)
         {printf("\nYou must choose another letter. ");continue;} //continue is not needed
      else
         {printf("\nYour choise is proper: %c. ",temp_opt_local); break;}
   } while (1==1);

   //after choosing the letter, determine size of the matrix
   if (temp_opt_local != '0')//((temp_opt_local >= 'a')&&(temp_opt_local <= 'z'))
   {
      siza=0;sizb=0;
      printf("\nWrite two numbers (first for number of rows, second for columns). Use space to");
      printf("\nseparate these two numbers. They must be integers between 1 and 25.");
      do
      {
         printf("\nThe size of the matrix: ");
         fflush(stdin); //very important line - it clears standard input
         error = scanf("%d %d",&siza,&sizb); //error becomes number of correctly read inputs
         printf("(%d)(%d) ",siza,sizb); //testing line
      } while ((error!=2)||(siza<0)||(siza>25)||(sizb<0)||(sizb>25));
   }
   printf("[siza %d, sizb %d]",siza,sizb); //testing line
}

int main(int argc, char *argv[])
{
   char chosen_opt;

   int i; //give the information that there are no owned matrices
   for (i=0;i<27;i++)
      matrix[i].owned=0;

   do     //choose the operation on matrix
   {
      chosen_opt = choose_opt();
      printf("Your choice: %c\n",chosen_opt);
      switch (chosen_opt)
      {
         case 'a': Func_a(); break;
         case 'b': printf("Now you own matrix nr7"); matrix[7].owned=1; break; //temporary option
         case 'c': printf("You don't own m nr7"); matrix[7].owned=0; break;    //temporary option
         case 'o': printf("See you later!"); break;
         default : printf("Under construction"); break;
      }
      printf("\n");
      getch();
   } while (chosen_opt!='o');

   return 0;
} 
Ostatnio zmieniony 11 sty 2008, o 22:52 przez kawafis44, łącznie zmieniany 3 razy.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] wczytywanie danych

Post autor: soku11 »

Napisz moze co zle dziala, bo przekladanie tego kodu jest troche czasochlonne jak sie nie wie co dokladnie nie dziala POZDRO
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] wczytywanie danych

Post autor: smiechowiec »

Moim zdaniem przy pobieraniu rozmiaru powinno być odwrotnie ze znakiem &

Kod: Zaznacz cały

         printf("
The size of the matrix: ");
         scanf("%d %d", &siza, &sizb);
         printf("(%d)(%d) ", siza, sizb); //testing line
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

[c] wczytywanie danych

Post autor: kawafis44 »

dopisałem na góze pierwszego postu dokładne wyjaśnienie problemu.
dodam, że korzystam z Bloodshed Dev-C++ z 2000-09-21, v. 2.95.2-1.
ps. czy nie potrzebuję dodać jeszcze innych bibliotek, bo nie chcę niespodzianek takich, jak teraz zmiana sposobu działania kodu po dodaniu conio.h .
pozdro i dzięki wielkie z góry za pomoc!
Ostatnio zmieniony 11 sty 2008, o 22:16 przez kawafis44, łącznie zmieniany 1 raz.
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[c] wczytywanie danych

Post autor: Undre »

na dobry początek to w scanf zjadłeś ampersandy
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] wczytywanie danych

Post autor: smiechowiec »

Jeśli nie musisz, nie korzystaj z conio, zamiast getch() używaj getchar().
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] wczytywanie danych

Post autor: soku11 »

Dokladnie napisal ci smiechowiec. To usunie twoj problem. BTW. Pod MinGW odrazu wywalilo mi z 5 warning-sow miedzy innymi w miejscach gdzie poprawil smiechowiec
BTW2. Czy aby na pewno jest cstdlib.h a nie stdlib.h ??

POZDRO
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

[c] wczytywanie danych

Post autor: kawafis44 »

conio mi się później przyda do zmiany kolorów interfejsu itd.
dodałem ten ampersand do scanf i usunąłem z prinft (musiałem wcześniej przez nieuwagę dopisać nie do tej linijki, co chciałem ), niestety w działaniu programu niczego to nie zmienia.
pozdro!
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[c] wczytywanie danych

Post autor: Undre »

Jak nie zmienia ? Kompiluje pod tym samym devem i daje rade
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

[c] wczytywanie danych

Post autor: kawafis44 »

ok, zmienia :).
teraz moje pytanie - dlaczego po dodaniu conio.h po wyborze opcji 'a' od razu wypisuje "You must choose the letter", skoro nic nie zostało wybrane, a bez conio tego nie wypisuje. I jak to poprawić teraz z coniem?
pozdro!
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[c] wczytywanie danych

Post autor: Undre »

Z tego co widze w całym programie masz jedno getch() na krzyż, dodałem biblioteke i nic takiego mi nie wyskakuje, coś pomijam ?
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

[c] wczytywanie danych

Post autor: kawafis44 »

znalazłem w programie trzy getch()
może wyjaśnię jeszcze raz. Uruchamiam program, wpisuję 'a'.
Bez conio.h - ostatnia linijka kończy się na "...(zero for exit)"
Z conio.h - przedostatnia linijka to "...(zero for exit)", ostatnia zaś "You mush choose the letter"
dwa różne działania, ten sam kod różniący się tylko o conio.h
pzdr!

ps. nawiasem mówiąc gdy wybieram opcję o, czyli wyjście, to bez conio czeka na wciśnięcie dowolnego klawisza, zaś z conio od razu wychodzi. jak zrobić, żeby czekał z conio? i co zmienić w kodzie, żeby z conio nie robić tych niepotrzebnych pustych linii?
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[c] wczytywanie danych

Post autor: Undre »

to może daj te wersje gdzie są getch() bo w pierwszym poście co innego jest nie ?
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

[c] wczytywanie danych

Post autor: kawafis44 »

pisząc, że są trzy miałem na myśli trzy w całym kodzie.
wrrzuciłem aktualny kod do pierwszego postu.
podejrzewam, że te puste linie mają coś wspólnego z getch() .
pozdro!

ps. tu jest wynik wykonania programu

pzdr!
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] wczytywanie danych

Post autor: soku11 »

Nie wiem o co ci chodzi... getchar(); pobiera znak i czeka na nacisniecie ENTERA. getch(); natomiast po wcisnieciu klawisza odrazu zwraca wartosc. Jesli wiec wcisniesz 'a' to ci odrazu przechodzi dalej, nie musisz potwierdzac tego ENTEREM. Jak chcesz, by czekano na enter to uzywaj getchar(); Nie wiem czy o to ci chodzilo... POZDRO
ODPOWIEDZ