program c C#
using System;
namespace KC005
{
class Program
{
public bool NameAndSubname(string sb)
{
if (!(char.IsLetter(sb[0])) || !(char.IsUpper(sb[0])))
{
return false;
}
else
{
char[] tab = sb.ToCharArray();
tab[tab.Length - 1] = '\0';
foreach (char c in tab)
{
if (!(char.IsLetter(c)) && !(char.IsLower(c)) && (c != '\0')) return false;
}
}
return true;
}
public bool Date(string sb)
{
string[] tab = sb.Split('-');
int rok = int.Parse(tab[0]);
int miesiac = int.Parse(tab[1]);
int dzien = int.Parse(tab[2]);
if (rok >= 1900 && rok <= 2000)
{
if (miesiac >= 1 && miesiac <= 12)
{
switch (miesiac)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (dzien >= 1 && dzien <= 31) return true;
break;
case 2:
if (dzien >= 1 && ((dzien <= 28 && rok % 4 != 0) || (dzien <= 29 && rok % 4 == 0))) return true;
break;
case 4:
case 6:
case 9:
case 11:
if (dzien >= 1 && dzien <= 30) return true;
break;
default: break;
}
}
}
return false;
}
static void Main(string[] args)
{
Program p = new Program();
string formularz;
while ((formularz = Console.ReadLine()) != null)
{
string[] tab = formularz.Split(new Char[] { ' ' });
if (!(p.NameAndSubname(tab[1])))
{
Console.WriteLine("0"); // jesli tak to koniec
continue;
}
if (!(p.NameAndSubname(tab[3])))
{
Console.WriteLine("1");
continue;
}
if (!(p.Date(tab[6])))
{
Console.WriteLine("2");
continue;
}
Console.WriteLine("3");
}
}
}
}
ktos mi moze powiedziec dlaczego to nie dziala ? Na moich testach jest wszystko cacy
Witam,
czy moglby mi ktos bardziej opisac, jak ma wygladac zestaw wejscowy?
Czy uzytkownik podaje pauzy pomiedzy rokiem, miesiacem i dniem? Wogole czy uzytkownik podaje imie tak: "Imie: Roman" czy "Roman"? Czy te "imie:" maja sie wogole wyswietlac czy co? I jeszcze do daty, w zadaniu pisze: "Każdy z zestawów składa się z 3 rozdzielonych średnikiem napisów[...]", a nizej mamy: "...w poprawnej dacie pole RRRR jest liczbą całkowitą z zakresu 1900-2000, pole MM jest liczbą całkowitą z zakresu 1-12, a pole DD liczbą całkowitą z zakresu 1-31...". Czyli wkoncu int czy napis? Czy uzytkownik podaje spacje pomiedzy danymi w dacie?
Pozdrawiam
Napisałem do tego zadania kilka różnych programów, każdy innym sposobem i ciągle mam WA.
Zakładałem nawet polskie znaki w imieniu i nazwisku, ale też nie przeszło.
Nic nie wydaje mi się nawet podejrzane w moim kodzie, wszystkie testy idą dobrze, ale SPOJ nie zalicza.
Może ktoś z osób, które zrobiły to zadanie będzie wiedział w czym tkwi haczyk.
Oto kod (wydaje mi się naprawdę prosty oprócz funkcji: isupper i islower, które sprawdzają czy dany znak jest duży albo mały):
Accepted
Jedyne, co mi się nasuwa na myśl, to to, że zbyt dokładnie rozpisałem datę, a w testach jest np. 29-02-2003, chociaż ten rok nie jest przestępny). Ale testy pewnie są dobrze (jak się kilkanaście razy dostaje WA, to już się wszystko podejrzewa).
Mogłem też coś w końcowych warunkach spaprać.
Gdyby co, to już zmieniałem wielkość tablic z 50 na 20 i 21, dodawałem '\n' na końcu scanefa oraz zmieniałem: for(i=1;i
Każda wskazówka mile widziana.
Witam, oto moj kod:
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Formularz { // klasa
private:
char imie [18];
char nazwisko[30];
char data[21];
int wynik;
//met prywatne
void s_imie();
void s_nazwisko();
void s_data();
public:
Formularz(char*,char*,char*);
~Formularz();
void werdykt();
//przyjazn
friend ostream & operator<<(ostream & os,const Formularz & obiekt);
}; // koniec klasy
//----------------------------------------------------------------------
Formularz::Formularz(char* imi, char* nazw, char* dat){ // definicje
strcpy(imie,imi);
strcpy(nazwisko,nazw);
strcpy(data,dat);
wynik=3;
}
Formularz::~Formularz()
{
}
//////////////////////////////////IMIE//////////////////////////////////
void Formularz::s_imie(){ // metoda sprawdza imie
if(!(imie[0]>='A' && imie[0]<='Z'))
wynik=0;
else{
for(int i=1; imie[i]!='\0'; i++){
if(imie[i]==';'){
if(imie[i+1]!='\0'){
wynik=0;
break;
}//if
}//if
else if(!(imie[i]>='a' && imie[i]<='z'))
{
wynik=0;
break;
}//else
//cout << imie[i] << endl; //test
}//for
}//else
}//metoda
///////////////////////////////////NAZWISKO/////////////////////////////
void Formularz::s_nazwisko(){ // metoda sprawdza poprawnosc nazwiska
if(!(nazwisko[0]>='A' && nazwisko[0]<='Z'))
wynik=1;
else{
for(int i=1;nazwisko[i]!='\0'; i++){
if(nazwisko[i]==';'){
if(nazwisko[i+1]!='\0'){
wynik=0;
break;
}//if
}//if
else if(!(nazwisko[i]>='a' && imie[i]<='z'))
{
wynik=1;
break;
}
}//for
}//else
}//koniec metody
////////////////////////////////DATA////////////////////////////////////
void Formularz::s_data(){
char rok[4];
strncpy(rok, data,4);
double d_rok=atof(rok);
//cout << d_rok << endl; //test
if(d_rok<1900 || d_rok>2000)
wynik=2;
char dni[2];
dni[0]=data[5];
dni[1]=data[6];
d_rok = atof(dni);
//cout << d_rok<<endl; // test
if(d_rok<1 || d_rok>12)
wynik=2;
dni[0]=data[8];
dni[1]=data[9];
d_rok=atof(dni);
if(d_rok<1 || d_rok>31)
wynik=2;
}//koniec metody
void Formularz::werdykt(){
s_imie();
if(wynik==3)
s_nazwisko();
if(wynik==3)
s_data();
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//przyjazn
ostream & operator<<(ostream &os, const Formularz& obiekt){
os << obiekt.wynik << endl;
return os;
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
int main(){
char imie[17];
char nazwisko[30];
char data[21];
while(cin>>imie){
cin>>imie>>nazwisko>>nazwisko>>data>>data>>data;
Formularz obiekt(imie, nazwisko, data);
obiekt.werdykt();
cout << obiekt;
}
return 0;
}
nie wiem, wszystkie testy przechodzi bezblednie. Przepraszam za obszernosc kodu, ale staram sie stosowac nowo co poznane "myki".
Pozdrawiam
- w napisie mogą również wystąpić cyfry, tak samo jak i znaki przestankowe i inne.
- wystarczy spojrzeć na dane wejściowe. przy każdym zadaniu podany jest zestaw przykładowy
- a jak jest napisane w formularzu: podaj datę urodzenia w formacie DD-MM-RRRR to wiesz jak wypełnić?
- à propos daty urodzenia to 1988 to rok Twojego urodzenia czy tak dla picu numerek?
Pomimo tego, że zadanie jest teoretycznie bardzo proste to jednak sporo się z nim namęczyłem. Wszystkim korzystającym z funkcji atoi polecam sprawdzenie wyników działania programu dla poniższych testów:
Imie: Jan; Nazwisko: Kowalski; Data ur.: 1900-+1-+1
Imie: Jan; Nazwisko: Kowalski; Data ur.: 1900-1--1-
W obydwu przypadkach prawidłowy wynik to oczywiście 2.
Dlaczego mój kod w Javie nie zwraca wartości 0(dostaje NZEC) ??
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String form = "";
String imie = "";
String nazwisko = "";
String rok = "";
String miech = "";
String dzien = "";
while(sc.hasNext()) {
form = sc.nextLine();
StringTokenizer st = new StringTokenizer(form, " ;-");
st.nextToken();
imie = st.nextToken();
st.nextToken();
nazwisko = st.nextToken();
st.nextToken(); st.nextToken();
rok = st.nextToken();
miech = st.nextToken();
dzien = st.nextToken();
Character c = new Character(imie.charAt(0));
Character d = new Character(nazwisko.charAt(0));
if(Character.isLowerCase(c) || imie.length() >= 10 || !containsLetterOnly(imie)) System.out.println(0);
else if(Character.isLowerCase(d) || nazwisko.length() >= 20 || !containsLetterOnly(nazwisko)) System.out.println(1);
else if((Integer.parseInt(rok) < 1900 || Integer.parseInt(rok) > 2000)
|| (Integer.parseInt(miech) < 1 || Integer.parseInt(miech) > 12)
|| (Integer.parseInt(dzien) < 1 || Integer.parseInt(dzien) > 31)) System.out.println(2);
else System.out.println(3);
}
System.exit(0);
}
private static boolean containsLetterOnly(String s) {
for(int i = 0; i < s.length(); i++) {
Character c = new Character(s.charAt(i));
if(!Character.isLetter(c)) return false;
}
return true;
}
}
Hej! Z tego co widziałem temat formularz był już przerabiany. Ja też próbowałem i jakoś mi nie idzie. Dla imienia i nazwiska jest ok tak myślę ale wykłada się wszystko przy datach np. dla daty 0019 lub miesiąc 17 przyjmuje że jest poprawna Jak to poprawić? Proszę o jakąś podpowiedź. Poniżej treść zadania i moje wypociny.
Napisz program, który sprawdza, czy dany formularz osobowy został prawidłowo wypełniony. Formularze, których poprawność należy sprawdzić, mają postać:
Imie: II; Nazwisko: NN; Data ur.: RRRR-MM-DD
gdzie II jest napisem złożonym z co najwyżej 10 znaków, NN jest napisem złożonym z co najwyżej 20 znaków, RRRR jest 4-znakowym napisem, a MM i DD są 2-znakowymi napisami.
Wejście
Na wejście programu podana zostanie pewna liczba zestawów danych (co najwyżej 10.000). Każdy z zestawów składa się z 3 rozdzielonych średnikiem napisów, o postaci opisanej powyżej (można przyjąć, że pola II, NN, RRRR, MM i DD składają się wyłącznie z czarnych znaków różnych od średnika). Poszczególne zestawy zostaną rozdzielone znakiem nowej linii.
Wyjście
Na wyjściu ma się pojawić, dla każdego wczytanego z wejścia formularza, liczba wyliczona zgodnie z poniższą regułą:
0, jeżeli formularz nie zawiera poprawnego imienia; poprawne imiona zaczynają się od wielkiej litery, po której następują małe litery;
1, jeżeli formularz zawiera poprawne imię, a nie zawiera poprawnego nazwiska; poprawne nazwiska zaczynają się od wielkiej litery, po której następują małe litery;
2, jeżeli formularz zawiera poprawne imię i nazwisko, a nie zawiera poprawnej daty; w poprawnej dacie pole RRRR jest liczbą całkowitą z zakresu 1900-2000, pole MM jest liczbą całkowitą z zakresu 1-12, a pole DD liczbą całkowitą z zakresu 1-31;
3, w pozostałych przypadkach.
Poszczególne liczby należy rozdzielić znakiem nowej linii.
Przykład
Wejście:
Imie: Roman; Nazwisko: Kowalski6; Data ur.: 1900-01-30
Imie: Andrzej; Nazwisko: Kowal; Data ur.: 1899-10-10
Imie: roman; Nazwisko: No-wak; Data ur.: 1099-11-12
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-01-01
Wyjście:
1
2
0
3
kod
#include <stdio.h>
#include<string.h>
int main ()
{
int x;
for(x=0; x<=10001; x++)
{
char imie[20], nazwisko[30], data[40];
int c = 0;
int i = scanf("Imie:%*1[ ]%*1[A-Z]%*9[a-z];%1[ ]", imie);
if (i == 1)
{
int n=scanf("Nazwisko:%*1[ ]%*1[A-Z]%*19[a-z];%1[ ]", nazwisko);
if (n==1)
{
int d = scanf("Data ur.:%*1[ ]%*4[1900-2000]%*1[-]%*2[00-12]%*1[-]%*2[0-31]%1[\n]", data);
if (d==1) puts("3");
else
{
puts("2");
while (c != EOF && c != '\n')
c = getchar();
}
}
else
{
puts("1");
while (c != EOF && c != '\n')
c = getchar();
}
}
else
{
puts("0");
while (c != EOF && c != '\n')
c = getchar();
}
}
return 0;
}
ok rozumiem,że warunek zakładający 10000 elementów jest nie prawidłwy, ale jak połączyć twoją powyżaszą sugestię pętli ze scanf jesli dalej w programie mam coś takiego
int i = scanf("Imie:%*1[ ]%*1[A-Z]%*9[a-z];%1[ ]", imie);
czy nie wysypie się jak przedtem zamieszczę pętle proponowaną przez Ciebie i jeszcze jedno pytanko Czy gdyby program chodził za długo ze względu na długość pętli to nie wyświetliłby przekroczonego limitu czasu tak pytam Nie obrażaj się jestem poprostu cienki. No i zastanawiałem się czy nie wstawić wewnątrz jakiegoś warunku wyjśćia z pętli coś przy użyciu EOF ale też niewiem jak to dokładnie ubrać w poprawna składnię.
Witam!
Mam problem z zadaniem Formularz;
Dostaje komunikat o błędnej odpowiedzi, a wygląda dobrze i testy przechodzi pomyślnie:
[bbone=CPP,690]
include
// wycięte
int main()
{
using namespace std;
string lancuch;
while(!cin.eof())
{
getline( cin, lancuch );
cout<<czyDaneDobre(lancuch)<<endl;
}
return( 0 );
}
[/bbone]
Opłaca się czytać forum
Źle wczytywałem dane, zamiast while(!cin.eof())
powinno być while(! getline( cin, lancuch ).eof() )
Czad, dwa tygodnie męczenia się i nagle EUREKA!
Dlatego po 10 latach wróciłem do zabawy w programowanie
Jeżeli są takie lub podobne testy, to masz problem z wczytywaniem ustawionym "nasztywno" za każdym razem 7 stringów. Jeżeli w linii będzie ich mniej, spowoduje to "doczytanie" brakującego stringu z następnej linii i problemy przy następnym wczytywaniu. Analogicznie jeżeli będzie ich więcej [a oddzielny " ; " to jeden string] to pierwsze wczytanie zostawi nadmiarowe stringii i następne wczytywanie będzie kontynuowało wczytywanie w tej samej linii a nie od początku następnej i znowu zafałszowany wynik.