Wątek przeniesiony 2017-11-21 21:35 z C/C++ przez ŁF.

C++ Pocz. Programowania zadanie

0

Mam problem z zadaniem na programowanie. Prawie je ukończyłem ale program nie działał dokładnie tak jak jest w poleceniu. Coś zmieniłem ostatnio, nie pamiętam co dokładnie i teraz nawet menu nie działa. Moja wiedza z c++ jest jeszcze dość ograniczona, więc proszę o pomoc.

Moje zadanie to :

  1. Przepisz kod i zapoznaj się z działaniem programu
  2. Zmień kod programu tak, aby tablica była 20 elementowa typu całkowitego nieujemnego
  3. Wprowadź do 18-tego elementu liczbę 666 na stałe oraz nakaż użytkownikowi wprowadzenie
    pozostałych liczb w zakresie od 1 do 100
  4. Stwórz druga tablicę 20 elementową i wypełnij ją z poziomu użytkownika. Następnie
    wyświetl wynik reszty z dzielenia pomiędzy sumami liczb z tablic 1 i 2
  5. Wprowadź warunek, że jeśli reszta z dzielenia wynosi 1 program ma stworzyć tablicę 100
    elementową wypełnianą przez niego samego liczbami od 1 do 100 w przeciwnym razie tablica
    ma mieć 10 elementów z liczbami od 1 do 10. Tablice w każdym przypadku mają się
    wyświetlić.
  6. Stwórz menu wyboru na początku programu: Wciśnięcie 1 - przejście do wprowadzania liczb
    w tablice, 2 – Wypisanie na ekranie „Jesteś geniuszem” oraz spowodowanie powrót do
    menu, 3 – zakończenie programu.

Kod pocz.

#include <iostream>
using namespace std;
int main()
{
 int tablica[ 3 ];
 cout << "Podaj liczbe 1:";
 cin >> tablica[0];
 cout << "Podaj liczbe 2:";
 cin >> tablica[1];
 tablica[ 2 ] = 12345;
 cout << "Trzecia liczba (tablica[2) wynosi: " << tablica[2] << endl;
 int suma = tablica[0] + tablica[1] + tablica[2];
 cout << "Suma trzech liczb wynosi: " << suma << endl;
 return 0;

KOD który mam narazie

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <cstdlib>
#include <conio.h>
#include <time.h>

using namespace std;
unsigned int liczba[20];
int suma1=0,suma2=0;
char wybor;
int number[20];
unsigned int losowa1[100];
unsigned int losowa2[10];
int main()
{
    while(true)
    {


        cout << endl;
    cout <<"\n"<< "MENU GLOWNE"<<endl;
    cout <<"\n"<<"1.Wprowadzanie liczb"<<endl;
    cout <<"2.Komplement"<<endl;
    cout <<"3.Koniec"<<endl;

    cout<<endl;
    wybor=getch();
    system("cls");




    switch(wybor)
    {
   case '1':
       {
           for(int i=0; i<20; i++)
            {
                cout << "Podaj liczbe od 1 do 100: ";
                cin >> liczba[i];
                if (i=17)
                {
                    liczba[ 17 ] = 666;
                    cout<<"Liczba nr 18 to: 666"<<endl;
                }
                else
                {
                    if (liczba[i]>100)
                    {
                        cout<<"Miala byc liczba od 1 do 100!!!"<<endl;
                        liczba[i]=0;
                    }
                    else
                    {
                        cout << "Liczba nr "<<i+1<<" to: "<<liczba[i]<<endl;
                }
                }
                /*Co zrobic zeby probram pomial 18 szufladke
                i sam wpisal jej wartosc ? */
            }
            for(int k=0; k<20;k++)
            {
                cout << "Podaj liczbe od 1 do 100: ";
                cin >> number[k];
                if (number[k]>100)
                {
                    cout<<"Miala byc liczba od 1 do 100!!!"<<endl;
                    number[k]=0;
                }
                else
                {
                cout << "Liczba nr "<<k+1<<" to: "<<number[k]<<endl;
                }
            }
            suma1+=liczba[0]+liczba[1]+liczba[2]+liczba[3]+liczba[4]+liczba[5]+
           liczba[6]+liczba[7]+liczba[8]+liczba[9]+liczba[10]+liczba[11]+
           liczba[12]+liczba[13]+liczba[14]+liczba[15]+liczba[16]+liczba[17]+
           liczba[18]+liczba[19];
//Moge to skrócić pętlą ale nie chcialem sobie komplikowac zycia
            suma2+=number[0]+number[1]+number[2]+number[3]+number[4]+number[5]+
           number[6]+number[7]+number[8]+number[9]+number[10]+number[11]+
           number[12]+number[13]+number[14]+number[15]+number[16]+number[17]+
           number[18]+number[19];
           cout<<"Suma pierwszej tablicy: "<<suma1<<"\t"<<"Suma drugiej tablicy: "<<suma2<<endl;
           cout<<"Reszta z dzielenia tablic: "<<suma1%suma2<<endl;
           if (suma1%suma2==1)
           {
               for (int m=0;m<100;m++)
               {
               srand(time(NULL));
               losowa1[m]=rand()%100+1;
               cout<<losowa1[m]<<"\t";
               }
           }
               else
                {
                    for ( int n=0;n<10;n++)
                    {
                    srand(time(NULL));
                    losowa2[n]=rand()%10+1;
                    cout<<losowa2[n]<<"\t";
                    }
                }

       }
       break;
   case '2':
    cout<<"Jestes geniuszem!!";
    break;
   case '3':
   exit(0);

   default: cout<<"Miala byc cyfra od 1 do 3 !!";
    }
    }
 return 0;
}
0
//Moge to skrócić pętlą ale nie chcialem sobie komplikowac zycia

Miałeś na myśli ułatwić sobie życie? Ile czasu zajęło Ci inkrementowanie indeksu i dodawanie nowego elementu tablicy?

Przede wszystkim musisz nauczyć się zauważać części kodu które są takie same a wykorzystywane w kilku miejscach, np. sprawdzanie wejścia. Zauważ że

if ([jakas_zmienna] > 100)
{
	cout << "Miala byc liczba od 1 do 100!!!" << endl;
	number[k] = 0;
}

pojawia się 2 razy w kodzie w innych miejscach. Należy więc wydzielić taką oto funkcję, na przykład, w następujący sposób:

int get_number(int min, int max)
{
	int number;

	do
	{
		printf("Podaj numer od %d do %d: ", min, max);
		scanf("%d", &number); // Pobiera numer
	} while (number < min || number > max);

	return number;
}

I tak oto zamiast tego:

for(int i=0; i<20; i++)
{
	cout << "Podaj liczbe od 1 do 100: ";
	cin >> liczba[i];
	if (i=17)
	{
		liczba[ 17 ] = 666;
		cout<<"Liczba nr 18 to: 666"<<endl;
	}
	else
	{
		if (liczba[i]>100)
		{
			cout<<"Miala byc liczba od 1 do 100!!!"<<endl;
			liczba[i]=0;
		}
		else
		{
			cout << "Liczba nr "<<i+1<<" to: "<<liczba[i]<<endl;
		}
	}
}
for(int k=0; k<20;k++)
{
	cout << "Podaj liczbe od 1 do 100: ";
	cin >> number[k];
	if (number[k]>100)
	{
		cout<<"Miala byc liczba od 1 do 100!!!"<<endl;
		number[k]=0;
	}
	else
	{
		cout << "Liczba nr "<<k+1<<" to: "<<number[k]<<endl;
	}
}

Możemy osiągnąć to włączając sumowanie:

for (int i = 0; i < 20; i++)
{
	liczba[i] = get_number(1, 100);
	printf("Liczba numer %d to %d", i + 1, liczba[i]);
	suma1 += liczba[i];
}
for (int i = 0; i < 20; i++)
{
	number[i] = get_number(1, 100);
	printf("Liczba numer %d to %d", i + 1, number[i]);
	suma2 += number[i];
}

Co znów można byłoby przemienić w osobną funkcję.

Tam gdzie losujesz losowe liczby srand(time(NULL)); powinno być przed pętlami for, inaczej nie będzie działać.
Powiedz mi jeszcze

Wprowadź warunek, że jeśli reszta z dzielenia wynosi 1 program ma stworzyć tablicę 100
elementową wypełnianą przez niego samego liczbami od 1 do 100 w przeciwnym razie tablica
ma mieć 10 elementów z liczbami od 1 do 10. Tablice w każdym przypadku mają się
wyświetlić.

W takim razie trzeba ją stworzyć a nie wcześniej zadeklarować przed poznaniem wyniku dzielenia, tak?

0

Do czego potrzebna Ci funkcja losująca ? W zadaniu nic nie ma o losowych liczbach.
Moja propozycja:

#include <iostream>

using namespace std;

int funkcja()
{
    unsigned int tablica[ 20 ];
    unsigned int tablicadruga [ 20 ];
    int sumaPierwsza = 0;
    int sumaDruga = 0;
    int wynik = 0;

    tablica[17] = 666;

    cout << "Wypelnianie tablicy 1" << endl;
    for(int i=0;i<17;i++)
    {
        cout << "Wprowadz liczbe od 1 do 100" << endl;
        cin >> tablica[i];
    }
    for(int i=18;i<20;i++)
    {
        cout << "Wprowadz liczbe od 1 do 100" << endl;
        cin >> tablica[i];
    }

    cout << "Wypelnianie tablicy 2" << endl;
    for(int i=0;i<20;i++)
    {
        cout << "Wprowadz liczbe od 1 do 100" << endl;
        cin >> tablicadruga[i];
    }

    //SUMOWANIE TABLICY 1
    for(int i=0;i<20;i++)
        sumaPierwsza += tablica[i];

    //SUMOWANIE TABLICY 2
    for(int i=0;i<20;i++)
        sumaDruga += tablicadruga[i];

    wynik = sumaPierwsza%sumaDruga;

    cout << wynik << endl;

    if(wynik==1)
    {
       unsigned int tablicaTrzecia[ 100 ];
        for(int i=0;i<100;i++)
        {
           tablicaTrzecia[i] = i+1;
           cout << tablicaTrzecia[i] << endl;
        }
    }
    else if(wynik!=1)
    {
        unsigned int tablicaTrzecia [ 10 ];
        for(int i=0;i<10;i++)
        {
            tablicaTrzecia[i] = i+1;
            cout << tablicaTrzecia[i] << endl;
        }
    }
    return 0;
}

int menu()
{
     int wybor = 0;

    cout << "1 - Przejscie do wprowadzania liczb" << endl;
    cout << "2 - Wypisanie na ekranie: Jestes Geniuszem " << endl;
    cout << "3 - Zakonczenie programu" << endl;
    cin >> wybor;

    switch(wybor)
    {
        case 1: funkcja(); break;
        case 2: cout << "Jestes Geniuszem" << endl; menu(); break;
        case 3: return 0;
        default: cout << "Nie wybrales zadnej opcji" << endl;

    }
}

int main()
{
    menu();
    return 0;
}

0
atmal napisał(a):
Miałeś na myśli ułatwić sobie życie? Ile czasu zajęło Ci inkrementowanie indeksu i dodawanie nowego elementu tablicy?

Niewiele, przypuszczam że mniej jeśli napisałbym to tak jak ty. Chyba nawet jakoś tak próbowałem tylko że pojawiały się wtedy jakieś błędy w kompilacji. Ostatecznie zostawiłem tak

pojawia się 2 razy w kodzie w innych miejscach. Należy więc wydzielić taką oto funkcję, na przykład, w następujący sposób:
```c
int get_number(int min, int max)
{
	int number;

	do
	{
		printf("Podaj numer od %d do %d: ", min, max);
		scanf("%d", &number); // Pobiera numer
	} while (number < min || number > max);

	return number;
}

I tak oto zamiast tego:

for(int i=0; i<20; i++)
{
	cout << "Podaj liczbe od 1 do 100: ";
	cin >> liczba[i];
	if (i=17)
	{
		liczba[ 17 ] = 666;
		cout<<"Liczba nr 18 to: 666"<<endl;
	}
	else
	{
		if (liczba[i]>100)
		{
			cout<<"Miala byc liczba od 1 do 100!!!"<<endl;
			liczba[i]=0;
		}
		else
		{
			cout << "Liczba nr "<<i+1<<" to: "<<liczba[i]<<endl;
		}
	}
}
for(int k=0; k<20;k++)
{
	cout << "Podaj liczbe od 1 do 100: ";
	cin >> number[k];
	if (number[k]>100)
	{
		cout<<"Miala byc liczba od 1 do 100!!!"<<endl;
		number[k]=0;
	}
	else
	{
		cout << "Liczba nr "<<k+1<<" to: "<<number[k]<<endl;
	}
}

Możemy osiągnąć to włączając sumowanie:

for (int i = 0; i < 20; i++)
{
	liczba[i] = get_number(1, 100);
	printf("Liczba numer %d to %d", i + 1, liczba[i]);
	suma1 += liczba[i];
}
for (int i = 0; i < 20; i++)
{
	number[i] = get_number(1, 100);
	printf("Liczba numer %d to %d", i + 1, number[i]);
	suma2 += number[i];
}

Co znów można byłoby przemienić w osobną funkcję.

Nie wiedziałem że tak można,dzięki :)

Tam gdzie losujesz losowe liczby srand(time(NULL)); powinno być przed pętlami for, inaczej nie będzie działać.

W sensie losowanie jest w pętli for. Przed tą pętlą mam dać jeszcze jedną pętle ?

Powiedz mi jeszcze

Wprowadź warunek, że jeśli reszta z dzielenia wynosi 1 program ma **stworzyć** tablicę 100
elementową wypełnianą przez niego samego liczbami od 1 do 100 w przeciwnym razie tablica
ma mieć 10 elementów z liczbami od 1 do 10. Tablice w każdym przypadku mają się
wyświetlić.

W takim razie trzeba ją stworzyć a nie wcześniej zadeklarować przed poznaniem wyniku dzielenia, tak?

Po poznaniu wyniku dzielenia program ma stworzyć jedną z tablic i sam wypełnić

0

To w takim razie tam gdzie masz:

srand(time(NULL));
// ...
for (int m=0;m<100;m++)
{
	losowa1[m]=rand()%100+1;
	cout<<losowa1[m]<<"\t";
}

Musisz stworzyć tablicę:

int* random_numbers = new int[10]; // albo 100

for{int i = 0; i < 10; i++) // albo 100
{
	// Zapełnij tablicę
}

delete[] random_numbers;

Przy okazji - spróbuj pozbyć się zmiennych globalnych.

0
for (int m=0;m<100;m++)
{
    srand(time(NULL));
    losowa1[m]=rand()%100+1;
    cout<<losowa1[m]<<"\t";
}

i przede wszystkim wyjąć z pętli srand(time(NULL)), bo ta funkcja powinna być wywołana tylko raz
przed pierwszym użyciem losowania. Najlepiej na początku funkcji głównej.

0

Co do get_number to potrzebna jest do niego jakaś specjalna biblioteka czy w c++ brzmi ta funkcja inaczej?
Co oznacza * przy int ?
random_numbers - zmienna czy funkcja ?
new int[10]; - mam po prostu nazwać tą zmienną jak chce / (new) czy tak ma być?

0
  1. Nie i nie :D
    Sami piszemy tą funkcję nad main
int get_number(int min, int max)
{
	int number;

	do
	{
		printf("Podaj numer od %d do %d: ", min, max);
		scanf("%d", &number); // Pobiera numer
	} while (number < min || number > max);

	return number;
}

int main()
{
	// Głowna funkcja
}

I wtedy możemy używać ją z main.

    • oznacza wskaźnik. Gdy przekazujemy tablicę to tak naprawdę przekazujemy wskaźnik na pierwszy element.
  1. Zmienna
  2. new jest słówkiem kluczowym który pozwala dynamicznie zarządzać pamięcią, tutaj aby utworzyć tablicę typu int z 10 elementami.
    Od razu dodam że delete[] zwalniamy obszar pamięci wcześniej przydzielony za pomocą new.

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