programmare in C, primi passi

« Older   Newer »
  Share  
view post Posted on 9/9/2012, 18:06
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ciao a tutti, sto vedendo un po' le funzioni ARCG e ARGV

Praticamente io posso passare al main degli argomenti giusto?
Con argv, leggo gli argomenti, mentre con arcg li salvo.

se io scrivo questa porzione di codice

#include <stdio.h>
main(int argc, char **argv) {
printf ("Nome dell'eseguibile in esecuzione: %­s\n",argv[0]);
}

l'output sarà :nome dell'eseguibile in esecuzione:c:\user gila\progetto1.exe.
ma non capisco bene come sfruttare sta cosa, se io richiamo via dos il programma progetto1.exe posso passare degli argomenti, ma non capisco bene la logica
e il manuale non è molto chiaro
 
Top
view post Posted on 9/9/2012, 21:11
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Forse ho capito, permette di immettere argomenti, e quindi dati dal prompt di dos:


#include <stdio.h>
main(int argc, char **argv) {
int i;
int r;

printf ("Argomenti passati al programma:\n");
printf ("%­s\n ",argv[0]);
printf ("%­s\n ",argv[1]);

r=atoi((argv[1]));
r=r+20;
printf ("R=%d\n ",r);

getch ();
return 0;

}

questo programmino se lo lancio da dos, andando sulla directory giusta.... cioè gila\progetto.exe 10 (argomento passato al main)
mi restituisce la somma, cioè 32
Infatti converto con atoi la stringa in numero intero e sommo 20, ora R varrà R+argomento immeso.
Ma non capisco bene l'utilità: in dos lo fa, ma se lancio l'exe da dave C++ non fa nulla.
 
Top
Elemento 38
view post Posted on 10/9/2012, 01:45




argc e argv non sono funzioni, ma parametri che puoi passare (o devi passare se il programma è fatto in un certo modo) da riga di comando quando lo mandi in esecuzione. argc è un int che ti restituisce il numero di argomenti passati, argv è il puntatore agli argomenti.
Se lanci l'eseguibile non fa niente perché aprendo solo l'eseguibile non gli passi parametri.
 
Top
view post Posted on 10/9/2012, 17:13
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
argc e argv non sono funzioni,

vero...pardon ;)

CITAZIONE
Se lanci l'eseguibile non fa niente perché aprendo solo l'eseguibile non gli passi parametri.

Infatti, ivece se lancio da dos riesco a farlo giusto?

Forse l'avevo già chiesto, non lo so, ma come faccio a a fare il debug (io uso dec c++).
Abituato all'assember (coi pic), dove puoi vedere registro per registro tutto quello che succede, così, mi trovo un po' spaesato.

so che sono domande un po' sciocche, le classiche domande che si fanno quando s'inizia a muovere i primi passi...portate pazienza :)


Edited by GILA75 - 10/9/2012, 18:44
 
Top
view post Posted on 12/9/2012, 21:16
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


ok, per il debug ho risolto.....
 
Top
view post Posted on 13/9/2012, 20:49
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ragazzi, ho bisogno di una mano. Sto seguendo il manuale e mi sono imbattuto in un esempio di funzione ricorsiva, qui fa vedere una routine per il calcolo fattoriale, senza usare il
ciclo for e la variabile d'appoggio usata come contatore.
ecco il codice

*******************************************************

int main() {
int n;
printf ("Inserire un numero intero: ");
scanf ("%d",&n);
printf ("Fattoriale di %d: %d\n",n,fat(n));

getch();
return 0;
}
int fat(int n) {
if (n==1){
return 1;}
else return n*fat(n-1);}

********************************************************

è molto semplice, ma al tempo stesso mica tanto per un principiante.
Va bhè le prime righe chiedono l'input numerico.
Nella PRINTF, c'è la chiamata alla funzione FAT(INT N)
int n è l'argomento (numero) che passiamo alla funzione fat

**********************************

int fat(int n) {
if (n==1){
return 1;}
else return n*fat(n-1);}

**********************************

non capisco bene la riga else return.
Se io immetto come input il numero 4 la riga dovrebbe fare:
4*fat(4-1)=12 ma il 12 poi, vine memorizzato ancora in fat (n) alla riga di printf, vero?
in modo tale che alla seconda chiamata, l'argomento passato, non sarà più il 4 iniziale, ma il numero 12, per poi fare:
12*fat(3-1)=24 (fattoriale di 4 in effetti)... giusto?
in poche parole:
4*(4-1)=12 (nuovo argomento, nuovo input)
12*(3-1)=24 (nuovo arg, nuovo input)
24*(2-1)=24 e qui il programma tramiti if n==1, termina.

Praticamente passo un argomento iniziale (il numero 4), questo viene elaborato dalla funzione, per poi essere passato come argomento, per una nuova funzione, ho capito bene?
la riga if (n==1), dice se arrivi a n=1 hai finito.
Non mi è chiaro bene come faccia a tenere traccia di n che decrementa di 1 però, e anche il return 1.
Penso che con return 1 si torni alla fine della chiamata principale...un po' come return per le call in assembly, ma non vorrei dire vaccate.
Comunque, la cosa più importante è se ho detto giusto. Credo che per funzione ricorsiva, s'intenda proprio quello...passi un input, che poi viene elaborato, per diventare a sua volta
l'input principale, finchè il processo non termina a seconda dei requisiti richiesti.
Sono 2 righe stupide, ma anche un po' complicate (se ho inteso giusto).....

Edited by GILA75 - 15/9/2012, 16:49
 
Top
view post Posted on 18/9/2012, 08:24
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


metto un piccolo programmino d'esercizio con le stringhe, riesce a stabilire se una parola si può leggere indifferentemente sia da dx, che da sx (palindromi).
Non ho trovato nella libreria <string.h> una funzione che facesse tutto il lavoro.
Principalmente, la cosa che mi serviva, era avere una funzione, che data una stringa di lunghezza esempio 10, mi facesse la lettura in una stringa copia partendo a copiare dalla posizione 10...cioè

stringa 1

0 1 2 3
C A S A

io volevo una funzione che leggesse dalla posizione 3 alla posizione 0, copiando in senso inverso però

stringa copia:
0 1 2 3
A S A C

comunque, il programma funziona, non ha nessuna utilità, però credo che il miglior metodo, sia inventare un po'.
Se ci sono modi migliori, fate un fischio ;)

***********************************************************
#include <stdio.h>
#include <string.h>


int main() {
int conta;
int i;
i=0;

char stringa[30]=""; // inizializzo la stringa vuota
char stringa_due[30]=""; // inizializzo la stringa due vuota
printf ("immetti parola MAX 30 caratteri: \n");
scanf ("%­s",stringa); //immetto parola
conta=strlen(stringa); //eseguo controllo lunghezza caratteri (STRLEN)
conta=conta-1; // lunghezza=lunghezza-1

for (i=0; i<=conta; ++i ) { // conta da 0 a lunghezza stringa e incrementa i di 1
stringa_due[i]=stringa[conta-i]; // copia la lettura sopra in stringa due, mettendo le lettere invertite casa= a(posizione 4) in stringa 2 va in posiz 1

}


if (strcmp(stringa,stringa_due)==0){ // compara le due stringhe es: st originale= casa stringa_due=asac
printf("parola PALINDROMA"); // se strcmp da zero, stampa palindrome, altrimenti, salta
getch();
return 0;}
else
printf("parola NON PALINDROMA");
getch();
return 0;}

****************************************************


PS: LAW....ma come si fa per fargli tenere gli spazi giust???!!!***@@@@@//// mannaggia!!!!!!!! non si capiscono i commenti dopo il //
 
Top
view post Posted on 24/10/2012, 20:01
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ciao a tutti, vedo che l'argomento non suscita molto interesse...pazienza, non posso mica obbligarvi :) Ma magari non è che qualcuno potrebbe darmi delle dritte sulle liste dinamiche?
In rete, si trovano esempi molto complessi, so che sono una struttura più un puntatore, non benissimo, ma ho studiato precedentemente entrambi. Se qualcuno magari posta righe di codice
un po' semplice :)
 
Top
thermidor
view post Posted on 24/10/2012, 21:27




Mi spiace io uso solo il Pascal (e pure male).
 
Top
Elemento 38
view post Posted on 25/10/2012, 07:06




https://dl.dropbox.com/u/32131829/linkedlist.c
https://dl.dropbox.com/u/32131829/linkedlist.h
https://dl.dropbox.com/u/32131829/main.c

Questa è la mia libreria con un main di esempio di gestione delle Linked List, prova a dare un occhio a questa. Se hai domande chiedi pure, ma ti dico già da ora che non ho tantissimo tempo per stare sul forum, ci vengo solo ogni tanto :)
 
Top
view post Posted on 27/10/2012, 08:26
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Grazie mille Ele :) . Cercherò di capirle, in fondo le liste dovrebbero essere semplici, almeno così si dice nel web....ma è un sistema apparentemente semplice mi sa, è molto ingegnoso. Alla fine sono dei dai strutturati con puntatori, e allocati dinamicamente in memoria con malloc... ma così sembra tutto facile, ma non lo è.

Io sto studiando da qui, sembra fatto bene:

www.dis.uniroma1.it/~liberato/struct/liste/index.shtml

Ho visto proprio ora Ele, che accenni alle strutture e alle liste nel 3d sull'esapedone, guarderò bene anche quello ;)

Edited by GILA75 - 27/10/2012, 12:03
 
Top
view post Posted on 15/11/2012, 21:14
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Bene, ho capito grosso modo il meccanismo delle liste, come detto prima, semplice e al tempo stesso difficile. Devo digerirlo per bene e capire ancora i dettagli, comunque
ho fatto un programmino, traendo spunto da siti, e dalla libreria di Elemento 38 (per'altro preziosissima....grazie ancora Ele).
Per ora ho fatto solo la stampa, e la stampa dell'ultimo elemento.
Adesso vorrei stampare in senso contrario, cioè partire dalla coda (tail) e stampare fino alla testa (Head).

la stampa dice : scansiona da Head, fino a che trovi il puntatore NULL e a ogni ciclo aumenta di una struttura, cioè punta alla struttura successiva.
Io inizialmente avevo pensato di fare il contrario cioè, parti da NULL e vai fino a head, ma non si può, essendo il puntatore alla struttura successiva a senso unico....
Forse invece bisogna fare un ulteriore puntatore, che punta alla struttura precedente e tiene traccia, ma non lo so, sono alle prime armi con le liste.

Bhò, se avete consigli, io intanto ci studio su e guardo ancora i manuali e tutto quanto :)
 
Top
Elemento 38
view post Posted on 16/11/2012, 02:05




Funzioni ricorsive!
Stampare partendo dalla testa:

void printFromHead(node* node){
printf(...);
if(node->next)
printFromHead(node->next);
}

void printFromTail(node* node){
if(node->next)
printFromTail(node->next);
printf(...);
}

Ovvio a queste funzioni devi passare comunque la testa. Se no puoi fare una nuova struttura che punta anche all'elemento precedente, oltre che a quello successivo.
 
Top
view post Posted on 16/11/2012, 20:13
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Stampare partendo dalla testa:

Ma in che senso? Io intendo l'esatto contrario
Io ho fatto una lista, che mi chiede 3 elementi:
scrivo in ordine
1
2
3
essendo 3 l'ultimo elemento (head), mi stampa 3,2,1 e io voglio che faccia 1,2,3.
Ma noto che sono 2 routines in effetti e la seconda si chiama stampa da coda, quindi è facile che stia fraintendendo io.
Comunque ci provo e metto la mia routine coi nomi giusti, giusto per convezione come fanno tutti con node ecc, io ho dato dei nomi un po' a caso che però confondono e basta.
Grazie Ele ;)


 
Top
view post Posted on 25/11/2012, 22:41
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ci sto dando sotto con le funzioni ricorsive, ma sono abbastanza complicate, o perlomeno non ho ancora la padronanza necessaria.
Comunque io ho risolto in un altro modo per la stampa rovesciata
Supponiamo d'immettere una lista

1
2
3
4
5
6


dove il 6 sarà la testa della lista e 1 è la coda, poi ovviamente c'è il puntatore NULL dopo 1. Quindi le strutture hanno un solo verso, cioè da 6 a 1.
Se io sono alla testa della lista e dico al programma di puntare la struttura successiva, mi punterà la struttura contenente il numero 5.
Quindi in una stampa normale io potrei fare un ciclo for, dove dico parti dalla testa e arriva fino alla coda incrementando di una struttura, finchè non arrivi a NULL

quindi mi stamperebbe da head(testa) a tail (coda)

6
5
4
3
2
1

Per stampare in senso inverso:

Il problema è che io posso risalire alla struttura di coda manualmente, ma non posso puntare nulla, essendo i puntatori a senso unico.
Se io vado in coda (numero 1) e dico al programma: punta la struttura successiva, windows mi da" questo programma ha smesso di funzionare".
Perchè tento di andare in una zona di memoria che non ho adibito, punto ad un indirizzo non valido (non sono sicuro sia proprio così, ma comunque va in crash).
Ma potrei fare un ciclo for che mi fa risalire alla struttura di coda e stampa:
primo ciclo stampa

1
secondo ciclo 2
terzo ciclo 3
quarto ciclo 4
ecc....

In definitiva fare un ciclo for, che torna indietro di tante quante sono le strutture (nel mio caso 6), quindi mi va a 1
poi all'esterno una altro ciclo for.

In poche parole dico: fammi tanti cicli quante sono le strutture, ma al primo giro mi vai all'ultimo elemento, al secondo al pen'ultimo, al terzo al terz'ultimo, finchè non arrivo alla testa, e la
stampa rovesciata è fatta.
Un gran casino da dire, ma sono solo 2 cicli for nidificati dove quello esterno aumenta, mentre quello interno diminuisce.
Funziona, ma vorrei sapere pro e contro. Chi conosce le liste avrà capito questo mio sproloquio.
 
Top
31 replies since 16/4/2012, 10:44   689 views
  Share