Wpisywanie znaków w tabele

0

witam to mój pierwszy post na forum.
jestem w trakcje robienia kalkulatora i brakuje mi jednej rzeczy.
Wiedz jak zrobić, że jak użytkownik (używam Ubuntu) wpisuje w terminal 2+254+34=
to program ma wpisać w pierwszą tabele liczby udzielone znakami, a w drugą znaki udzielone liczbami.
ma to wyglądać mniej więcej tak:
liczby[0]=2
znaki[1]=+
liczby[1]=254
znaki[1]=-
.
.
.
oczywiście int, char itp. musi być.
Proszę o szybką odp.

0

a wiesz ile tego będzie?

scanf("%d%c",&liczby[i],&znaki[i]);

Ale lepiej poczytaj sobie o ONP.

0

no nie i właśnie o to chodzi.
Ale wiem że zakonczy się '=' lub znakiem pustym wiedz by można walnąć taką pętle "i zwiększaj o 1 do pÓÓÓÓki nie dojdzie do ="
to jak to zapisać

0

o_O

vector<int> liczby;
vector<char> znaki;
do
{
  int liczba;
  char znak;
  cin>>liczba>>znak;
  liczby.push_back(liczba);
  znaki.push_back(znak);
}while(znak != '=');
0

Ale ten program ciągle pyta się użytkownika o nowe znaki i ja to wiem jak zrobić, ale jest to troszkę prymitywne.

Chodzi mi o to że osoba RAZ wpisze działanie a program robi swoje czyli.
Rozgranicza tekst który wpisał na znaki i na liczby.
Liczby zapisuje w tabeli liczby, a znaki w znaki.
tworzy on nowe komórki tabeli dopóki któraś z komórek tabeli znaki nie będzie równa '=' bądz '/o'

0
  1. Naucz się pisać PÓKI
  2. Z łaski swojej zamiast snuć swoje domysły i wynurzenia skorzystać z rozwiazania podanego przeze mnie, bo robi DOKŁADNIE to o czym piszesz. Nie mogłes łaskawie skompilować? Jak już piszę jakiś kod to najprawdopodobniej powinien on działać (w tym powyzej jest mały błąd, bo nie chciało mi się testować)
    Tu masz działającą wersję która zapisuje liczby i znaki w osobnych vectorach.
    Użytkownik moze wpisac sobie działanie jakie chce a na koniec dać enter.
#include <iostream>
#include <vector>
using namespace std;

int main()
{
vector<int> liczby;
vector<char> znaki;
int liczba;
char znak;
do
{
  cin>>liczba>>znak;
  liczby.push_back(liczba);
  znaki.push_back(znak);
}while(znak != '=');

  return EXIT_SUCCESS;
}

0

Przepraszam.
To jak w dalszej części programu będzie zapisywane to
jako znaki[1], znaki[2] itp.
czy jak?

Zrobiłem taki program

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    vector<int> liczby;
vector<char> znaki;
int liczby;
char znak;
do
{
  cin>>liczba>>znak;
  liczby.push_back(liczby);
  znaki.push_back(znak);
}while(znak != '=');

  return EXIT_SUCCESS;
  
    int a;
while(znaki[a];znaki[a]!='='){
switch(znaki[a]{
                case '*': liczby[a-1]*liczby[a]=liczby[a]
                break;
                      case ':': liczby[a-1]:liczby[a]=liczby[a]
                      break;
                      case '-':liczby[a-1]-liczby[a]=liczby[a]
                      break;
                      case '+':liczby[a-1]+liczby[a]=liczby[a]
                      break;
                      }
                      ++a
                      }

return 0;
}

Z góry dzięki za poświęcony czas

</ort>
0

Przepraszam, ale bardzo nie lubie odpowiadać ignorantom. Skoro includowalem <vector> to widocznie po coś on tam był, to raz. Dwa, naucz się podstaw, bo bez tego ani rusz. Dopisywanie czegokolwiek w main() po return nie jest zbyt sensownym rozwiązaniem. Poza tym co to niby jest:

liczby[a-1]+liczby[a]=liczby[a]

o_O ?? Wiesz że w programowaniu ROBI różnicę czy coś jest po prawej czy lewej stronie równości?
Można napisać x=5 ale NIE WOLNO 5=x. Czemu? Bo pierwszy zapis oznacza: "wpisz do zmiennej X wartość 5", a drugi oznaczałby "przypisz liczbie 5 wartość zmiennej X". Widzisz brak logiki?
Póki nie opanujesz absolutnych podstaw nie licz na więcej moich rad.

0

no właśnie się uczę i muszę zrobić taki kalkulator na zajęcia (mam 16l)
byś mógł go poprawić, jak zechcesz.
Bo muszę go mieć na jutro

0
#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<int> liczby;
  vector<char> znaki;
  int liczba;
  char znak;
  do
    {
      cin>>liczba>>znak;
      liczby.push_back(liczba);
      znaki.push_back(znak);
    }
  while (znak != '=');

int i=1;
  while (i<znaki.size() && znaki[i-1]!='=')
    {
      switch (znaki[i-1])
      {
      case '*':
        liczby[i]=liczby[i-1]*liczby[i];
        break;
      case ':':
        liczby[i]=liczby[i-1]/liczby[i];
        break;
      case '-':
        liczby[i]=liczby[i-1]-liczby[i];
        break;
      case '+':
        liczby[i]=liczby[i-1]+liczby[i];
        break;
      }
      i++;
    }
  cout<<liczby[i-1];
  return EXIT_SUCCESS;
}

pamiętaj ze on dzieli za pomocą dzielenia całkowitego, tzn 3/2=1 i 1/2=0 (tylko część całkowita dzielenia). Jeśli chcesz zeby było inaczej to zamiast
vector<int> liczby daj vector<double> liczby
Poza tym on nie bierze pod uwagę kolejności działań (2+2*2 == 8)

0

coś program źle działa
bo jak dałem 2+2*2 to wyszło 8
co jest źle?

0

i on chyba nie uwzglednia przypadu gdy wejscie konczy sie pustym znakiem, bo wtedy w wektorze dzialan powinien byc jeden znak i petla sie w ogóle nie wykona

0

to mniejsza z tym ale dla czego wychodzi błędny wynik skoro w teorii jet ok

0

ale na moim kalkulatorze tez wychodzi 8

0

no i jest źle bo powinno być 6
a co się wpisuje aby wstrzymać program cin.get();?
bo u mnie to nie działa

0

@pala2222: Bo w tym kodzie nie ma niczego, co brałoby poprawkę na kolejność działań. Pisząc kod "mówisz" do "maszyny", głupiej sterty przetworzonego piasku ;-P, która wykona to, co jej każesz, kazałeś tej maszynie wziąć pod uwagę prawidłową kolejność działań? Odpowiem za Ciebie: nie. Dlatego o takie sprawy musi zadbać użytkownik.

0

zeby wstrzymac program najlepsze jest getch(), tylko musisz zainkludowac biblioteke conio.h

0

A to mogę jakoś krotko zapisać żeby sprawdzał całą tabele czy w niej nie ma np. * a potem wypisał w której jest on komórce

0

Mógłbyś, ale nie umiesz. Zapomnij o kolejności działań, skoro ty ledwo umiesz hello world napisac. A ja za darmo też ci tego nie będę pisał, nie zadali ci tego z dzisiaj na jutro...
getch() ssie. Użyj cin.get();

0

już więcej wam d**y zawracać nie będę
ale poprawiłem program i ciągle wyskakują mi błędy w ostatniej lini przy kompilacji

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<int> liczby;
  vector<char> znaki;
  int liczba;
  char znak;
  do
    {
      cin>>liczba>>znak;
      liczby.push_back(liczba);
      znaki.push_back(znak);
    }
  while (znak != '='); 
  int i=1;
  while (i<znaki.size() && znaki[i-1]!='=')
    {
      if(znaki[i-1]=='*' || znaki[i-1]==':'){
            switch (znaki[i-1])
      
      case '*':
        liczby[i]=liczby[i-1]*liczby[i];
        break;
      case ':':
        liczby[i]=liczby[i-1]/liczby[i];
        break;
}            
      i++;
    }
    while (i<znaki.size() && znaki[i-1]!='=')
        if(znaki[i-1]=='-' || znaki[i-1]=='+'){
            switch (znaki[i-1])
      
      case '-':
        liczby[i]=liczby[i-1]-liczby[i];
        break;
      case '+':
        liczby[i]=liczby[i-1]+liczby[i];
        break;
        }
        ++i
        }
    
  cout<<liczby[i-1];
  return EXIT_SUCCESS;
}

0

to wklej blad i wersje kompilatora to co sie wymysli

0

Zamień EXIT_SUCCESS po prostu na 0.

0

Proszę skompilujcie sobie
niby wszystko jest ok, ale jak wpisze równanie to nic sięnie dzieje

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<double> liczby;
  vector<char> znaki;
  int liczba;
  char znak;
  do
    {
      cin>>liczba>>znak;
      liczby.push_back(liczba);
      znaki.push_back(znak);
    }
  while (znak != '='); 
  int i=1;
  while (i<znaki.size() && znaki[i-1]!='=')
    {
      if(znaki[i-1]=='*' || znaki[i-1]==':'){
            switch (znaki[i-1]){
      
      case '*':
        liczby[i]=liczby[i]*liczby[i];
        break;
      case ':':
        liczby[i]=liczby[i-1]/liczby[i];
        break;
}          
}  
      i++;
    }
 i=1;
    while (i<znaki.size() && znaki[i-1]!='=')
    {
        if(znaki[i-1]=='-' || znaki[i-1]=='+'){
            switch (znaki[i-1])
      {
      case '-':
        liczby[i]=liczby[i-1]-liczby[i];
        break;
      case ':':
        liczby[i]=liczby[i-1]/liczby[i];
        break;
}
}
}
  cout<<liczby[i-1]<<endl;
  return 0;

}
0

Dzieje się. Wyświetla się wynik, a potem program się zakańcza i okno konsoli zamyka.

0

to ja mam coś źle z kompem.
A wynik jest poprawny?

0

Ty masz coś źle z umiejętnością programowania, nie z kompem.
Dodaj na końcu (przed return 0, bo pewnie dodałbyś za nim...)

cin.sync();
cin.get();
0

Nie mam pojęcia dla czego wychodzi błędny wynik

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<int> liczby;
  vector<char> znaki;
  int liczba;
  char znak;
  do
    {
      cin>>liczba>>znak;
      liczby.push_back(liczba);
      znaki.push_back(znak);
    }
  while (znak != '='); 
  int i=1;

                 while (i<znaki.size() && znaki[i-1]!='='){
      if(znaki[i-1]=='*' || znaki[i-1]==':'){
            switch (znaki[i-1]){
      
      case '*':
        liczby[i-1]=liczby[i-1]*liczby[i];
               do
    {
                 int a=i;
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
        a++;
    }
  while (znak != '='); 
  i++;
        break;
      case ':':
        liczby[i-1]=liczby[i-1]/liczby[i];
        do
    {
                int a=i;
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
        a++;
    }
  while (znak != '='); 
  i++;
        break;
}        
}  
      i++;
    }
 i=1;
    while (i<znaki.size() && znaki[i-1]!='='){
        if(znaki[i-1]=='-' || znaki[i-1]=='+'){
            switch (znaki[i-1]){
      case '-':
        liczby[i-1]=liczby[i-1]-liczby[i];
                do
    {
                 int a=i; 
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
        a++;
    }
  while (znak != '='); 
  i++;
        break;
      case ':':
        liczby[i-1]=liczby[i-1]/liczby[i];
                do
    {
                   int a=i;
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
        a++;
    }
  while (znak != '='); 
  i++;
        break;
}
}
i++;
}
  cout<<liczby[i]<<endl;
  cin.sync();
cin.get();
  return 0;

}
0

Ale ja wiem. Bo problemu kolejności wykonywania działań nie możesz ominąć w tak prymitywny sposób.
Musiałbyś mieć te dane przechowywane na liście żeby takie cuda robić.
POMYŚL!
Jak masz np.
2+22+2=
To twój program znajdzie * i wykona 2
2 a wynik wpisze w miejsce pierwszej 2 czyli mamy:
w tablicy z liczbami: 2,4,2,2 (tamta druga dwójka z mnożenia nadal tam jest)
Rozumiesz już skąd bląd?
Co więcej, działań na stosie jest teraz mniej niż trzeba aby policzyć to wyrażenie wiec w ogóle cuda ci to policzy, ale na pewno nie wpisane działanie.

Zrozum ze ZANIM zacznie sie pisać kod, trzeba PRZEMYŚLEĆ rozwiązanie i przetestować je na kartce choćby...

0

Pochwale się swoim programem.
Jak ktoś zobaczy że wynik się nie zgadza proszę o info.

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<int> liczby;
  vector<char> znaki;
  int liczba;
  char znak;
  do
    {
      cin>>liczba>>znak;
      liczby.push_back(liczba);
      znaki.push_back(znak);
    }
  while (znak != '=');
  int i=0;
  int a;

                 while (i<znaki.size() && znaki[i]!='='){
      if(znaki[i]=='*' || znaki[i]==':'){
            switch (znaki[i]){
     
      case '*':
        liczby[i+1]=liczby[i]*liczby[i+1];
       a=i-1;
               do
    {
        a++;       
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
        
    }
  while (znaki[a] != '=');

        break;
      case ':':
        liczby[i+1]=liczby[i]/liczby[i+1];
        a=i-1;
        do
    {
          a++;
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
       
    }
   while (znaki[a] != '=');
        break;
}       
} 
      if(znaki[0]!= '*' && znaki[0]!= ':' && znaki[0]!= '='){
              ++i;
              }
    }
      i=0;
      while (i<znaki.size() && znaki[i]!='='){
        if(znaki[i]=='-' || znaki[i]=='+'){
            switch (znaki[i]){
      case '-':
        liczby[i+1]=liczby[i]-liczby[i+1];
        a=i-1;
                do
    {
          a++;      
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
    
    }
while (znaki[a] != '=');
        break;
      case '+':
        liczby[i+1]=liczby[i]+liczby[i+1];
        a=i-1;
                do
    {
              a++;    
      liczby[a]=liczby[a+1];
        znaki[a]=znaki[a+1];
  
    }
 while (znaki[a] != '=');
        break;
}
}
   if(znaki[0]!= '+' && znaki[0]!= '-' && znaki[0]!= '='){
              ++i;
              }
}
    
    cout<<liczby[0]<<endl;
  cin.sync();
cin.get();
  return 0;

}
0

Przesuwanie tablicy o jedno miejsce w tył to dość kosztowna operacja, ale powinno załatwić sprawę. Nie chciałem go proponowac bo to mało optymalne rozwiązanie...
Rzuciłem okiem na kod i powinien działać poprawnie.

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