Wyświetlanie liczb podzielnych przez 2 z użyciem funkcji – jak to zrobić dobrze?

0

Witam. Mam za zadanie napisać prosty program, który wyświetla liczby podzielne przez 2. Ma on być napisany przy pomocy funkcji.
Niestety nie umiem tego dobrze zrobić, gdyż program zwraca tylko jedną liczbę zamiast kilku. Proszę o pomoc.

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


int n,i,arr[100];

void wpisywanie()
{
	cout<<"Podaj ile chcesz wpisac liczb: ";
	cin>>n;

     for (i = 0; i < n; i++) {

		cout<<"Podaj "<<i+1<<" liczbe: ";
		cin>>arr[i];
	}
}

int dzielenie()
{
	for (i = 0; i < n; i++) {

	  if (arr[i]%2==0) {

		 return   arr[i];

	  }
	}
}


int main ()
{

	wpisywanie();
	cout<<"Liczby podzielne bez reszty przez 2 to: "<<dzielenie()<<endl;

	getch();
	return 0;
}
1

Nie potrzebujesz do tego zadania tablicy. Nie ucz sie robic globalnych zmiennych bo to bardzo zly nawyk.

Rozbijaja sobie problemy na mniejsze ktore mozesz testowac osobno i implementuj jeden po drugim.
U ciebie problemy to moga byc:

  1. Wczytanie od uzytkownika
  2. Wyswietlenie

Jeden problem jedna funkcja. Staraj sie robic tak zeby funkcje byly mozliwie male bo wtedy jestes w stanie je testowac osobno :)

#include <stdio.h>
#define DIVIDER 2
#define LIMIT 200


void getAmountFromUser(int *amount)
{
	printf("Ile liczb chcesz wypisac?\n");
	scanf("%d", amount);
}

void printNumbers(int amount)
{
    if (amount > LIMIT) {
        amount = LIMIT; // max limit
    }

    for (int i=1;i<=amount*DIVIDER;i++) {
        if (i % DIVIDER == 0) {
            printf(" %d ", i);
        }
    }
}

int main(void)
{
	int amount;

    getAmountFromUser(&amount);

    printf("Liczby podzielne przez 2 to: ");
    printNumbers(amount);
    printf("\n");
	return 1;
}
1

Wow ziomuś, pojechałeś, cztery pliki nagłówkowe.

0

@enedil: Co tutaj zepsułem?

#include <iostream>
#include <vector>


const int DIVIDER = 2;
const int LIMIT = 200;


void getAmountFromUser(int &amount, std::vector<int> *inputArray)
{
    int tmp;

	std::cout<<"Ile liczb chcesz wypisac?"<<std::endl;
	std::cin>>amount;

	amount = std::min(amount, LIMIT);
    std::cout<<"Podaj "<<amount<<" licz zatwierdzajac kazda klawiszem ENTER"<<std::endl;
	for (int i=0; i<amount; i++) {
        std::cin>>tmp;

        inputArray->push_back(tmp);
	}
}

void printNumbers(std::vector<int> &inputArray)
{
    for(auto value: inputArray) {
        if (value % DIVIDER == 0) {
            std::cout<<" "<<value<<" ";
        }
    }
}

int main(void)
{
	int amount;
    std::vector<int> enteredNumbers;

    getAmountFromUser(amount, &enteredNumbers);


    std::cout<<"Liczby podzielne przez 2 to: ";
    printNumbers(enteredNumbers);
    std::cout<<std::endl;
	return 1;
}

0

Dzięki za pomoc. Muszę tylko powoli to przeanalizować, bo nie do końca rozumiem jak działa ten program. Nie dało by się dopisać po prostu czegoś do programu który ja napisałem, żeby wyświetlał wszystkie liczby podzielne przez 2 zamiast jednej?

1
daniel1302 napisał(a):

@enedil: Co tutaj zepsułem?

#include <iostream>
#include <vector>


const int DIVIDER = 2;
const int LIMIT = 200;


void getAmountFromUser(int &amount, std::vector<int> *inputArray)
{
    int tmp;

	std::cout<<"Ile liczb chcesz wypisac?"<<std::endl;
	std::cin>>amount;

	amount = std::min(amount, LIMIT);
    std::cout<<"Podaj "<<amount<<" licz zatwierdzajac kazda klawiszem ENTER"<<std::endl;
	for (int i=0; i<amount; i++) {
        std::cin>>tmp;

        inputArray->push_back(tmp);
	}
}

void printNumbers(std::vector<int> &inputArray)
{
    for(auto value: inputArray) {
        if (value % DIVIDER == 0) {
            std::cout<<" "<<value<<" ";
        }
    }
}

int main(void)
{
	int amount;
    std::vector<int> enteredNumbers;

    getAmountFromUser(amount, &enteredNumbers);


    std::cout<<"Liczby podzielne przez 2 to: ";
    printNumbers(enteredNumbers);
    std::cout<<std::endl;
	return 1;
}

  1. Zmienna LIMIT jest teraz całkowicie zbyteczna.
  2. Zmienna DIVIDER powinna być imo argumentem funkcji printNumbers.
  3. printNumbers powinna przyjmować referencję na const std::vector<int>.
  4. getAmountFromUser powinna zwracać wektor, a nie operować na wskaźniku (a jeśli już, to powinien przyjąć referencję, nie wskaźnik).
  5. amount nie powinna być przekazywana przez referencję, w końcu na wyjściu będzie wektor o odpowiednim rozmiarze (więc zmienna jest zbędna).
  6. Nazwa zmiennej tmp nic nie mówi o jej przeznaczeniu. Ponadto jest ona zbędna, bo wczytywanie można zrealizować tak:
std::copy_n(std::istream_iterator<int>(std::cin), amount, std::back_inserter(inputArray));
0

@enedil: :>

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

unsigned getAmountNumber()
{
    unsigned amount;
	std::cout<<"Ile liczb chcesz wypisac?"<<std::endl;
	std::cin>>amount;

    return amount;
}

std::vector<int> getNumbersFromUser(unsigned amount)
{
    std::vector<int> inputArray;

    inputArray.reserve(amount);

    std::cout<<"Podaj "<<amount<<" licz zatwierdzajac kazda klawiszem ENTER"<<std::endl;
	std::copy_n(std::istream_iterator<int>(std::cin), amount, std::back_inserter(inputArray));

	return inputArray;
}

void printNumbers(std::vector<int> &inputArray, int divider)
{
    for(auto value: inputArray) {
        if (value % divider == 0) {
            std::cout<<" "<<value<<" ";
        }
    }
}

int main(void)
{
    const int divider = 2;
    auto enteredNumbers = getNumbersFromUser(getAmountNumber());


    std::cout<<"Liczby podzielne przez 2 to: ";
    printNumbers(enteredNumbers, divider);
    std::cout<<std::endl;
	return 1;
}

0

W tym przypadku to chyba lepiej się spisze for_each_n, bo nie ma potrzeby tworzyć dodatkowego wektora na wpisane liczby

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[])
{
    cout << "Ile liczb chcesz wpisac: ";
    int n;
    cin >> n;
    vector<int> results;
    for_each_n(istream_iterator<int>(cin), n, [&](int val) {
        if (val % 2 == 0)
            results.push_back(val);
    });
    cout << "Liczby podzielne przez 2 to: ";
    copy(results.begin(), results.end(), ostream_iterator<int>(cout, " "));
    return 0;
}

A jeśli ma być z użyciem copy_n to później można zastosować remove_if

copy_n(istream_iterator<int>(cin), n, back_inserter(values));
auto valid_end = remove_if(values.begin(), values.end(), [](int val) {
  return val % 2 != 0;
});
copy(values.begin(), valid_end, ostream_iterator<int>(cout, " "));

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