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

Zadanie SPOJ - Formularz

Cloud VPS
0 głosów
405 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,360 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,401 wizyt
0 głosów
1 odpowiedź 2,671 wizyt
pytanie zadane 14 lutego 2018 w SPOJ przez apapis Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 585 wizyt
pytanie zadane 7 czerwca 2023 w SPOJ przez PTRKK Nowicjusz (200 p.)

93,467 zapytań

142,459 odpowiedzi

322,735 komentarzy

62,848 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

Kursy INF.02 i INF.03
...