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