Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-04-2011, 19:29   #1
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
[C++] Esercizio gestione pasticceria

Non riesco a risolvere questo esercizio:
Il nostro amico Ciccio Pasticcio e la sua dolce mogliettina Renata Limbranata hanno preso in gestione una pasticceria. Renata prepara i dolci, mentre Ciccio si occupa di prendere le ordinazioni dei clienti e fare la spesa necessaria a Renata per realizzare il dolce così come indicato sul suo libro di ricette.
Tuttavia, Ciccio come al solito fa molti pasticci, sbaglia nel prendere le ordinazioni segnando un dolce per un altro e dimentica sempre di comprare qualche ingrediente. Renata, disperata poiché per colpa di Ciccio finora non è riuscita a soddisfare nessun cliente, ci chiede aiuto. A tale scopo si scriva in C++ un programma completo opportunamente modularizzato in funzioni che 1) mostri al cliente l’elenco dei dolci tra cui può scegliere, e ne prenda l’ordinazione; 2) cerchi nel libro di ricette di Renata la ricetta corrispondente al dolce scelto e 3) compili la lista della spesa evitando di aggiungere alla lista ingredienti già presenti nella dispensa. Il libro di ricette è un elenco di stringhe ognuna delle quali ha il seguente formato:

Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.


Esempio: un cliente entra nella pasticceria e Ciccio mostra il seguente menù:
1) Torta Al Cioccolato e Panna
2) Tiramisù
3) Bavarese alle Fragole
...
Supponiamo che il cliente scelga il Tiramisù. Allora il programma accede nel libro delle ricette alla posizione corrispondente al Tiramisù ed, esaminando la stringa ivi contenuta, ad esempio

Tiramisù. Ingredienti: zucchero, uova, biscotti, mascarpone, caffè. Preparazione: unire le uova con lo zucchero, aggiungere il mascarpone, etc.

recupera gli ingredienti zucchero, uova, biscotti, mascarpone, caffè, controlla nella dispensa quale di questi è già presente e aggiunge i mancanti nella lista della spesa. Supponendo che nella dispensa siano presenti uova, cioccolato, mascarpone, farina, lievito la lista della spesa dovrà contenere zucchero, biscotti e caffè.



Ho provato ad implementare qualcosa e per ora sono riuscito a fare soltanto una funzione che mostri il menu al cliente.. può andare?! sono indeciso su cosa usare per fare questo libro delle ricette... all'inizio avevo pensato ad un array di char ma poi ho dovuto farla diventare una matrice...altrimenti non potevo stampare solo i nomi delle ricette...

Poi avrei pensato di fare un'altra funzione che prende in input la scelta(ordinazione) del cliente e che mi dia gli ingredienti di quella determinata ordinazione da inserire poi magari con un altra funzione in un nuovo array di char chiamato "lista della spesa". Fatto questo, penso che bisogna assumere che esista già un array in cui sono inseriti gli ingredienti già in dispensa(almeno credo!) e quindi mi serve una funzione che verifichi se la "listadellaspesa" contiene ingredienti uguali alla "listadelladispensa". Se li contiene dovrebbe eliminarli da "listadellaspesa"...



Codice:
void menu(char ricette[][], int dim) {
     for(int i=0; ricette[i][j]!= '\0'; i++)
             for(int j=0; ricette[i][j]!='.'; i++)
     
     cout<<"menu: "<< ricette[i][j];
     
}
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 17:39   #2
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
up
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 18:10   #3
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1728
Scusa ma non ti conviene creare una classe dolce e dentro la organizzi con una stringa per il nome del dolce,un array di stringhe per gli ingredienti (o direttamente una stringa con un separatore tra gli ingredienti),una stringa per le istruzioni,dopodichè ti basta creare un array di dolce ed è fatta.
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 18:17   #4
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
eh magari
"Purtroppo" sto preparando un esame di FONDAMENTI di c++ ..quindi ancora niente classi!
Il programma comprende: costrutti principali del c++, funzioni, array, puntatori..
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 19:05   #5
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1728
nemmeno le struct del C puoi utilizzare?
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 20:02   #6
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da mistergks Guarda i messaggi
A tale scopo si scriva in C++ un programma completo opportunamente modularizzato in funzioni

"Purtroppo" sto preparando un esame di FONDAMENTI di c++ ..quindi ancora niente classi!
Ci sarebbe da prendere il tizio che tiene questo corso e cacciarlo a pedate dall'università.
Un corso di fondamenti di C++ che non insegna le classi equivale a un corso di C.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 20:40   #7
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
ma no dai! per le classi c'è un altro corso..dopo fondamenti...c'è programmazione ad oggetti che va dalle classi in poi... poi ancora c'è algoritmi e strutture dati che va piu' nello specifico..
Ma possibile che non ci sia nessun modo per rappresentare questo "LIBRO DELLE RICETTE" senza usare le classi o struct?
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2011, 21:38   #8
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1728
Quote:
Originariamente inviato da mistergks Guarda i messaggi
ma no dai! per le classi c'è un altro corso..dopo fondamenti...c'è programmazione ad oggetti che va dalle classi in poi... poi ancora c'è algoritmi e strutture dati che va piu' nello specifico..
Ma possibile che non ci sia nessun modo per rappresentare questo "LIBRO DELLE RICETTE" senza usare le classi o struct?
così è un po' difficile,potresti usare un vettore di stringhe e riservare 3 indici per volta,uno per il nome,uno per gli ingredienti e uno per le istruzioni (grandezza vettore 3x numero di dolci),potrebbe andare?
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2011, 01:24   #9
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Non so... tu dici di usare una matrice?E poi come faccio a fare le verifiche?
Cioè come faccio a prendere solo gli ingredienti e metterli in un nuovo array per creare la "lista della spesa"?
vi prego... leggete bene e aiutatemiii...sono nei guai e ho poco tempo
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2011, 08:45   #10
goldorak
Senior Member
 
Iscritto dal: Apr 2003
Messaggi: 16462
Quote:
Originariamente inviato da mistergks Guarda i messaggi
Non so... tu dici di usare una matrice?E poi come faccio a fare le verifiche?
Cioè come faccio a prendere solo gli ingredienti e metterli in un nuovo array per creare la "lista della spesa"?
vi prego... leggete bene e aiutatemiii...sono nei guai e ho poco tempo



Ti serve (una tra le possibili soluzioni)
  • un array indicizzato sulle ricette che ti restituisce la lista degli ingredienti
  • una lista della spesa (implementata con puntatori)
  • una lista che ti rappresenta la dispensa.
__________________
MICROSOFT : Violating your privacy is our priority
goldorak è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2011, 12:10   #11
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Intendi le liste come strutture dati?? se si non posso usare come detto prima.. posso usare solo array come strutture dati.
Per array indicizzati cosa intendi? E per array con puntatori? questo? char *lista="lista......";

Mi servirebbe qualcosa per inserire un elenco di quel formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.
Sicuramente non ce ne sarà una sola...ma saranno tante frasi del genere per ogni "Nome della Ricetta". cioè ci sarà il tiramisu', la torta ecc...quindi serve un array immenso..boh..
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2011, 13:23   #12
goldorak
Senior Member
 
Iscritto dal: Apr 2003
Messaggi: 16462
Quote:
Originariamente inviato da mistergks Guarda i messaggi
eh magari
"Purtroppo" sto preparando un esame di FONDAMENTI di c++ ..quindi ancora niente classi!
Il programma comprende: costrutti principali del c++, funzioni, array, puntatori..
Quote:
Originariamente inviato da mistergks Guarda i messaggi
Intendi le liste come strutture dati?? se si non posso usare come detto prima.. posso usare solo array come strutture dati.
Per array indicizzati cosa intendi? E per array con puntatori? questo? char *lista="lista......";

Mi servirebbe qualcosa per inserire un elenco di quel formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.
Sicuramente non ce ne sarà una sola...ma saranno tante frasi del genere per ogni "Nome della Ricetta". cioè ci sarà il tiramisu', la torta ecc...quindi serve un array immenso..boh..
L'hai detto tu stesso che il programma di fondamenti di c++ tocca l'uso dei puntatori. Io ti ho solo dato un consiglio, usare delle liste come strutture dati (facilmente implementabili medianti puntatori). Oppure puoi usare la libreria standard del C++ ma non credo che sia questo quello che il docente vuole.

Puoi usare un tipo enumerativo per elecare tutte le ricette (questo e' un dato di input del problema), e poi usi questi valori come indice per accedere alla voce corrispondente nel array delle ricette da cui recuperi la lista degi ingredienti. Una volta che hai questa lista, prendi ingredient1, ingrediente2, etc... come chiavi di ricerca nella dispensa per verificare se siano o meno presenti. Se ingrediente_k non e' presente nella dispensa la inserisci nella lista della spesa, altrimenti no (visto che e' gia' presente nella dispensa).
__________________
MICROSOFT : Violating your privacy is our priority
goldorak è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2011, 15:32   #13
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Quote:
Originariamente inviato da goldorak Guarda i messaggi
Puoi usare un tipo enumerativo per elecare tutte le ricette (questo e' un dato di input del problema), e poi usi questi valori come indice per accedere alla voce corrispondente nel array delle ricette da cui recuperi la lista degi ingredienti.
Quindi devo fare un enumerazione enum ricetta={torta al cioccolato=1; tiramisu=2; ecc..}??? e poi metto questi numeri all'interno di un array di int?come recupero la lista degli ingredienti?
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2011, 16:02   #14
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1728
Quote:
Originariamente inviato da mistergks Guarda i messaggi
Non so... tu dici di usare una matrice?E poi come faccio a fare le verifiche?
Cioè come faccio a prendere solo gli ingredienti e metterli in un nuovo array per creare la "lista della spesa"?
vi prego... leggete bene e aiutatemiii...sono nei guai e ho poco tempo
Io dicevo di usare una matrice con 3 colonne per riga dove gli indici colonna sono utilizzati così: uno per il nome,uno per gli ingredienti,uno per le istruzioni (ovviamente una matrice di stringhe).Successivamente puoi usare un array per la dispensa e uno per la lista della spesa,per fare le verifiche fai un controllo carattere per carattere sulla stringa degli ingredienti di un dolce confrontando ogni parola (delimitata da un separatore,per esempio una semplice virgola) con la parola (questa volta singola stringa,solo un ingrediente) nell'indice dell'array dispensa,se non ci sono occorrenze aggiungi l'ingrediente all'array della lista della spesa (ovviamente ti conviene dargli una dimensione fissa).Che ne pensi?
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2011, 23:03   #15
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
ma così facendo non si perde il formato richiesto dalla traccia?
Essa dice:

Il libro di ricette è un elenco di stringhe ognuna delle quali ha il seguente formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.


Forse vogliono la stringa in un unico array?
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2011, 10:23   #16
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1728
Quote:
Originariamente inviato da mistergks Guarda i messaggi
ma così facendo non si perde il formato richiesto dalla traccia?
Essa dice:

Il libro di ricette è un elenco di stringhe ognuna delle quali ha il seguente formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.


Forse vogliono la stringa in un unico array?
no,assolutamente,con le 3 colonne per riga ci gestisci le 3 stringhe per ogni dolce,ti basta associare l'indice riga/colonna d'interesse alla stringa
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83

Ultima modifica di Roran : 06-04-2011 alle 10:29.
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2011, 18:33   #17
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
ho provato a buttare giù il codice completo..naturalmente non compila e ho parecchi dubbi:
inizio con quello sulla matrice di puntatori char *ricette[][]..va messo un solo asterisco? va allocata dinamicamente?

ecco il codice.. Non finirò mai di ringraziare chi mi risolverà la questione
Codice:
#include <iostream>
using namespace std;


void menu(char *ricette[][], int m, int n); //stampa il menu
int posizione_ricetta(char *[][], int); //stampa posizione ricetta in base all'ordinazione
void compilaspesa(char *[][], int, char*[],int); //compila lista della spesa

int main(){
const int m=100, n=3, dim_disp=50;

char *ricette[m][n]={{"tiramisu","zucchero-uova-biscotti-mascarpone-caffè.","unire uova con zucchero,aggiungere mascarpone"},
                     {"torta al cioccolato", "zucchero-uova-panna-cacao.","unire uova,aggiungere panna"}
                     {"bavarese", "zucchero-uova-cacao.","unire uova,aggiungere cacao"}};
char *dispensa[dim_disp]={"uova","zucchero","panna","cacao"};

cout<<"salve, ecco il menu dei dolci"<<endl;
menu(ricette,m,n);

compilalistaspesa(ricette,m,n,dispensa,dim_disp);

return 0;
}

void menu(char *ricette[][], int m, int n){
     char ordinazione[20];
     for(int i=0; i<m; i++)
     cout<<ricette[i][0];
     cout<<"cosa si desidera ordinare?"<<endl; cin>>ordinazione;
}

    
int posizione_ricetta(char *[][], int){
    int posizione_ricetta=0;
    for(int i=0; i<m; i++){
            if(ordinazione==ricette[i][0])
            posizione_ricetta=i;
            }
    return posizione_ricetta;    
}


void compilaspesa(char *[][], int, char*[],int){
     char *listaspesa[50];
     posizione_ricetta(ricette, m);
     while(ricette[posizione_ricetta][1] != '.'){//ho usato un terminatore punto per gli ingredienti
           for(int i=0; ricette[posizione_ricetta][1]!= '-'; i++){
                   if(ricette[posizione_ricetta][1] != dispensa[i])
                   listaspesa[i]=ricette[posizione_ricetta][1];
           }//for
     }//while                      
}
mistergks è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Lo compri una volta, lo giochi dove vuoi...
Qiantinuum annuncia Helios, "il com...
Samsung Galaxy S26 Ultra: una sola novit...
Google prepara Gemini 3 Pro e Nano Banan...
TVS non è solo moto e scooter: ec...
Alexa+ arriva su BMW: gli automobilisti ...
Gemini Deep Research arriva su Google Fi...
Rinvii a catena, Marvel 1943: Rise of Hy...
Xiaomi inaugura uno spazio dedicato ai f...
Rilasciate le specifiche di Bluetooth 6....
L'obiettivo che mette tutto a fuoco: la ...
Meta avrebbe raccolto fino al 10% dei ri...
NVIDIA DGX Spark e videogiochi? Una pess...
Serie Oppo Reno15 confermata: arriva il ...
UPDF 2025: l'editor PDF che fa (quasi) t...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v