• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program do wyliczania adresu podsieci

Cloud VPS
0 głosów
743 wizyt
pytanie zadane 28 stycznia 2016 w C i C++ przez Armando Obywatel (1,870 p.)

Witajcie,

Piszę program, który tak jak w tytule ma wyliczać adres podsieci po podaniu adresu IP oraz maski.
Utknąłem na etapie zamiany adresu IP oraz adresu maski na system binarny, a dokładniej na wyświetlaniu go po przeliczeniu na system dwójkowy. Mam problem z jego wyświetleniem. Wyświetlanie takie dla jednej liczby to nie problem gdyż wystarczy zapis

while(liczba) //jakaś liczba w systemie dziesiętnym
    {
        tab[i++]=liczba%2; // tab - tablica do której zapisujemy tą liczbę w systemie dwójkowym
        liczba/=2;  
    }

 ale nie mogę wpaść na pomysł jak to zrobić z użyciem tablic, gdyż każdy bajt adresu jest zapisany w innym indeksie tablicy. Chodzi o funkcję "oblicz()".

Proszę o pomoc i z góry dziękuję ;)

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;
//-----------------------------------------------------
void wczytaj(int *IP, int *maska)
{
    int w;
    do
    {
        system("CLS");
        cout<<"Podaj adres IP podajac po jednym bajcie:"<<endl;
        for(int i=0; i<4; i++)
        {
            cin>>IP[i];
        }
        system("CLS");
        cout<<"Podaj maske podajac po jednym bajcie:"<<endl;
        for(int i=0; i<4; i++)
        {
            cin>>maska[i];
        }
        system("CLS");
        cout<<"Adres IP: ";
        for(int i=0; i<4; i++)
        {
            cout<<IP[i];
            if((i==0)||(i==1)||(i==2)) cout<<".";
        }
        cout<<endl;
        cout<<"Maska: ";
        for(int i=0; i<4; i++)
        {
            cout<<maska[i];
            if((i==0)||(i==1)||(i==2)) cout<<".";
        }
        cout<<endl<<"Jesli wprowadzone dane sa prawidlowe wybierz cyfre 1"<<endl<<"Jesli nie - wybierz cyfre 0 i wprowadz ponownie dane"<<endl;
        cout<<"Twoj wybor: ";
        cin>>w;
    }
    while(w!=1);
}
//-----------------------------------------------------
void oblicz(int *IP, int *maska)
{
    int IPtab[1000], imask[1000], IPpom[4],Mpom[4];
    int x,Q;

    for(int i=0;i<4;i++)
    {
       IPpom[i]=IP[i];
       Mpom[i]=maska[i];
    }

    for(int i=0; i<4; i++)
    {
        x=0;
        while(IPpom[i])
        {
            IPtab[x++]=IPpom[i]%2;
            IPpom[i]/=2;
            if(i=0) Q=x;
            else continue;
        }
    }

    cout<<"Adres IP: ";
    for(int j=Q-1; j>=0; j--)
    {
       cout<<IPtab[j];
    }

    for(int i=0; i<4; i++)
    {
        x=0;
        while(Mpom[i])
        {
            imask[x++]=Mpom[i]%2;
            Mpom[i]/=2;
            if(i=0) Q=x;
            else continue;
        }
    }

    cout<<endl<<"Maska: ";
    for(int j=Q-1; j>=0; j--)
    {
       cout<<imask[j];
    }
    cout<<endl;
    system("PAUSE");
}
//-----------------------------------------------------
void wyswietl(int *IP, int *maska)
{
    system("CLS");
    cout<<"Adres IP: ";
    for(int i=0; i<4; i++)
    {
        cout<<IP[i];
        if((i==0)||(i==1)||(i==2)) cout<<".";
    }
    cout<<endl<<"Maska: ";
    for(int i=0; i<4; i++)
    {
        cout<<maska[i];
        if((i==0)||(i==1)||(i==2)) cout<<".";
    }
    cout<<endl;
    system("PAUSE");
}

//-----------------------------------------------------
int main()
{
    int w;
    int IP[4];
    int maska[4];

    do
    {
        system("CLS");
        cout << "1. Wczytaj adres IP" << endl;
        cout << "2. Wyswietl IP i maske" << endl;
        cout << "3. Oblicz maske podsieci" << endl;
        cout << "4. Zakoncz program" << endl;
        cin >> w;

        switch(w)
        {
        case 1: wczytaj(IP,maska); break;
        case 2: wyswietl(IP,maska); break;
        case 3: oblicz(IP,maska); break;
        }
    }
    while(w!=4);

    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 28 stycznia 2016 przez matiaso Obywatel (1,500 p.)
wybrane 28 stycznia 2016 przez Armando
 
Najlepsza
Nie wystarczy przypadkiem 32-elementowa tablica na adresy IPv4? Mowa o IPtab. Dodatkowo pętla wyświetlająca też powinna się wykonać 32 razy.

PS. jeśli ktoś podał 1 w adresie to w tablicy powinno być zapisane jako 00000001.
komentarz 28 stycznia 2016 przez Armando Obywatel (1,870 p.)
Masz rację, wystarczy 32-elementowa tablica. Co do wyświetlającej pętli to teraz wyświetla jakiś ciąg cyfr niezwiązanych z niczym.
komentarz 28 stycznia 2016 przez matiaso Obywatel (1,500 p.)
Wyświetla niezwiązane z niczym miejsce w pamięci. Zrób uczciwie tak pętle aby wykonała się dokładnie 8 razy i jeśli nie ma już niczego to niech zapełni zerami tak aby:
1 w adresie to w tablicy powinno być zapisane jako 00000001

2 to 00000010

i.t.d

Jak Ci dzisiaj nie wyjdzie to jutro na to zerknę dokładniej
komentarz 28 stycznia 2016 przez Armando Obywatel (1,870 p.)
OK, dzięki wielkie :)
komentarz 29 stycznia 2016 przez matiaso Obywatel (1,500 p.)

Musisz nauczyć się jeszcze debugowania, może nawet takiego prymitywnego.

while(IPpom[i])
        {
            IPtab[x++]=IPpom[i]%2;
            IPpom[i]/=2;
            if(i=0) Q=x;
            else continue;
        }

Sprawdź co przechowuje zmienna IPtab[x] po przypisaniu, sprawdź co ma zmienna Q. Może kolejna pętla nie wykona się, bo Q =0...

komentarz 29 stycznia 2016 przez Armando Obywatel (1,870 p.)
Nie ukrywam, że jestem początkującym koderem. Dzięki za uwagę ;)
0 głosów
odpowiedź 28 stycznia 2016 przez Melchior Obywatel (1,300 p.)
Poprostu mnóż od prawej razy 1, potem razy 10, razy 100  itd i to wszystko sumuj
komentarz 28 stycznia 2016 przez Armando Obywatel (1,870 p.)
Mógłbyś sprecyzować ? O którym fragmencie kodu mówisz ?
komentarz 28 stycznia 2016 przez Melchior Obywatel (1,300 p.)

Jesli dobrze zrozumialem to masz tablice typu int tab[5] {1,0,1,1,1} to zamienisz to na jedna liczbe np tak: 

int main()
{
	int sum = 0;
	int mnoznik = 1;
	int tab[5]{ 1,0,1,1,1 };
	for (int i = 4; i >=0; i--)
	{
		sum += tab[i] * mnoznik;
		mnoznik *= 10;
	}
	cout << sum;
	cin.get();
}

 

komentarz 28 stycznia 2016 przez Armando Obywatel (1,870 p.)

Nie do końca o to mi chodzi. Mam w tablicy IPpom[4] dla przykładu takie wartości {192.168.1.1}. Muszę najpierw zamienić każdy bajt na system binarny, czyli 192 = 11000000 i tak z trzema pozostałymi oraz z maską to samo. Problem w tym, że albo mam błąd w samym przeliczaniu na system dwójkowy:

for(int i=0; i<4; i++)
    {
        x=0;
        while(IPpom[i])
        {
            IPtab[x++]=IPpom[i]%2;
            IPpom[i]/=2;
            if(i=0) Q=x;
            else continue;
        }
    }

Albo w wyświetlaniu:

cout<<"Adres IP: ";
    for(int j=Q-1; j>=0; j--)
    {
       cout<<IPtab[j];
    }

 

Podobne pytania

0 głosów
1 odpowiedź 762 wizyt
0 głosów
2 odpowiedzi 1,127 wizyt

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...