Tablice c++ jak wypisac z tabeli typu double tylko liczby całkowiete

0

Witam
Mam do napisania do którego polecenie wygląda następująco
Napisz program, który z 10-elementowej tablicy wypisze tylko liczby całkowite.

	srand(time(NULL));                                    
    double tab[n]; 
    for(int i=0;i<n;i++)
    {
            tab[i] = rand()%901/100.f; 
            cout<<tab[i]<<" ";
    
    cout<<endl;
    
    for(int i=0;i<n;i++)
    {
        if(tab[n])
                cout<<tab[i]<<" "; 
            else
                cout<<"W tym zbiorze nie ma liczby całkowitej";
    } 
                    
    cout<<endl;
       
    system("pause");
    
    return 0;

Największym problemem jest wypisanie z tej tablicy liczb całkowitych

0

Sory jestem nowy a bardzo mi zależny na pomocy w tym zadaniu

3

Sprawdź czy zaokrąglona wartość jest równa wartości w tablicy (czy round(x) == x) - jeśli tak, to jest całkowita.

0

nie do końca rozumiem, dopiero zaczynam tablice

0

To nie ma żadnego związku z tablicami. Po czym poznajesz, że liczba jest całkowita

2

Potestuj czy tak da radę, przykładowa funkcja:

#include <cmath>
#include <iostream>

int isInteger(double x) {
	return round(x) == x;
}


int main() {
	double a = 1.001;
	double b = 1e0;
	std::cout << isInteger(a) <<"\n"; // -> 0
	std::cout << isInteger(b) <<"\n"; // -> 1
}

Tą funkcja "Potraktuj" w pętli tablicę.
https://www.cplusplus.com/reference/cmath/round/

0

screenshot-20200510224938.png

0

Ostatnie pytanie czy dało by się przerobić ten program na zgodny z treścią zadania
screenshot-20200510230410.png

0

Tak. W tym przypadku możesz wypisać wszystkie liczby, bo wszystkie są całkowite.

1

Na przykład:

#include <cmath>
#include <iostream>

int isInteger(double x) {
	return round(x) == x;
}


int main() {
	double tab [] = {1.01, 1, 2e0, .0101};
	for (int i = 0; i < 3; ++i) {
		if (isInteger(tab[i]))
				std::cout << tab[i] << "\t"; // -> 1 2
	}
	std::cout <<"\n";
}
0

#include<iostream>
#include<cstdlib>

using namespace std;

int main()
{
const int i = 10;

double tab[i]={0,1.4,2,3,4,5.6,6.2,7,8.4,9};
for(int i=0;i<10;i++)
if(tab[i]%2==0)
cout<<tab[i]<<" ";

cout<<endl;
return 0;
}

2

Tak mylę, że kod powinien zależeć od tego jak definiujesz liczbę całkowitą. Jak tak, że w reprezentacji binarnej nie ma dokładnie nic po przecinku, to kod wyżej jest ok. Ale możesz chcieć też przymykać oko na pewne odchylenia.

Można napisać kod, który z matematycznego punktu widzenia da liczbę całkowitą, ale jak to dasz prockowi, to się okaże, że masz 'dziwne' artefakty po przecinku. Wtedy może przydać się porównywanie abs(a-b) < epsilon):

#include <cmath>
#include <iostream>

int isInteger(double x) {
    return round(x) == x;
}


bool isIntegerEpsilon(double x, double epsilon) {
    return std::abs(round(x) - x) < epsilon;
}

int main() {
    auto v = 0.;
    for (auto i = 0u; i < 10; ++i) {
        v += 1./10.;
    }
    
    std::cout << v << " -> " << isInteger(v) << "\n";
    std::cout << v << " -> " << isIntegerEpsilon(v, 0.00001) << "\n";
}

Wypisuje (na ideone, C++14):

1 -> 0
1 -> 1

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