View Full Version : [C++] programma per iniziare...
che programma mi consigliate per iniziare a programmare in c++?
quando lessi il tutorial scaricai "microsoft visual studio express c++ edition" ma nn so che fine abbia fatto :cry:
aspetto che mi illuminiate :D
sottovento
12-06-2006, 16:17
che programma mi consigliate per iniziare a programmare in c++?
quando lessi il tutorial scaricai "microsoft visual studio express c++ edition" ma nn so che fine abbia fatto :cry:
aspetto che mi illuminiate :D
Forse il suggerimento non sara' condiviso dalla maggior parte degli utenti di questo forum, ma ti consiglio di partire con un semplice editor di testo ed un compilatore di linea.
I primi programmi che uno scrive, quando impara un linguaggio, sono piuttosto semplici e non necessitano di grandi strumenti: in questo modo puoi imparare la differenza fra i vari processi in fase di sviluppo, cosa che spesso negli editor integrati non si capisce bene.
Ho conosciuto gente che non capiva che il compilatore e' (semplificando parecchio) un software che prende il tuo file di testo e produce un altro file, che e' comprensibile alla tua macchina.
Questo e' il minimo che troverai su qualsiasi macchina, fosse un supercomputer o un micro a 4 bits.
Dopo i primi programmi, quanto hai scaricato puo' andare benissimo. E' una delle tante scelte che si possono fare, piu' o meno equivalenti.
Spero di non aver fatto la supposizione errata: hai scritto di voler iniziare a programmare in C, ma non hai scritto se sai programmare. Come ben saprai, sono cose ben distinte.
High Flying
Sottovento
preciso: voglio imparare a programmare in C++ ma non so attualmente programmare in C++ :cry:
cmq dove trovo un compilatore di linea?
cmq dove trovo un compilatore di linea?C'è il Borland C++ 5.5. È a linea di comando (nessun IDE/editor) e trovi delle info su come scaricarlo/installarlo <qui> (http://cplus.about.com/od/compilersandides/l/aa031502a.htm).
Non è il massimo come compilatore ma credo che ti possa andare bene.
lho appena scaricato, grazie.
ora devo capire come funziona :muro: :muro: :muro: :muro:
sto leggendo un tutorial, ma non capisco una cosa:
perche assegnare una variabile a un puntatore per farci operazioni se le operazioni possono essere fatte direttamente sulla variabile?
x esempio perche fare:
int numero = 5;
int *pointer;
*pointer = №
int totale;
totale = *pointer;
anziche fare:
int numero = 5;
int totale = numero;
:confused:
manu@2986
12-06-2006, 19:29
magari è solo un esempio su come funzionano i puntatori..
sto leggendo un tutorial, ma non capisco una cosa:
perche assegnare una variabile a un puntatore per farci operazioni se le operazioni possono essere fatte direttamente sulla variabile?
x esempio perche fare:
int numero = 5;
int *pointer;
*pointer = №
int totale;
totale = *pointer;
anziche fare:
int numero = 5;
int totale = numero;
:confused:
questo permette (oltre a pratiche esoteriche usando l'artimetica degli operatori :asd: ), di passare le variabili per riferimento(cioè passi l'indirizzo della locazione di memoria dove è presenta il tuo dato) alle funzioni. In questa maniera non ne devi fare una copia.
questo permette (oltre a pratiche esoteriche usando l'artimetica degli operatori :asd: ), di passare le variabili per riferimento(cioè passi l'indirizzo della locazione di memoria dove è presenta il tuo dato) alle funzioni. In questa maniera non ne devi fare una copia.
non ho capito proprio bene bene... :asd:
oddio mi fa male la testa...
ho letto quasi tutta la lezione ma non ci sto capendo molto...
questo è cio che ho imparato :asd:
#include <emoticons.h>
emo miafaccia = :mbe:
non ho capito proprio bene bene... :asd:Ok ... esempio:
#include <stdio.h>
void funzione (int num)
{
num = 20;
}
int main (void)
{
int n=10;
funzione (n);
printf ("%d\n", n); // Stampa 10
return 0;
}#include <stdio.h>
void funzione (int *num)
{
*num = 20;
}
int main (void)
{
int n=10;
funzione (&n);
printf ("%d\n", n); // Stampa 20
return 0;
}
Nel primo codice la funzione riceve il numero per valore. Viene cioè fatta una copia e quindi 'num' è una copia di 'n' del main. Questo vuol dire che qualunque modifica su 'num' nella funzione non altera il valore di 'n' del main.
Nel secondo codice la funzione riceve il numero per riferimento (e non per valore, non viene fatta una copia). Cioè riceve un puntatore con l'indirizzo della variabile 'n'. Questo vuol dire che dereferenziando il puntatore con *num, la funzione è in grado di modificare il valore di 'n' del main.
grazie andbin, sei sempre molto chiaro :)
1 altra cosa: ma a che servono le classi?
la lezione dice che sono usate per rappresentare gli oggetti nella realta... ma a quale scopo? cioe cosa ci si fa con questi oggetti?
1 altra cosa: ma a che servono le classi?Guarda ... <qui> (http://it.wikipedia.org/wiki/Classi) ne parla sicuramente meglio di quanto potrei fare io.
grazie !!! :)
dove posso trovare degli esercizi per verificare il livello di apprendimento?
il mio primo programma funzionante :)
#include <iostream>
#include <string>
using namespace std;
float ft2inch(float ft);//Dic.della fun. che converte piedi in pollici
float inch2cm(float inch);//Dic.della fun. che converte pollici in centimetri
float cm2m(float cm);//Dic. della fun. che converte centimetri in metri
int main()
{
float ft;
float inch;
float cm;
float m;
cout << "Inserisci una grandezza in piedi per convertirla in metri: ";
cin >> ft;
inch = ft2inch(ft);
cm = inch2cm(inch);
m = cm2m(cm);
cout << ft << " piedi equivalgono a " << m << " metri";
}
float ft2inch(float ft)
{
float inch;
float factor = 12;
inch = ft * factor;
return inch;
}
float inch2cm(float inch)
{
float cm;
float factor = 2.54;
inch = cm * factor;
return inch;
}
float cm2m(float cm)
{
float m;
float factor = 100;
m = cm * factor;
return m;
}
che ne dite? :D
che ne dite? :DOk ... prova adesso magari a chiedere in input quale conversione effettuare. Magari fallo looppare in modo che esca dal programma solo se richiesto.
Ah, e metti un return 0; alla fine del main. ;)
E le conversioni non mi sembrano molto giuste ... i metri non sono cm/100 ???
scorpion89
12-06-2006, 22:30
int numero = 5;
int *pointer;
*pointer = №
int totale;
totale = *pointer;
anziche fare:
int numero = 5;
int totale = numero;
Scusate ma faccio notare ke questo codice è sbagliato!
Giusto:
int numero = 5;
int *pointer;
pointer = №
int totale;
totale = *pointer;
Ciao
Black imp
13-06-2006, 02:06
Una classe definisce un TIPO, come una typedef struct. la differenza è che la classe ti permette di definire tipi dai quali derivarne altri aggiungendo o ridefiniendo delle sue parti - meccanismo di ereditarietà -; ti permette, tramite puntatori il cosiddetto 'binding dinamico' cioè di assegnare a un puntatore a una classe padre, l'indirizzo di un oggetto della classe derivata, il che è molto utile anche se lo vedi solo programmando; in c++ hai anche l'ereditarietà multipla. in più, fondamentale, quando definisci la classe, esattamente come quando scrivi un header di una libreria in C, definisci un tipo di dati astratto e delle funzioni che accedono ad esso, solo che utilizzando le classi, le funzioni sono parte stessa di questa struttura e quando le chiami devi farlo proprio tramite un oggetto istanziato o indicando esplicitamente il nome della classe. tutta questa strutturazione permette in fase di progettazione ma anche di scrittura del codice di avere una visione molto più chiara delle cose e soprattutto impedisce meglio l'accesso diretto da fuori della libreria alla struttura dati che invece deve sempre essere fatto tramite le funzioni di interfaccia, in modo che qualora si cambi la struttura nella libreria, basti riscrivere la libreria e non tutto il programma.
es. typedef struct {
int numerocartelle;
...
} archivio;
ho dichiarato una struttura di nome archivio che è un nuovo tipo di dati;
int funzione1 (archivio * oggetto1)
{
};
ho dichiarato una funzione che accede alla struttura archivio;
se hai dichiarato nel main o ovunque usi la libreria:
archivio ogg1;
int i;
...
chiami la funzione come:
i=funzione1(ogg1);
con le classi
la dichiarazione nell'header file diventa
class archivio {
int numero_cartelle;
public:
int funzione1 ();
}
nel file cpp definisci le funzioni:
int archivio::funzione1()
{
return numero_cartelle;
};
e infine nel main avrai:
archivio* ogg1;
int i;
ogg1=new archivio();
i=archivio->funzione1();
la differenza fondamentale in questo esempio è che tu dall'esterno della classe non puoi accedere direttamente a numero_cartelle ma solo tramite la funzione1 che è una funzione di interfaccia. il che è pulito. invece nell'esempio in C tu puoi fregartene delle funzioni fatte per accedere alla struttura e accedere tu direttamente.
cnque guarda che il C++ è un linguaggio MOLTO complesso e richiederebbe per padroneggiarlo studiare un po' di ing. del software dove impari i costrutti possibili in generale in programmazione e la loro realizzazione a basso livello, in modo poi da capire al volo il perchè di certe scelte di ciascun linguaggio.
il libro migliore per me rimane il Lippman della Addison Wesley
( x andbin )E le conversioni non mi sembrano molto giuste ... i metri non sono cm/100 ???
io ho fatto int factor = 100 quindi facendo cm * factorottengo i metri, no?
( x scorpion89 )Scusate ma vi faccio notare che questo codice è sbagliatoGrazie per avermelo fatto notare, ma avevo premesso di non aver capito niente...
io ho fatto int factor = 100 quindi facendo cm * factorottengo i metri, no?
cm = 10
cm * factor = 1000;
10 cm è uguale a 1000 metri :mbe: :P
lol ora ho capito... ho fatto al contrario :eek:
correggo subito :D grazie andbin e thebol!!
leggendo cosa ha detto andbin sui puntatori, se ho capito, questi due codici dovrebbero essere uguali:
int somma (int x, int y)
{
int somma = x + y;
return somma;
}
int main()
{
int polli = 10;
int galline = 10;
int totale = somma(polli,galline);
cout << totale;
return 0;
}
int somma (int x,int y,int *somma)
{
*somma = x + y;
return 0;
}
int main ()
{
int polli = 10;
int galline = 10;
int totale = 0;
somma (polli, galline, &totale);
cout << totale;
return 0;
}
giusto?
giusto?Esatto ... nel secondo caso potresti anche non restituire nulla dalla funzione, cioè void somma (...).
leggendo cosa ha detto andbin sui puntatori, se ho capito, questi due codici dovrebbero essere uguali:
int somma (int x, int y)
{
int somma = x + y;
return somma;
}
int main()
{
int polli = 10;
int galline = 10;
int totale = somma(polli,galline);
cout << totale;
return 0;
}
int somma (int x,int y,int *somma)
{
*somma = x + y;
return 0;
}
int main ()
{
int polli = 10;
int galline = 10;
int totale = 0;
somma (polli, galline, &totale);
cout << totale;
return 0;
}
giusto?
esatto :)
puo servire ad esempio, per passare un oggetto/struttura/array a una funzione, che faccia qualcosa(ordinare l'array ad esempio) sull dato passato per indirizzo.
L'altra soluzione sarebbe passare l'oggetto per copia(in caso di dati grandi non sarebbe coveniente) e usare il valore di ritorno.
scorpion89
13-06-2006, 09:05
( x scorpion89 )Grazie per avermelo fatto notare, ma avevo premesso di non aver capito niente...
Nn era una critica anke xkè ank'io nn sono proprio un esperto :ciapet:
Ciao
ho altre due domande :D
prima: come si fa a capire quali file bisogna includere all'inizio?
seconda: il compilatore mi trova 7 errori in questo codice, ma io nn ne vedo nessuno.../*File da includere*/
#include <iostream>
#include <string>
using namespace std;
/*Dichiarazione delle funzioni*/
float ft2inch(float ft);
float inch2cm(float inch);
float cm2m(float cm);
/*Funzione main*/
int main()
{
float ft;
float inch;
float cm;
float m;
char input;
cout << "Inserisci il tipo di conversione (ft2inch,inch2cm,cm2m): ";
cin >> input;
switch(input){
case ft2inch:
cout << "Inserisci il valore in piedi: ";
cin >> ft;
inch = ft2inch(ft);
cout << ft << " piedi equivalgono a " << inch << " pollici." << endl;
break;
case inch2cm:
cout << "Inserisci il valore in pollici: ";
cin >> inch;
cm = inch2cm(inch);
cout << inch << " pollici equivalgono a " << cm << " centimetri." << endl;
break;
case cm2m:
cout << "Inserisci il valore in centimetri: ";
cin >> cm;
m = cm2m(cm);
cout << cm << " centimetri equivalgono a " << m << " metri." << endl;
break;
default:
cout << "La conversione da te inserita non è supportata. Riprova.";
break;
}
return 0;
}
/*Definizione delle funzioni*/
float ft2inch(float ft)
{
float inch;
float factor = 12;
inch = ft * factor;
return inch;
}
float inch2cm(float inch)
{
float cm;
float factor = 2.54;
inch = cm * factor;
return inch;
}
float cm2m(float cm)
{
float m;
float factor = 100;
m = cm / factor;
return m;
}
ho altre due domande :D
prima: come si fa a capire quali file bisogna includere all'inizio?
seconda: il compilatore mi trova 7 errori in questo codice, ma io nn ne vedo nessuno...
magari posta gli errori ;)
ps.gli include non dovrebbero essere #include <iostream.h>? potrei sbagliarmi, sono anni che non uso il c..
ecco gli errori: (convcond sta x conv-ertitore cond-izionale :D )
1)E2313 Convcond.cpp 20: Constant expression required in function main()
2)E2313 Convcont.cpp 26: Constant expression required in function main()
3)E2172 Convcond.cpp 26: Duplicate case in function main()
4)E2188 Convcond.cpp 27: Expression syntax in function main()
5)E2313 Convcond.cpp 32: Constant expression required in function main()
6)E2172 Convcond.cpp 32: Duplicate case in function main()
7)E2188 Convcond.cpp 33: Expression syntax in function main()
dopo mi spiegate anke come si leggono ;)
ecco gli errori: (convcond sta x conv-ertitore cond-izionale :D )
1)E2313 Convcond.cpp 20: Constant expression required in function main()
2)E2313 Convcont.cpp 26: Constant expression required in function main()
3)E2172 Convcond.cpp 26: Duplicate case in function main()
4)E2188 Convcond.cpp 27: Expression syntax in function main()
5)E2313 Convcond.cpp 32: Constant expression required in function main()
6)E2172 Convcond.cpp 32: Duplicate case in function main()
7)E2188 Convcond.cpp 33: Expression syntax in function main()
dopo mi spiegate anke come si leggono ;)
Notice that switch can only be used to compare an expression against constants. Therefore we cannot put variables as labels (for example case n: where n is a variable) or ranges (case (1..3):) because they are not valid C++ constants.
If you need to check ranges or values that are not constants, use a concatenation of if and else if statements.
impara a usare google ;)
ps. la sintassi degli errori è:
codice errore, file dove e presente l'errore, riga dell'errore: Desc errore e funzione dove è presente l'errore
quindi dov'è l'errore? :mbe:
quindi dov'è l'errore? :mbe:
Notice that switch can only be used to compare an expression against constants. Therefore we cannot put variables as labels (for example case n: where n is a variable) or ranges (case (1..3) because they are not valid C++ constants.
nei case devi mettere delle costanti, ne variabili ne funzioni ;)
case 1 :
case "pippo:
ps.
altra cosa.
tu nella label chiami
case ft2inch:
ft2inch è una funzione, la dovresti chiamare ft2inch(param), anche se li non va bene.
se pensavi che il costrutto switch passasse il valore dello switch alle funzioni assegnate ai case, hai sperato troppo =D.
lho chiamato ft2inch solo xke ftinch era brutto...
praticamente ft2inch, inch2cm ecc ecc sono gli input ke l'utente immette per fargli decidere quale cnversione fare, e non i nomi delle funzioni :p
char input;
cout << "Inserisci il tipo di conversione (ft2inch,inch2cm,cm2m): ";
cin >> input;
lho chiamato ft2inch solo xke ftinch era brutto...
praticamente ft2inch, inch2cm ecc ecc sono gli input ke l'utente immette per fargli decidere quale cnversione fare:
char input;
cout << "Inserisci il tipo di conversione (ft2inch,inch2cm,cm2m): ";
cin >> input;
a ho capito...
mancano gli apici per le stringhe!
switch(input){
case "ft2inch":
mi da lo stesso quei 7 errori >_<
switch(input){
case "ft2inch":No, è sbagliato. Non è così che si comparano delle stringhe e non comunque in un case.
allora devo fare tipo scrivi 1 per ft2inch, 2 x inch2cm ecc ecc?
cosi dpo faccio case 1:, case 2...
siiiiiii ha funzionato!!! grazie!!
Ok ... prova adesso magari a chiedere in input quale conversione effettuare.
fatto :D (ci ho messo 1 mattina ma ce lho fatta XD)
per looppare devo usare do while?
No, è sbagliato. Non è così che si comparano delle stringhe e non comunque in un case.
tru...
per looppare devo usare do while?Ecco un esempio semplice:
#include <iostream>
#include <string>
using namespace std;
float cm2inch (float cm)
{
return cm / 2.54f;
}
float inch2cm (float inch)
{
return inch * 2.54f;
}
int main (void)
{
int input;
int exit=0;
while (!exit)
{
cout << "Inserire il tipo di conversione:" << endl;
cout << " 1 = cm --> inch" << endl;
cout << " 2 = inch --> cm" << endl;
cout << " 0 = ESCI" << endl;
cout << ">> ";
cin >> input;
switch (input)
{
case 0:
exit = 1;
break;
case 1:
float cm;
cout << "Inserisci il valore in centimetri: ";
cin >> cm;
cout << cm << " cm = " << cm2inch (cm) << " inch" << endl << endl;
break;
case 2:
float inch;
cout << "Inserisci il valore in pollici: ";
cin >> inch;
cout << inch << " inch = " << inch2cm (inch) << " cm" << endl << endl;
break;
}
}
return 0;
}
ecco lo stesso codice con la funzione che permette di fare una nuova conversione:
/*File da includere*/
#include <iostream>
#include <string>
using namespace std;
/*Dichiarazione delle funzioni*/
float ft2inch(float ft);
float inch2cm(float inch);
float cm2m(float cm);
/*Funzione main*/
int main()
{
float ft;
float inch;
float cm;
float m;
int input;
int cont;
do {
cont = 0;
cout << "Inserisci il tipo di conversione (1=FtToInch,2=InchToCm,3=CmToM): ";
cin >> input;
switch(input){
case 1:
cout << "Inserisci il valore in piedi: ";
cin >> ft;
inch = ft2inch(ft);
cout << ft << " piedi equivalgono a " << inch << " pollici." << endl;
cout << "Per una nuova conversione premi 1, altrimenti 0: ";
cin >> cont;
break;
case 2:
cout << "Inserisci il valore in pollici: ";
cin >> inch;
cm = inch2cm(inch);
cout << inch << " pollici equivalgono a " << cm << " centimetri." << endl;
cout << "Per una nuova conversione premi 1, altrimenti 0: ";
cin >> cont;
break;
case 3:
cout << "Inserisci il valore in centimetri: ";
cin >> cm;
m = cm2m(cm);
cout << cm << " centimetri equivalgono a " << m << " metri." << endl;
cout << "Per una nuova conversione premi 1, altrimenti 0: ";
cin >> cont;
break;
default:
cout << "La conversione da te inserita non è supportata. Riprova.";
cout << "Per una nuova conversione premi 1, altrimenti 0: ";
cin >> cont;
break;
}
} while (cont != 0);
return 0;
}
/*Definizione delle funzioni*/
float ft2inch(float ft)
{
float inch;
float factor = 12;
inch = ft * factor;
return inch;
}
float inch2cm(float inch)
{
float cm;
float factor = 2.54;
cm = inch * factor;
return cm;
}
float cm2m(float cm)
{
float m;
float factor = 100;
m = cm / factor;
return m;
}
p.s. come si fa uno spoiler? credo che questi codici lunghi diano fastidio :(
lol ho scritto senza vedere i vostri messaggi :D
andbin ho usato lo stesso sistema, ma non ho copiato!! :D
andbin ho usato lo stesso sistema, ma non ho copiato!! :DNessun problema! ;)
lol ... a dire il vero io ho usato il while ma sarebbe stato più giusto e valido il do-while, mettendo nel test direttamente input != 0.
che significa "while (!exit)" ?
che significa "while (!exit)" ?Il '!' è l'operazione del "not", la negazione. All'inizio ho messo exit=0 quindi negato diventa true e quindi cicla fino a quando exit diventa 1.
Ma come dico ... faccio sempre le cose in fretta ... bastava:
do {
...
} while (input != 0);
ma anzike "! exit" non bisognava fare "exit != 0" ?
"! exit" non ha senso..
ho un'altra domanda :D
a che servono le references, se sono una copia esatta della variabile a cui sono assegnate?
ma anzike "! exit" non bisognava fare "exit != 0" ?
"! exit" non ha senso..
Può anche essere implicitato. while(!exit) è la stessa cosa di scrivere while(exit != 0)
ps: le references SONO l'oggetto che passi alla funzione. Servono appunto a modificare direttamente i valori della variabile, senza farne una copia come col passaggio di parametri, e senza preoccuparsi della gestione dell'indirizzo macchina come nel passaggio per indirizzo.
ma anzike "! exit" non bisognava fare "exit != 0" ?Semmai while (exit == 0). Comunque sarebbe stata la stessa cosa. ;)
"! exit" non ha senso..Sì che ha senso!! E si usa sovente la negazione.
In C (e C++, ovviamente) nelle istruzioni di controllo del flusso (if, while, ecc...) l'espressione di test è vera se diversa da 0, altrimenti falsa. Quindi !exit è perfettamente lecito ed anche facilmente comprensibile: "se non exit". Se exit vale zero (falso), la sua negazione è "vero".
ho un'altra domanda :D
a che servono le references, se sono una copia esatta della variabile a cui sono assegnate?Non sono una copia ...
I reference sono un ulteriore metodo di passaggio delle variabili implementato esclusivamente in C++ (e non in C).
Con i reference viene passato fisicamente l'indirizzo della variabile (e non potrebbe essere diversamente) ma non essendo dei puntatori, i reference non possono essere manipolati come se fossero puntatori.
Esempio:
#include <iostream>
using namespace std;
void prova (int &num)
{
num = 20;
}
int main (void)
{
int n = 10;
prova (n);
cout << n << endl;
return 0;
}
ho provato a leggere gli errori ma il numero delle righe non si trova...
x esempio su questo codice:#include <iostream>
using namespace std
mi ha detto che mancava il ; alla riga 4, ma mancava alla 2...
comunque dove posso trovare degli esercizi?
ho cercato con google ma la maggior parte sono esercizi universitari.
se qualcuno conosce un sito me lo puo far sapere?
esiste una funzione in c++ tipo "wait"?
Senza offesa, ma tu pensi di poter imparare un linguaggio come C++ leggendo un tutorial e ponendo ogni tuo minimo dubbio in un thread su questo forum?
Non che tu non debba chiedere risposte ai tuoi dubbi, solo che con C++ tra 10 anni sarai ancora qui che chiedi con questo metodo.
Comprati un bel libro (possibilmente in inglese) e chiuditi in una stanza con quello e un compilatore. :)
Poi se hai dei dubbi chiedi.
ho scaricato thinking in c++ ma non parla del c++, nel senso che non spiega le funzioni o gli array, dice cretinate, tipo quanti spazi si devono mettere per tenere ordinato il source..
ho scaricato thinking in c++ ma non parla del c++, nel senso che non spiega le funzioni o gli array, dice cretinate, tipo quanti spazi si devono mettere per tenere ordinato il source..
fidati leggilo, per iniziare non è affatto malvagio
e l'identazione non è una cretinata ;)
il problema e che anzike iniziare da cout, inizia dalla oop...
maxithron
13-06-2006, 18:09
il problema e che anzike iniziare da cout, inizia dalla oop...
ed a ragion veduta visto che il C++ è un linguaggio oop ;)
Ad ogni modo, puoi sempre integrarlo con molti altri testi. In genere, da un solo testo non è che si riesca sempre a ricavare ogni cosa. Anzi, averne diversi, confrontare i vari approcci, potrebbe rappresentare più un pro che un contro.
yaaaaaaawn... ho letto i primi 3 capitoli... ora solo un bel metro di pizza puo ristabilirmi :D:D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.