program sumujący n liczb

0

Mam taki problem chce napisac program za pomoca ktorego bede mogl wybierac roznego rodzaju działania matematyczne. Po wpisaniu przez uzytkownika n liczb chce je powiedzmy dodac do siebie. Niestety nie do konca wiem jak zmusic pętle for do zatrzymywania sie by zaczekala ona az uzytkownik poda liczby ktore nastepnie trzeba zsumowac. Stoje przy tym :

#include <iostream>
#include <conio.h>

using namespace std;

main()

{
      int i;
      int suma = 0;
      int mnozenie;
      int dzielenie;
      int odejmowanie;
      int wynik;
      int wybor;
      int iloscLiczb;
      
      cout << "Program wykonuje roznego rodzaju dzialania.\n";
      cout << "Wybierz dzialanie:\n";
      cout << "Dodawanie = 1\n";
      cout << "Odejmowanie = 2\n";
      cout << "Mnozenie = 3\n";
      cout << "Dzielenie = 4\n";
      cin >> wybor;
      switch(wybor)
      {
                   case 1 :
                        cout << "Podaj ilosc liczb n:";
                        cin >> iloscLiczb;
                        for(i=1;i<=iloscLiczb;i++)
                        {
                             cout << "\nPodaj" << i << "liczbe";
                             suma=
                        }
                        break;
                        
                        default : 
                        cout << "Wybrales zly numer";
                        }
      
      
      
      
      getch();
      return 0;
}
0

spróbuj coś takiego:

#include <iostream>
#include <conio>

using namespace std;

int main()

{
      int i;
      int wynik = 0;
      int mnozenie;
      int dzielenie;
      int odejmowanie;
      int liczba;
      int wybor;
      int iloscLiczb;
     
      cout << "Program wykonuje roznego rodzaju dzialania.\n";
      cout << "Wybierz dzialanie:\n";
      cout << "Dodawanie = 1\n";
      cout << "Odejmowanie = 2\n";
      cout << "Mnozenie = 3\n";
      cout << "Dzielenie = 4\n";
      cin >> wybor;
      switch(wybor)
      {
                   case 1 :
                        cout << "Podaj ilosc liczb n:";
                        cin >> iloscLiczb;
                        for(i=1;i<=iloscLiczb;i++)
                        {
                             cout << "\nPodaj" << i << "liczbe";
                             cin >> liczba;
                             wynik+=liczba;
                        }
                        break;
                       
                        default :
                        cout << "Wybrales zly numer";
                        }
     
     
     
     
      getch();
      return 0;
}//reszta przypadkow w switch analogicznie

I jedna rzecz jeżeli w funkcji main() na samym końcu masz instrukcję

return 0

czy coś w tym stylu to funkcja musi zwracać określony typ wartości czyli w tym wypadku int. Po drugie jeżeli używasz konstrukcji using namespace std

 to przy dołączaniu plików nagłówkowych podawaj samą nazwę pliku bez <b>.h</b>
0
Vidharr napisał(a)

I jedna rzecz jeżeli w funkcji main() na samym końcu masz instrukcję

return 0

czy coś w tym stylu to funkcja musi zwracać określony typ wartości czyli w tym wypadku int.

problem wskazany poprawnie, ale wyjasnienie to bzdurka.
main ma okreslona sygnature i kropka. jedyne poprawne sygnatury main to:
void main() // przestarzala, nie nalezy uzywac. kompilator i tak zrobi z niej int main()
int main()
int main(int argc, char* argv[])
int main(int argc, char* argv[], char* envs[])

slowem - czy sie poda, czy sie nie poda, main jest zawsze typu INT.
co ciekawe - jesli nie napiszesz na koncu return 0 --- kompilator tez to sam dopisze;p

Po drugie jeżeli używasz konstrukcji

using namespace std

to przy dołączaniu plików nagłówkowych podawaj samą nazwę pliku bez .h

a to juz kompletna bzdura. using nie ma nic do rzeczy ze sciezka w #include
naglowek jaki jest, taki jest i nic go nie zmieni
jesli naglowek jest plikiem .h, MUSISZ #include bla.h
jesli naglowek jest plikiem bez .h, MUSISZ #include bla
to, jak sie nazywa plik naglowka zalezy tylko od standardu, czasem kompilatora i czasem od wersji biblioteki
<iostream> to <iostream> i tylko iostream. jesli kompilator dostarcza takze <iostream.h> to znaczy ze ktos komus chcial zrobic dobrze i staral sie byc debil-friendly, bo nikt nie powinien nigdy szukac wypaczenia o nazwie iostream.h *)

*) jest to czasem dyktowane zmianami w standardzie. ten konkretny naglowek kiedys rzeczywiscie nazywal sie iostream.h i stare programy nadal sie go spodziewaja. nie znaczy to jednak ze nowe powinny go uzywac

0

@quetzalcoatl:
Jeśli chodzi o wyjaśnienie pierwszego błędu to owszem może niezbyt profesjonalne. Pisząc to miałem na myśli dowolną funkcję ;) czyli wtedy wyjaśnienie jest słuszne ;] W wypadku main() o którym pisałem bierze w łeb ;)

Jeśli chodzi o using namespace std i biblioteki to napisałem tak na podstawie własnych doświadczeń z kompilatorami (głównie gcc i g++ pod linuxem, kompilatorów MS staram się nie używać gdyż nie zawsze są zgodne ze standardem ANSI C i C++ - sprawdzone i zweryfikowane choćby na operacjach przesunięcia bitowego).

Dzięki za poprawienie błędów w moich wyjaśnieniach

0

Vidharr, quetzalcoatl pokazał Ci, że nie znasz nawet zgodnego z ISO IEC 14882 zachowania main a Ty jeszcze śmiesz powoływać się na standard?!

Jeśli chodzi o using namespace std i biblioteki to napisałem tak na podstawie własnych doświadczeń z kompilatorami (głównie gcc i g++ pod linuxem, kompilatorów MS staram się nie używać gdyż nie zawsze są zgodne ze standardem ANSI C i C++ - sprawdzone i zweryfikowane choćby na operacjach przesunięcia bitowego).

Tak? A możesz udowodnić? Póki co lista niezgodności pomiędzy G++ a standardem jest dłuższa niż w przypadku kompilatora optymalizującego Microsoftu... Po drugie, Linuksem. Using nie ma nic wspólnego z kompilatorem, co najwyżej z Twoją mierną znajomością tematu - przed standardem nagłówki miały '.h' na końcu, przestrzeni biblioteki standardowej nie było, przyszedł standard - zrobiono. Stare nałówki są dla zachowania kompatybilności, mimo iż w skład ANSI ISO C++ nie wchodzą. W uproszczeniu - stary nagłówek jest równoważny using + standardowemu. Często wręcz nagłówki standardowe wyłącznie włączają 'niestandardowe' wewnątrz przestrzeni std tam, gdzie to możliwe.

Masz coś do przesunięć bitowych? Jak mnie pamięć nie myli to GCC odstawiał kiedyś cyrki z konwersjami niezgodne ze standardem, w codziennej pracy piszę w strict ISO pod Visualem i problemów nie zauważyłem, możesz podać przykład? A może mówisz o przesunięciach charów? Poczytaj co o signed\unsigned chara mówi standard.

Namnożyło się znawców standardu, co drugi temat to taki innych poucza, zgroza.

0

Nie chcę flejma wywoływać, ale pewien zaczyn zrobię, bo się nie mogę powstrzymać :] Pewien mądry człowiek, którego niestety z nami już nie ma pokazał mi prosty kod:

    int *value, *result;
    result = true ? NULL : NULL;
    result = true ? (value, NULL) : (value, NULL);
    result = true ? value,NULL : value,NULL;

przeczytaj jakie debilizmy na jego widok wypisuje "najstandardowszy" gcc 3.x.x
Rozszerzenia GNU klepią z nudów chyba, a parsera nie potrafią zrobić...

edit:
oooo, jak zaczynałem pisać, to klaczy nie widziałem - znaczy flejm już jest. I nie tylko flejm hm hm:)
// :) ;) - Cold

0

Dobra chlopaki dzieki za instrukcje odnosnie main'a itd ale troszke temat zboczyl na inny :
kod podany przez Vidharr niestety nie dziala tak jakbym chcial

zrobilem teraz cos takiego :

#include <iostream>
#include <conio.h>

using namespace std;

main()
{
     int i, n, wynik;
     
     cout << "Podaj ilosc liczb ktore chcesz dodac";
     cin >> n;
     for ( i=1;i<=n;i++);
     {
         cout << "Podaj" << i << "liczbe";
         cin >> n;
         wynik=wynik+n;
     }
     getch();
     return 0;
     }

niestety jak podaje pierwsza liczbe to wyskakuje mi wynik z pętli jako nastepna liczba moze ktos pomoc i wyjasnic jak tego uzyc poprawnie?

tak sie zastanawiam moze do wykonania tego zadania niezbedne sa tablice?

0

Nie nie są, potrzebne jest przeczytanie jakiegoś kursu c++ ;p

  1. Gdzie zerujesz zmienną wynik? Nigdzie, a powinieneś, bo tylko zmienne statyczne i globalne są zerowane z automatu, reszta zawiera jakieś dane.
  2. Zmieniasz zmienną z warunku, przez co "psujesz pętle" bo jak ktos sobie poda wewnątrz pętli w drugim obiegu np. 1 to program sprawdzi że i<=1 i pętle zakonczy. Zero logiki... Użyj innej zmiennej i już.
  3. Nie rozumiem po co ludzie dorzucaja całe conio.h tylko po to żeby użyć getch(); które dziala identycznie jak cin.get() z <istream> które i tak includują...
0

doszedłem do takiego czegos

#include <iostream>
#include <conio.h>

using namespace std;

main()
{
      int n;    // tutaj wpisuje ile chce pobrac liczb do pomnozenia
      int i;    // licznik petli
      int wynik; // wynik
      int liczby; // liczby ktore wpisuje do petli
      wynik=0; /// zeruje wynik i licznik petli
      i=0;
      cout << "Podaj ilosc liczb n";
      cin >> n; // wczytuje ile liczb chce pomnozyc
      

      for(i=1;i<=n;i++) // zaczynam od i=1 i i<=od ilosci liczb
      {
                       cout << "Podaj " << i << " liczbe";
                       cin >> liczby; // wczytuje liczby do petli
                       wynik=wynik*liczby; // mnoze wynik * liczby i wychodzi 0 ?
                       }
                       cout << wynik;
                       
                       getch();
                       return 0; // gdzie jest blad?
                       
                       }

gdy robie wynik=wynik+liczbywtedy wynik wychodzi poprawny niestety jak zmienie na wynik=wynik*liczby[
wtedy wyskakuje 0 nie wiem dlaczego ktos zna powod?

0

o_O a ile wg ciebie jest 0X ? Bo mnie uczyli ze 0 !
Podstawy algebry -> elementem neutralnym w zbiorze liczb rzeczywistych dla działania jakim jest mnożenie jest 1 a nie 0 bo
a
1=1a=a
(a przecież a
0=0 więc 0 elementem neutralnym nie jest)

Czyli w skrócie skoro chcesz mnożyć, to ustaw zmienna wynik=1;
(i jeśli w pętli ustalasz wartość i=1 to nie ma sensu "zerować" go wcześniej ;) ).

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