Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.11.2019
Сообщений: 1
1

АЙПИ-адрес C++

03.11.2019, 22:59. Показов 2347. Ответов 5
Метки нет (Все метки)

Помогите пожалуйста с этой задачкой! Вот условия и код,который я смог сделать,он проходит 14 тестов из 15. Не могу понять что не так.
Для того чтобы выходить в Интернет, каждому компьютеру присваивается так называемый IP-адрес. Он состоит из четырех целых чисел в диапазоне от 0 до 255, разделенных точками. В следующих трех строках показаны три правильных IP-адреса:

127.0.0.0
192.168.0.01
255.00.255.255
Напишите программу, которая определяет, является ли заданная строка правильным IP-адресом.

Входные данные
На вход программе подается строка длиной не более 15 символов, которая включает цифры и ровно три точки.

Выходные данные
Если строка является правильным IP-адресом, необходимо вывести 1, иначе 0.
C++ (Qt)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main(){
    bool t = true;
    string s,w1,w2,w3,w4;
    int cnt=0,cntp=0,s1=0,s2=0,s3=0,s4=0,n,n1=0,n2,n3,n4;
    cin>>s;
    n=s.size();
    
    if(n>15){
        cout<<0;
        return 0;
    }
 
    for(int i=0;i<=n-1;i++){
        if(s[i]=='.'){
            cnt++;
        }
    }
    if(cnt>3 || cnt<3){
        cout<<0;
        return 0;
    }
 
    if(s[0]=='.'){
        cout<<0;
        return 0;
    }
    if(s[n-1]=='.'){
        cout<<0;
        return 0;
    }
 
    for(int i=0;i<=n-1;i++){
        if(s[i]=='o'){
            cout<<0;
            return 0;
        }
    }
 
    for(int i=0;i<=n-1;i++){
        if(s[i]=='-' || s[i]=='+'){
            cout<<0;
            return 0;
        }
    }
    for(int k=0;k<=n-1;k++){
    if(s[k]!='.'){
        if(cntp==0)s1++;
        if(cntp==1)s2++;
        if(cntp==2)s3++;
        if(cntp==3)s4++;
    }
    if(s[k]=='.'){
        cntp++;
        if(cntp==1)n2=k+1;
        if(cntp==2)n3=k+1;
        if(cntp==3)n4=k+1;
    }
    }
    w1 = s.substr(n1,s1);
    w2 = s.substr(n2,s2);
    w3 = s.substr(n3,s3);
    w4 = s.substr(n4,s4);
    /*cout<<w1<<" "<<w2<<" "<<w3<<" "<<w4<<endl;*/
    for(int i=0;i<=n-1;i++){
            if(s[i]=='.' && s[i+1]=='.'){
                t = false;
                break;
            }
    }
    if(w1<"0" || w1>"255"){t=false;}
    if(w2<"0" || w2>"255"){t=false;}
    if(w3<"0" || w3>"255"){t=false;}
    if(w4<"0" || w4>"255"){t=false;}
 
    if(t==true){
        cout<<1;
    }else{
        cout<<0;
    }
    return 0;
}
По моему мнению, учел в алгоритме все: превышение, недочет количества точек, чисел, написание нечисловых данных, постановка точки в начале или в конце, подряд, друг за другом, вписание чисел, выходящих за пределы [0;255].

Кто может сказать, какой пункт я не учел в алгоритме решения?

Заранее спасибо)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2019, 22:59
Ответы с готовыми решениями:

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

Функция возвращает адрес , как передать этот адрес другой функции ?
const int max = 5; double * fill_array(double, int); void show_array(const double, double *);...

Адрес объекта, адрес указателя. Где что находится?
#include &lt;iostream&gt; void Foo(int* val) { std::cout &lt;&lt; val &lt;&lt; &quot; &quot; &lt;&lt; *val &lt;&lt; &quot; &quot; &lt;&lt; &amp;val...

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны.
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив -...

5
7244 / 4900 / 2821
Регистрация: 18.12.2017
Сообщений: 15,384
03.11.2019, 23:24 2
зачем проверки на 'o', '-', '+' ?
Цитата Сообщение от shagyroff Посмотреть сообщение
строка ... включает цифры и ровно три точки
строка 70 при i=n-1 выход за пределы строки

зачем везде лишняя операция i<=n-1 ? лучше так i<n
0
2733 / 1892 / 564
Регистрация: 05.06.2014
Сообщений: 5,525
03.11.2019, 23:32 3
Цитата Сообщение от shagyroff Посмотреть сообщение
Кто может сказать, какой пункт я не учел в алгоритме решения?
Пробелы, которых в середине айпишника по условию задачи быть не должно? И вообще, вас не в ту степь понесло. Входная строка должна состоять из "число точка число точка число точка число". Вот и не надо мудрить, просто читаем строчку слева направо, проверяя "теперь число, теперь точка. Теперь опять число, теперь снова точка".
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    int x;
    std::cout<<(isdigit(std::cin.peek()) && std::cin>>x && x>=0 && x<=255 && std::cin.get()=='.' &&
                isdigit(std::cin.peek()) && std::cin>>x && x>=0 && x<=255 && std::cin.get()=='.' &&
                isdigit(std::cin.peek()) && std::cin>>x && x>=0 && x<=255 && std::cin.get()=='.' &&
                isdigit(std::cin.peek()) && std::cin>>x && x>=0 && x<=255 &&
                (std::cin.peek()=='\n' || std::cin.peek()==EOF));
    return 0;
}
0
7244 / 4900 / 2821
Регистрация: 18.12.2017
Сообщений: 15,384
03.11.2019, 23:40 4
проверки w<"0" не нужны
Цитата Сообщение от shagyroff Посмотреть сообщение
На вход программе подается строка длиной не более 15 символов
if(n>15) - тоже лишняя проверка

проще проверить на точки, затем заменить точки пробелами, потоком забрать из строки числа и проверить что они <=255
0
Мозгоправ
1730 / 1024 / 468
Регистрация: 01.10.2018
Сообщений: 2,137
Записей в блоге: 2
03.11.2019, 23:45 5
shagyroff, основная дырка в строках 75-78. Вы сравниваете числа как строки, т.е. в лексикографическом порядке. Это неправильно, поскольку "3" > "255" и if переключает t на false, но для чисел условие 0 <= 3 <= 255 выполняется.

Кроме того, в строке 70 формально вы выходите за границу массива. В данном случае это не критично, но лучше так не делать.

В остальном, вы делаете много лишних проверок. По условию: строка не более 15 символов, состоящая из цифр и ровно трёх точек. Зачем вы проверяете длину строки на 15? (Я ещё мог бы понять, если бы проверяли на 0.) Зачем вы считаете точки? Зачем вы проверяете строку на 'o', '-' и '+'?

И, да, ваша программа не компилируется, потому что нужно было включать заголовок <string>, а не <cstring>.

Попробуйте ещё вот такой сильно облегчённый вариант:
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
#include <cstdio>
 
using namespace std;
 
const char yes[] = "1";
const char no[] = "0";
 
int main()
{
    int num[4];
    int cnt = scanf("%d.%d.%d.%d", &num[0], &num[1], &num[2], &num[3]);
    if (cnt != 4) {
        puts(no);
        return 0;
    }
    for (size_t i = 0; i < 4; ++i)
        if (num[i] > 255) {
            puts(no);
            return 0;
        }
    puts(yes);
 
    return 0;
}
0
фрилансер
3417 / 2641 / 643
Регистрация: 11.10.2019
Сообщений: 7,602
03.11.2019, 23:50 6
shagyroff, я бы для начала удалил из строки все символы, кроме "0123456789." , потом заменил бы все повторяющиеся точки на одинарные, затем парс, как показал L0M scanf("%d.%d.%d.%d",
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2019, 23:50

Узнать адрес функции 2, зная адрес функции 1
Допустим две функции расположены так: int f1() { return 1; } int f2() { return 2; } int...

айпи адрес
Для того чтобы выходить в Интернет, каждому компьютеру присваивается так называемый IP-адрес. Он...

Адрес сайта по айпи
Я в этих делах совсем еще простофиля. Впервые сегодня приобрел хостинг + домен. Ввожу в адресную...

Постоянный локальный айпи адрес.
У меня стоит WiFi-роутер NetGear, который при перезапуске постоянно выдает компьютерам разные IP...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru