Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2015, 19:22   #1
AB96
Пользователь
 
Регистрация: 20.10.2015
Сообщений: 22
По умолчанию Эффективна ли данная защита от ввода посторонних символов и букв

Здравствуйте! В общем, я написал программу для решения следующей задачи: Определите по номеру года, является или нет этот год високосным. Указание: год считается високосным, если номер этого года делится нацело на 4, за исключением тех, которые делятся нацело на 100 и не делятся на 400 . Нужно также было сделать защиту (запрет на ввод посторонних символов и букв). Вроде сделал. Но, по-моему она какая-то корявая. Скажите, пожалуйста, эффективна ли эта защита? И ещё, программа работает нормально. Но почему-то, если ввести любой год, оканчивающийся чётным числом, то программа сразу закрывается. Не подскажете, из-за чего это?

Вот код:

Код:
#include <stdio.h>
#include <conio.h>
#include <locale.h>
 
int main()
{
    int year;
    setlocale(LC_ALL, "rus");
    do
    {
        fflush(stdin);
        printf("Введите год: ");
        scanf("%d",&year);
        if (year<0)
        {
            printf("Некорректный ввод! Повторите ещё раз: ");
        }
    } while (year<0);
 
        if(year%4==0)
        {
            if(year%100==0&&year%400!=0)
            {
                printf("Этот год НЕ является високосным. \n");
                return(0);
            }
            printf("Этот год является високосным. \n");
            return(1);
    }
    printf("Этот год НЕ яляется високосным. \n");
 
    _getch();
    return 0;
    system("pause"); 
    
 
}
Заранее спасибо!
AB96 вне форума Ответить с цитированием
Старый 05.11.2015, 20:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я бы ввод сделал так:
Код:
function Yearme(){
 int y,ok;
 for(ok=scanf("%d",&y);ok!=1 || y<0;ok=scanf("%d",&y)){
   printf("Некорректный ввод! Повторите ещё раз: ");
 }
 return y;
}
И функцию проверки:
Код:
int chk(int year){
        if(!year%4) return 0;
        if(year%100==0&&year%400!=0) return 0;
        return(1);
    }
Ну и сама прога:
Код:
int main()
{
    if(chr(Yearme())) printf("Високосный\n"); else printf("Неа\n");
    system("pause"); 
    return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2015, 21:30   #3
Yuan
 
Регистрация: 05.11.2015
Сообщений: 4
По умолчанию

Я бы ввел сначала строку, а уж из нее читал бы year, иначе застопорится программа на буквах в потоке stdin.

static char buf[512];

scanf("%s",buf);
sscanf(buf,"%d",&year);
Yuan вне форума Ответить с цитированием
Старый 05.11.2015, 21:31   #4
AB96
Пользователь
 
Регистрация: 20.10.2015
Сообщений: 22
По умолчанию

Спасибо большое!
AB96 вне форума Ответить с цитированием
Старый 05.11.2015, 21:33   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
иначе застопорится программа на буквах в потоке stdin.
Это с чего бы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2015, 22:05   #6
AB96
Пользователь
 
Регистрация: 20.10.2015
Сообщений: 22
По умолчанию

Что-то не работает. Программа собираться не хочет. Пишет, что не удаётся найти указанный файл.
AB96 вне форума Ответить с цитированием
Старый 05.11.2015, 22:12   #7
Yuan
 
Регистрация: 05.11.2015
Сообщений: 4
По умолчанию

Какой именно файл (имя)? Кстати перед первым годом идет первый год до Н.Э. , нет нулевого года.

Последний раз редактировалось Yuan; 05.11.2015 в 22:23.
Yuan вне форума Ответить с цитированием
Старый 05.11.2015, 22:17   #8
AB96
Пользователь
 
Регистрация: 20.10.2015
Сообщений: 22
По умолчанию

В смысле "какой именно"? Год? Если год, то тот, который пользователь введёт с клавиатуры. А программа должна определить - високосный он или нет. Указание: год считается високосным, если номер этого года делится нацело на 4, за исключением тех, которые делятся нацело на 100 и не делятся на 400

Последний раз редактировалось AB96; 05.11.2015 в 22:32.
AB96 вне форума Ответить с цитированием
Старый 08.11.2015, 18:29   #9
AB96
Пользователь
 
Регистрация: 20.10.2015
Сообщений: 22
По умолчанию

Немного переписал код. Вроде всё верно, но почему-то не работает. Не подскажете, в чём ошибка?

Код:
#include <stdlib.h>
#include <conio.h>
#include <locale.h>

int main()
{
	char year;
	setlocale(LC_ALL, "rus");
	do
	{
    fflush(stdin);
	printf("Введите год: ");
	scanf("%s", &year);
	if ((year<=0)||(year>32767))
	{
		printf("ОШИБКА: некорректный ввод! Повторите ещё раз: ");
	}
	else
	{
      if (year%4!=0)
	  {
		  printf("Этот год НЕ является високосным. ");
	  }
	  else
	  {
		  if ((year%4=)&&(year%4!=100))
		  {
			  printf("Этот год является високосным. ");
		  }
		  else
		  {
			  if ((year%100=0)&&(year%400!=0))
			  {
				  printf("Этот год НЕ является високосным. ");
			  }
		  }
	  }
	}
	} while((year<=0)||(year>32767));
	return 0;
	getch();
	system("pause");
}

Последний раз редактировалось AB96; 08.11.2015 в 18:34.
AB96 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать защиту от ввода символов и букв AB96 Общие вопросы C/C++ 3 22.10.2015 19:48
Вводится последовательность символов, конец ввода -ESC(код#27). Определить количество букв "b". помогите сделать через string. kolbaskin Паскаль, Turbo Pascal, PascalABC.NET 2 30.12.2013 09:12
к какому виду программной защиты относится данная защита? as_sati Безопасность, Шифрование 5 30.05.2013 21:56
Защита от кривого ввода на С++ survavior Помощь студентам 4 13.04.2010 17:56
Как сделать запрет ввода букв в поле для ввода input zvezda_t PHP 1 27.12.2009 22:02