25 / 27
May 2013

Wielkie dzięki. smiley
Mój błąd polegał na tym, że założyłem, że w dacie są same cyfry. Zamienienie daty na string wyeliminowało błąd. smile

No cóż dla mojego programu ktory dostal ACC data 31 luty jest jak najbardziej poprawna smileysmiley

10 days later

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 C++ tez powinna byc to skoro w C# jest.
Mianowicie do sprawdzania imienia i nazwiska mozna posluzyc sie wyrazeniami regularnymi wink

9 days later
  1. w napisie mogą również wystąpić cyfry, tak samo jak i znaki przestankowe i inne.
  2. wystarczy spojrzeć na dane wejściowe. przy każdym zadaniu podany jest zestaw przykładowy
  3. a jak jest napisane w formularzu: podaj datę urodzenia w formacie DD-MM-RRRR to wiesz jak wypełnić?
  4. à propos daty urodzenia to 1988 to rok Twojego urodzenia czy tak dla picu numerek?
1 month later

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.

1 month later

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;	
    }
}
2 months later

W adzie działa wszystko ok oddałem parę programów. problem polega na tym, że są to podchwytliwe testy i niestety trzeba ruszyć głową

3 months later
2 months later

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ę.

6 months later
4 months later
7 months later

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 wink
Ź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 smile

6 months later

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.

4 months later

Moje testy:

Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-01-01
Imie: alicja; Nazwisko: Nowak; Data ur.: 1990-01-01
Imie: AAlicja; Nazwisko: Nowak; Data ur.: 1990-01-01
Imie: Alicjaaaaaa; Nazwisko: Nowak; Data ur.: 1990-01-01
Imie: A; Nazwisko: Nowak; Data ur.: 1990-01-01
Imie: Alicja; Nazwisko: nowak; Data ur.: 1990-01-01
Imie: Alicja; Nazwisko: NNowak; Data ur.: 1990-01-01
Imie: Alicja; Nazwisko: Nowakaaaaaaaaaaaaaaaa; Data ur.: 1990-01-01
Imie: Alicja; Nazwisko: N; Data ur.: 1990-01-01
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1899-01-01
Imie: Alicja; Nazwisko: Nowak; Data ur.: 2001-01-01
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-00-01
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-01-00
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1590-01-01
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-13-01
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-01-32

Mój out:

3
0
0
0
0
1
1
1
1
2
2
2
2
2
2
2

A mój program nadal nie działa. Będę się męczył sam, a jak nie pomoże, to zwrócę się tutaj o pomoc. Jeżeli outy są złe, poprawcie mnie.

Co ci daje dla testu:

Imie: Alicja; Nazwisko: Nowak; Data ur.: raba-rb-ar

?

EDIT: Załączam moje outy do twoich testów:

3
0
0
0
3
1
1
1
3
2
2
3
3
2
2
2

Wydaje mi się, że trochę się różnią...

4 months later

Czy moze ktos podac jakies zestawy, ktore pomoglyby znalezc blad?

[bbone=cpp,1381]#include

include

using namespace std;

string imie, nazwisko, data, wycinek;
int rok, miesiac, dzien, blad, il, nl;
char ch;

int main () {

while(true) {
blad=3;
cin >> wycinek; getline(cin, imie, 'N'); imie=imie.substr(1,imie.length()-3);
cin >> wycinek; getline(cin, nazwisko, 'D'); nazwisko=nazwisko.substr(1,nazwisko.length()-3);
cin >> wycinek>>wycinek; getline(cin, data, '\n'); data=data.substr(1,data.length()-1);

il=(int)imie[0];
nl=(int)nazwisko[0];

if (imie.length()>10 || (il>90 || il<65)) blad=0; else
for ( int k=1 ; k if ( imie[k]>122 || imie[k]<97 || imie[k]==32 ) blad=0; else

if (blad==3)
if (nazwisko.length()>20 || (nl>90 || nl<65)) blad=1; else
for ( int k=1 ; k if ( nazwisko[k]>122 || nazwisko[k]<97 ) blad=1; else

if (blad==3)
if (data.length()!=10) blad=2; else {

for ( int k=0 ; k<data.length() ; k++ ) {
    il=(int)data[k];
    if (il>57 || il<48) if (il!=45) blad=2;
}

if (blad!=2) {
stringstream ss;
ss << data.substr(0,4); ss >> rok; ss.clear();
ss << data.substr(5,2); ss >> miesiac; ss.clear();
ss << data.substr(8,2); ss >> dzien;

if(rok<1900 || rok >2000 || miesiac<1 || miesiac>12 || dzien<1 || dzien>31) blad=2;}
}

cout << blad << endl;
if (cin.eof()) break;
}

}[/bbone]

1 year later

Cześć, męczę się już trochę nad tym zadaniem, moje testy zdaje - jakieś pomysły dlaczego na spoju błędna odpowiedź?

[bbone=CPP,2113]
AC
[/bbone]

@edit przepraszam za nazwy zmiennych blush