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

Zadanie SPOJ - Formularz

Object Storage Arubacloud
0 głosów
299 wizyt
pytanie zadane 14 listopada 2020 w SPOJ przez Baster123 Nowicjusz (220 p.)

Witam. Przychodzę z problemem z zadaniem ze SPOJa. Jest to zadanie "Formularz" - https://pl.spoj.com/problems/KC005/ . Program działa poprawnie, jednak SPOJ wyrzuca komunikat o błędnej odpowiedzi. Proszę o pomoc w zlokalizowaniu błędu. Zdaję sobie sprawę, że nie powinienem wstawiać całego kodu, lecz inaczej ciężko będzie znaleźć błąd. Po otrzymaniu odpowiedzi usunę kod, aby nie psuć zabawy innym.

#include <iostream>
#include <string>

using namespace std;

bool check_date(char date[])
{
	string year, month, day;

	year = date[0];
	year += date[1];
	year += date[2];
	year += date[3];
	month = date[5];
	month += date[6];
	day = date[8];
	day += date[9];

	for (int i = 0; i < 4; i++)
	{
		if (year[i] >= '0' && year[i] <= '9');
		else return false;
	}

	for (int i = 0; i < 2; i++)
	{
		if (month[i] >= '0' && month[i] <= '9');
		else return false;
	}

	for (int i = 0; i < 2; i++)
	{
		if (day[i] >= '0' && day[i] <= '9');
		else return false;
	} 

	int int_year = stoi(year);
	int int_month = stoi(month);
	int int_day = stoi(day);

	if (int_year >= 1900 && int_year <= 2000 && int_month >= 1 && int_month <= 12 && int_day >= 1 && int_day <= 31) return 1;
	else return 0;

	return 0;
}

int main()
{
	string form;

	while (getline(cin,form))
	{
		bool first_name = 1;
		bool last_name = 1;
		bool date = 1;
		int counter = 0;

		char* pointer;
		pointer = &form[0];

		while (*pointer != ':') pointer++;
		pointer++; pointer++;

		if (*pointer >= 'A' && *pointer <= 'Z');
		else first_name = false;
		pointer++; pointer++;

		while (*pointer != ';')
		{
			if (*pointer >= 'a' && *pointer <= 'z');
			else first_name = false;

			counter++;
			pointer++;

			if (counter >= 10) first_name = false;

		}

		while (*pointer != ':') pointer++;
		pointer++; pointer++;
		counter = 0;

		if (*pointer >= 'A' && *pointer <= 'Z');
		else first_name = false;
		pointer++;

		while (*pointer != ';')
		{
			if (*pointer >= 'a' && *pointer <= 'z');
			else last_name = false;

			counter++;
			pointer++;

			if (counter >= 20) last_name = false;

		}

		while (*pointer != ':') pointer++;
		pointer++; pointer++;

		char help[10];

		for (int i = 0; i < 10; i++)
		{
			help[i] = *pointer;
			pointer++;
		}

		date = check_date(help);

		if (first_name == false) cout << 0 << endl;
		else if (last_name == false) cout << 1 << endl;
		else if (date == false) cout << 2 << endl;
		else cout << 3 << endl;
		
	}

	return 0;
}

 

komentarz 14 lipca 2021 przez Oscar Nałogowiec (29,290 p.)
edycja 14 lipca 2021 przez Oscar
Nie sprawdzasz czy pola daty oddzielone są '-'. Ignorujesz te znaki.

Podejrzane jest też pobieranie wskaźnika na pierwszy znak napisu w zmiennej typu string i inkrementacja tego. Chyba nie ma gwarancji że napis w tym typie jest ciągłym obszarem pamięci. Jak potrzeba C-pointer ze strings to jest do tego metoda c_str()

1 odpowiedź

0 głosów
odpowiedź 14 lipca 2021 przez asdasz Nowicjusz (160 p.)
Nie wiem, czy nadal aktualne, ale 2 rzeczy mi się rzuciły w oko.

1. Długość imienia masz do 11 znaków,

2. Spróbuj wpisać kod:

Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-01-01hiszpanskainkwizycja

 

Pozdrawiam
komentarz 14 lipca 2021 przez asdasz Nowicjusz (160 p.)
Jeszcze wielka litera w nazwisku dotyczy imienia :)

Podobne pytania

0 głosów
6 odpowiedzi 1,054 wizyt
0 głosów
1 odpowiedź 2,409 wizyt
pytanie zadane 14 lutego 2018 w SPOJ przez apapis Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 210 wizyt
pytanie zadane 7 czerwca 2023 w SPOJ przez PTRKK Nowicjusz (200 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...