Re[23]: И еще рассуждения об ИИ
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.02.26 08:29
Оценка:
.Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А можно сказать все же, без "теоретических" соображений, что мне выдаст хоть статический верификатор , хоть ИИ на программу

PD>

PD>void main()
PD>{
PD>unsigned int l,w,s;
PD>sscanf("%d %d", &l, &w);
PD>s = w * l;
PD>printf("%d", s);
PD>}
PD>


PD>А то ведь у меня ничего, кроме этой программы, и нет.
Статический верификатор — ничего. У вас нет требований к этой программе.
PD>Или я должен к каждой операции умножения приделать предусловие и постусловие в виде честного произведения бесконечноразрядных целых или же вычисления в unsigned long и сравнения ?
Эмм, вообще-то преподаватель технического ВУЗа по айтишной специальности должен хоть краем глаза слышать о методах проверки корректности программ. В частности, о дедуктивной верификации.

А вот ИИ на эту программу выдаст следующее:

В программе есть несколько ошибок и неточностей. Разберём их по порядку.

❌ Ошибки


  1. Неверное использование sscanf
    sscanf считывает данные из строки, а у тебя строка не передаётся.
    Для ввода с клавиатуры нужно использовать scanf.

  2. Несоответствие формата типу unsigned int
    Используется %d, который предназначен для int, а переменные объявлены как unsigned int.
    Для unsigned int нужно использовать %u.

  3. void main() — некорректно
    В стандартном C правильная сигнатура:
    int main(void)

    или
    int main()

  4. Нет подключения stdio.h

✅ Исправленная версия программы
#include <stdio.h>

int main(void)
{
    unsigned int l, w, s;
    
    scanf("%u %u", &l, &w);
    s = w * l;
    
    printf("%u\n", s);
    
    return 0;
}


📌 Что делает программа



Если хочешь — могу также объяснить разницу между scanf и sscanf.


Есть ли какие-либо проблемы в исправленной версии?

Да — в целом исправленная версия корректная, но есть несколько моментов, которые стоит учитывать.

✅ Что уже правильно



⚠ Возможные проблемы

  1. Нет проверки результата scanf

    Если пользователь введёт:
    • буквы вместо чисел
    • только одно число
    • ничего

    переменные могут остаться неинициализированными.

    Лучше проверить количество успешно считанных значений:

    if (scanf("%u %u", &l, &w) != 2) {
        printf("Ошибка ввода\n");
        return 1;
    }


  2. Возможное переполнение

    Если l и w достаточно большие, произведение может переполнить unsigned int.

    Например, при 32-битном unsigned int:
    максимум = 4294967295

    Если ввести:
    70000 70000

    то реальный результат:

    4 900 000 000

    что превышает предел → произойдёт переполнение.

    Если важна корректность при больших числах, лучше использовать:

    unsigned long long


    и формат %llu.

  3. Нет проверки на логическую корректность

    Если это длина и ширина, возможно стоит проверять:

    • что значения не равны 0

    • что они в допустимом диапазоне
      (зависит от задачи)

💡 Улучшенная безопасная версия
#include <stdio.h>

int main(void)
{
    unsigned long long l, w;

    if (scanf("%llu %llu", &l, &w) != 2) {
        printf("Ошибка ввода\n");
        return 1;
    }

    printf("%llu\n", l * w);

    return 0;
}

🎯 Итог

Твоя исправленная версия:

✔ корректна синтаксически

✔ работает при обычных значениях

⚠ не защищена от некорректного ввода

⚠ может переполниться при больших числах

Если это учебная задача — всё нормально.
Если это реальная программа — лучше добавить проверки.

Если хочешь, могу разобрать, как происходит переполнение на уровне памяти.

Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.