Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.88
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
#1

Калькулятор IP - C++

05.10.2009, 20:21. Просмотров 4324. Ответов 30
Метки нет (Все метки)

Нужно написать программку, которая обрабатывает значения ip и маски, и выводит информацию (число сетей, узлов и т.д.). В связи с небольшим опытом программирования, не знаю как интерпретировать ip на языке, не знаю как записать и где сохранить. Какие могут быть варианты, с учетом более удобной дальнейшей работы с адресом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2009, 20:21     Калькулятор IP
Посмотрите здесь:

Калькулятор - C++
Помогите пожалуйста сделать в этом калькуляторе скобки. #include <iostream> #include <stdlib.h> #include <string.h> #include...

Калькулятор - C++
Пишу калькулятор. Прошу помощи. Вот мой код #include <iostream> #include <locale.h> #include <string.h> #include <cmath> using...

Калькулятор на С++ - C++
Сделал калькулятор, работает нормально, но программа считает только два числа за раз: >>Картинка<< , как сделать так чтоб пользователь...

Калькулятор - C++
Вот сам калькулятор: #include<conio.h> #include<locale.h> #include<stdio.h> #define END '0' #define ERROR -1 #include<stdlib.h>...

Калькулятор - C++
Написал примитивный калькулятор: #include <iostream> #include <locale.h> #include <conio.h> using namespace std; int...

Калькулятор - C++
Есть такое условие: If(b=='+') s=a+b; как сделать так чтобы я мог додавать не два числа а a+b+...+n

C++ Калькулятор - C++
Начал практиковаться в C++ помогите понять почему не работает мой калькулятор? Вроде все правильно,ввожу числа а он просто отключается....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 16:39  [ТС]     Калькулятор IP #16
Цитата Сообщение от odip Посмотреть сообщение
Выделить и пропарсить 4 числа.
Например можно использовать функцию strtol().
long int strtol ( const char * str, char ** endptr, int base );
Это прототип функции. Т.е. как я понял, получает функция три параметра
str - указатель на нашу стркоу
endptr - указатель на символ, который считается концом строки ? Почему ти идет как указатель на указатель на char ?
base - параметр, определяющий систему исчисления ?

Что не так понял ?

Добавлено через 56 секунд
Цитата Сообщение от odip Посмотреть сообщение
Используй inet_ntoa(), inet_aton()
Я просто разобраться хочу в работе функций
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
12.10.2009, 16:57     Калькулятор IP #17
2Lorr: У тебя какой компилятор ?
Открой описание функции и почитай что делает.
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 17:28  [ТС]     Калькулятор IP #18
Цитата Сообщение от odip Посмотреть сообщение
2Lorr: У тебя какой компилятор ?
Открой описание функции и почитай что делает.
Dev и VS8 без help'a

Нашел описание, как работает в общих чертах понял (strtol);
В описании пример был, не понял один момент.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
  char * pEnd;
  long int li1, li2, li3, li4;
  li1 = strtol (szNumbers,&pEnd,10);
  li2 = strtol (pEnd,&pEnd,16);
  li3 = strtol (pEnd,&pEnd,2);
  li4 = strtol (pEnd,NULL,0);
  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
  return 0;
}
При запуске программы, создается строка и указатель на char и четыре переменных, которым будут присвоены результаты работы функции strtol.
Встроке
li1 = strtol (szNumbers,&pEnd,10); функции передается строка символов, которую необходимо интерпретировать в число, указатель, по адресу в котором запишется символ, на котором остановлено преобразование строки, и идентификатор системы исчисления.
li2 = strtol (pEnd,&pEnd,16); но почему в этой строке в качестве строки с символами, которые нужно интерпретировать в число, передается по сути символ, на котором было остановлено преобразование в первый вызов функции ?
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
12.10.2009, 18:27     Калькулятор IP #19
http://opennet.ru/man.shtml?topic=st...ry=3&russian=0
http://www.codenet.ru/progr/cpp/sprd/strtod_strtoul.php

Ты неправильно делаешь !!!
Правильно как у меня:
C
1
2
3
4
d1= strtol( ptr, &endptr, 10 );
ptr= endptr;
ptr++;
d2= strtol( ptr, &endptr, 10 );
Добавлено через 41 секунду
А вообще быстрее может быть inet_aton() использовать.
Или вообще написать свой парсер без strtol()

Добавлено через 8 минут
Dev и VS8 без help'a
К Visual Studio 2008 скачай MSDN help.

В Internet полно документации.

А как ты программы пишешь, если ни одной функции не знаешь ?
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 19:57  [ТС]     Калькулятор IP #20
Цитата Сообщение от odip Посмотреть сообщение

А как ты программы пишешь, если ни одной функции не знаешь ?
Плохо пишу =(

Добавлено через 27 минут
Цитата Сообщение от odip Посмотреть сообщение
http://opennet.ru/man.shtml?topic=st...ry=3&russian=0
http://www.codenet.ru/progr/cpp/sprd/strtod_strtoul.php

Ты неправильно делаешь !!!
Правильно как у меня:
C
1
2
3
4
d1= strtol( ptr, &endptr, 10 );
ptr= endptr;
ptr++;
d2= strtol( ptr, &endptr, 10 );
Сори за настырность, но объясните почему приведенный мой вариант из описания не верный...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2009, 03:38     Калькулятор IP #21
Цитата Сообщение от Lorr
что делает? Объявляет указатель на тип char. Но резервируется же область памяти 1 бай, как можно инициализировать строкой "127.0.0.1" ? Или я что то недопонял?
указатель на тип char - это переменная, которая хранит адрес переменной типа char, вообще, она хранит адрес объекта, поэтому, когда здесь переменной нет, есть строка в статической области памяти с которой можно прочитать

функция sscanf читает с этой строки адрес по кусочкам
и они сохранены в виде простых чисел в a, b, c, d

вывести их можно
C
1
    printf("%d.%d.%d.%d" "\n", a, b, c, d);
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
13.10.2009, 08:52     Калькулятор IP #22
почему приведенный мой вариант из описания не верный
Потому что endptr указывает на символ '.'
И нужно его сдвинуть вправо на один, чтобы strtol() работал.

Добавлено через 53 секунды
вывести их можно
Ему нужно преобразовать эти 4 октета в одно число типа long или unsigned long, чтобы можно было с ним работать.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2009, 13:22     Калькулятор IP #23
да это через маску делается

C
1
2
3
4
5
6
7
    unsigned long addr;
 
    addr = 0;
    addr |= a << 3*8;
    addr |= b << 2*8;
    addr |= c << 8;
    addr |= d;
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
13.10.2009, 14:40  [ТС]     Калькулятор IP #24
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <cstdlib>
#include <stdlib.h>
 
 
using namespace std;
 
    
int main()
{
   char stringIP[16];  //Строка с ИП
   char stringM[16]; //Строка с маской
   cout << "Enter IP: "; cin >> stringIP;
   cout << "Enter Mask: "; cin >> stringM;
   char *str, *pEnd;
   
   int akIP[4], //массив, каждый элемент которого есть октет ИП
   akM[4],  //тоже самое с масокой
   akAS[4];  //для записи адреса сети
   
   //Здесь преобразуем ИП в число и записываем в массив
   akIP[0]=strtol(stringIP, &pEnd, 10);
   str = pEnd; str++;
   akIP[1]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akIP[2]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akIP[3]=strtol(str, &pEnd, 10);
   
   //здесь делаем тоже самое с маской
   akM[0]=strtol(stringM, &pEnd, 10);
   str = pEnd; str++;
   akM[1]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akM[2]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akM[3]=strtol(str, &pEnd, 10);
   
   //Здесь определяем сетевой адрес и выводим его...
   cout << endl << "Network address: " ;
   for(int i=0; i<4; i++) {
   akAS[i]=akIP[i] & akM[i];
   cout << akAS[i]; if(i==3)break; cout << ".";
} cout << endl;
 
  
    system("pause");
    return 0;
}
Вот что получислось.
Для хранения адресов выбрал массивы из 4-х элементов. Но что-то тяжело так работать.
Не знаю как определять теперь широковещательный адрес...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2009, 01:35     Калькулятор IP #25
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
main()
{
    unsigned long n;
    int a, b, c, d;    
        
    a = 127;
    b = 0;
    c = 0;
    d = 1;
        
    n = 0;    
    n |= a << 3*8;    
    n |= b << 2*8;
    n |= c << 1*8;
    n |= d << 0*8;
        
    printf("%lx" "\n", n);    
        
    return 0;
}
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
14.10.2009, 03:18  [ТС]     Калькулятор IP #26
accept, объясни пожалуйста что происходит в строках 15-21 ?
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2009, 07:06     Калькулятор IP #27
C
1
2
3
4
5
    int a = 3;
 
    a |= 4;
 
    printf("%d" "\n", a);
выведет 7

a:
00000000 00000000 00000000 00000011

4:
00000000 00000000 00000000 00000100

a |= 4:
00000000 00000000 00000000 00000111

<< - сдвигает влево, дополняя нулями, пока нет переполнения это эквивалентно умножению на два

ты пододвигаешь нужное число на место, где оно должно быть, а потом применяешь операцию побитового "сложения", таким образом октеты занимают свои места в четырёх байтах переменной типа unsigned long
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
14.10.2009, 12:55     Калькулятор IP #28
Можно сразу.
C
1
n= (a<<24) | (b<<16) | (c<<8) | d;
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2009, 14:15     Калькулятор IP #29
вообще, там для цикла всё завёрнуто, чтобы можно было сделать octets[4] вместо a b c d
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2014, 13:33     Калькулятор IP
Еще ссылки по теме:

Калькулятор - C++
Всем привет) Начну с того что я не программист... Но вот решил просто освоить для себя. Выбрал язык Си. Купил книгу начал читать....

Калькулятор - C++
Решил написать калькулятор, а вот и он: #include&lt;conio.h&gt; #include&lt;locale.h&gt; #include&lt;stdio.h&gt; #define END '0' #define ERROR 'a' ...

Калькулятор - C++
Доброго времени суток, Народ! Помогите плиз с задачей. Нужен исходник калькулятора, самого простого, на 4 действия. Заранее спасибо!!!

Калькулятор - C++
Как создать калькулятор? Самый обычный, какой есть в стандартных программах, не инженерный. С дизайном разобралась, а с кодом вообще не...

Калькулятор - C++
Добрый вечер всем! Я решил написать калькулятор, но возникла одна проблема: я хочу написать чтобы он решал вот такие примеры: а + b а +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kirs2
0 / 0 / 0
Регистрация: 05.01.2014
Сообщений: 10
05.01.2014, 13:33     Калькулятор IP #30
можешь весь код кинуть плз)
Yandex
Объявления
05.01.2014, 13:33     Калькулятор IP
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru