AleksandarArkan

Puntatori - esercizi vari

Mar 27th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.75 KB | None | 0 0
  1. //Puntatori da stampare
  2.  
  3. /*-----------------------------------------------------------------------*/
  4. //1)Sostituisci gli elementi dispari di un vettore con lo zero
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. //prototipo funzione
  10. void sostituisci(int *vettore, int n){
  11.     /*questa funzione prende come parametro il vettore e la sua dimensione*/
  12.     while(n>=0){//questo ciclo while viene eseguito tante volte
  13.     //quanto e' la lunghezza del vettore
  14.         if(*(vettore+(n-1))%2==1){//quello che fa e' controllare per ogni elemento
  15.         //del vettore quanto e' il resto dopo averlo diviso per due. se il resto risulta essere
  16.         //uno, vuol dire che e' un numero dispari, quindi da quanto stabilisce l'esercizio dobbiamo
  17.         //sostituire quell'elemento con uno zero
  18.        
  19.         //possiamo notare come: il primo elemento che viene esaminato del vettore sia quello in posizione
  20.         //n-1, questo perche gli indici del vettore vanno da 0 a N-1, quindi accedere alla posizione N non sarebbe
  21.         //valido perche non fa parte del nostro vettore
  22.        
  23.             *(vettore+(n-1))=0;//ricordiamoci che per scrivere proprio nella cella puntata
  24.             //dal puntatore dobbiamo ricordarci di mettere l'asterisco. cioe dobbiamo derefernziare
  25.         }//questo controllo/scansione delle lettere viene fatto a partire dall'ultima e poi indietro
  26.         //verso l'inizio del vettore, cioe da destra verso sinisitra
  27.         n--;//ad ogni iterazione decrmenta n di una unita e' in questo modo esamina il prossimo
  28.         //elemento del vettore.
  29.     }
  30. }
  31.  
  32. /*-----------------------------------------------------------------------*/
  33. //2) Stampa una stringa carattere per carattere
  34.  
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #include <stdio.h>
  38.  
  39. void printCharacters(const char *sptr){
  40.     /*il fatto che ci sia quel const dentro alla partentesi, sta ad indicare
  41.      * che quella variabile che prendiamo in input verra solo elaborata ma
  42.      * non potra' essere modificata. */
  43.    
  44.     //con il ciclo for andiamo a scandire tutta la stringa.
  45.     /*il ciclo for viene iterato tante volte fino a quando la condizione rimane valida,
  46.     cioe questo ciclo scandisce la stringa fino a quando non arriva al carattere terminatore*/
  47.     for(;*sptr!='\0'; sptr++){
  48.         /*La condizione di rimanenza all interno del for, e' finche non troviamo
  49.          * il carattere di terminazione.*/
  50.         printf("%c", *sptr);//ad ogni il giro stampa il carattere puntato dal puntatore.
  51.         /*Finche non trovi il carattere di terminazione stampa il carattere*/
  52.         }
  53. }
  54. /*-----------------------------------------------------------------------*/
  55. //3) Converti stringa da minuscolo a maiuscolo
  56.  
  57. /*questa funzione prende come parametro una stringa, e quello che fa e' andare a convertire la stringa
  58. da minuscolo a maiuscolo.*/
  59. void upper(char *str1){
  60.     while(*str1!='\0'){//il ciclo while dice, scandisci/scansiona la stringa fino a quando
  61.     //non trovi il carattere terminatore
  62.        
  63.         //ad ogni giro controlla
  64.         //se il codice asci indica una lettera minuscola,
  65.         //se lo e', trasformala in maiuscola sottraendo -32
  66.         if(*str1>96 && *str1<123){
  67.             *str1=*str1-32;
  68.         }
  69.     str1++; //passa ad esaminare il prossimo carattere
  70.     }
  71. }
  72.  
  73. /*-----------------------------------------------------------------------*/
  74. //4)Calcola lunghezza della stringa
  75.  
  76. #include <stdlib.h>
  77. #include <string.h>
  78. #include <stdio.h>
  79.  
  80. int mystrnlen(char *s){
  81.     char *p=s;//dichiara un puntatore che si chiama *p, poi fai puntare P all inizio
  82.     //della stringa, poi lascialo fermo li, e usando il parametro come puntatore
  83.     //scorri la stringa fino a quando non arrivi alla fine , cioe al carattere di terminazione.
  84.    
  85.     //ora quello che avremmo saranno due puntatori, uno che punta al primo carattere della stringa, \
  86.     //ed uno che punta al secondo carattere della stringa. per sapere quanti elementi ci sono
  87.     //facciamo la sottrazione tra puntatori
  88.    
  89.     while(*s!='\0'){
  90.         /*Faccio scorrere il puntatore s della stringa, fino alla fine ossia fino a quando non
  91.          * incontra il carattere '\0'*/
  92.         s++;//faccio avanzare il puntatore in avanti
  93.     }
  94.    
  95.     return s-p;
  96.     /*Alla fine, il puntatore p puntera' ancora alla prima posizione della stringa
  97.      * mentere il puntatore s puntera' all ultima posizione. per trovare la lunghezza
  98.      * della stringa, ossia il numero di elementi, basta che facciamo la differenza tra
  99.      * puntatori e otteniamo il risultato.*/
  100.    
  101.     }
  102.  
  103. /*-----------------------------------------------------------------------*/
  104. //5)Copia le due stringhe in una terza stringa
  105.  
  106. #include <stdlib.h>
  107. #include <string.h>
  108. #include <stdio.h>
  109.  
  110. /* Questa funzione prende in input tre parametri, il primo parametro
  111.  * e' la stringa sulla quale ricopiare il secondo parametro, che anche esso
  112.  * e una stringa. il terzo parametro invece, e' un numero, un intero, che
  113.  * ci dice quanti caratteri del secondo parametro vanno ricopiati nella
  114.  * prima stringa.*/
  115.  
  116. void mystrncpy(char *dest, char *source, int n){
  117.     //i parametri si chiamano destinazione, source, numero
  118.     while(*source && n-->0){/*il while continua fino a quando non e' terminata la stringa dalla quale stiamo
  119.     //ricopiando , e fino a quando non abbiamo terminato il numero di lettere da scriver*/
  120.     //le due condizioni devono essere legate, perche la stringa non deve essere finita e inoltre non devo aver
  121.     //terminato il numero di lettere da copiare.
  122.  
  123.     //perche se metessimo un OR in mezzo a queste due, per far girare il ciclo basterebbe anche che N non sia ancora
  124.     //zero ma paradossalmente la stringa dalla quale stiamo copiando gli N caratteri e' terminata, e noi anche se abbiamo
  125.     //n caratteri da copiare, non abbiamo da dove farlo perche la stringa e' terminata
  126.    
  127.         /* *source usata in questo modo come condizione del ciclo sta a dire
  128.          * finche e' vera, cioe finche non arriviamo al carattere '\0', infatti
  129.          * il carattere '\0' e' uno zero, e lo zero codifica il falso. in poche
  130.          * parole scrivere *source vorrebbe dire "finche e' vera".
  131.          * la seconda parte dell and invece, conta quanti ancora caratteri sono
  132.          * rimasti da copiare.*/
  133.        
  134.         *dest++=*source++;//qui viene fatta la copia della stringa vera e propria
  135.        
  136.         /*Finche le condizioni del while sono vere, ricopia i caratteri della stringa
  137.          * source dentro a dest. */
  138.        
  139.         }
  140.        
  141.     /*perche andiamo a calcolare questo extra? per vedere se nella stringa di destinazione
  142.     ci sono altre lettere oltre a quelle che abbiamo appena ricopiato, e questo lo sapremo facendo la lunghezza
  143.     della stringa destinazione meno il numero di caratteri ricopiati (cioe meno n). se ci sono solo
  144.     le n lettere, allora il risultao di questa operazione dovrebbe dare 0, altrimenti quello che ci verra' fuori ci dice
  145.     quante lettere dobbiamo ancora scorrere prima di mettere il carattere di terminazione */
  146.    
  147.     int extra =strlen(dest)-n;
  148.    
  149.     /*Se extra vale 0, vuol dire che nella stringa dest ci sono solamente gli elementi
  150.      * che ho appena ricopiato, se invece extra e' > di zero, allora vuol dire che ho
  151.      * altre lettere in quella stringa dest, allora in base a quante sono, scorro
  152.      * la stringa fino alla fine e metto il carattere terminatore. */
  153.    
  154.     while(extra-->0){
  155.         *dest++;//scorri la stringa
  156.     }
  157.    
  158.     *dest='\0';
  159.     /*Metto il carattere terminatore*/
  160. }
  161.  
  162. /*-----------------------------------------------------------------------*/
  163. //6)Confronta N caratteri della seconda stringa con la prima stringa
  164.  
  165. #include <stdlib.h>
  166. #include <string.h>
  167. #include <stdio.h>
  168.  
  169. /*Questa funzione prende due stringhe ed un intero, quello che fa e andara a
  170.  * confrontare gli n caratteri della seconda stringa se sono uguali alla prima stringa.*/
  171.  
  172. int mystrncmp(char *lhs, char *rhs,int n){
  173.     for(;*lhs==*rhs;lhs++,rhs++){
  174.         /*La condizione di rimanenza all interno del for e' data dalla condizione
  175.          * che i due caratteri esaminati delle due stringhe siano uguali, una volta
  176.          * assicurati che si tratti di un due caratteri uguali andiamo a controllare se per
  177.          * caso non siamo arrivati alla fine dei caratteri della prima stringa (e quindi non abbiamo
  178.          * piu con cosa confrontare i cartteri della seconda stringa) o se per caso siano finiti il numero
  179.          * di caratteri da confrontare della seconda stringa (n<=0)*/
  180.         if(*lhs=='\0' || n--<=0){
  181.             return 0;
  182.             printf("Sondo dentro all'if");
  183.         }
  184.        
  185.     }
  186.     /*come risultato viene ritornato questo, perche nel caso delle due stringhe uguali (e anche di dimensioni uguali)
  187.     alla fine del controllo, se i due caratteri puntati dai due puntatori sono uguali, la loro differenza fara' zero, funziona
  188.     anche con le sottostringhe. se alla fine del controllo , che avverra' con l uscita dal ciclo perche o e' finita la stringa uno
  189.     o sono finiti il numero di caratteri da conforontare, andranno fatta la differenza tra due puntatori, e quindi se sono uguali le stringhe
  190.     o si tratta di una sottostringa, ci verra' restituito zero*/
  191.  
  192.     return *lhs-*rhs;
  193.  
  194.     //la funzione in questione restituisce zero per dire che le due stringhe sono uguali, altri valori altrimenti
  195.     }
  196.  
  197.  
  198.  
  199.  
  200.  
  201. /*-----------------------------------------------------------------------*/
  202. //7)Confronto due stringhe|Puntatori|Tengo presente il case
  203.  
  204. int scmp(char *s1, char *s2){
  205.     //il controllo del if va a controllare che le due stringhe che l'utente ha inserito
  206.     //non siano stringhe vuote
  207.    
  208.     if(*s1!='\0' && *s2!='\0'){
  209.         //dalla condizione del while possiamo capire
  210.         //che e' richiesto che ogni volta, che si confronta le due
  211.         //lettere tra le due stringhe, perche la condizione sia vera,
  212.         //o si deve trattare di due lettere maiuscole, o si deve trattare
  213.         //di entrambe le lettere minuscole. se ce una stessa lettera, ma in
  214.         //una stringa e' maisucola, e nell'altra e'minuscola, non vengono
  215.         //ritenute come due lettere uguali.
  216.         //infatti questo programma e' case sensitive
  217.        
  218.         //se le due stringhe non suo vuote allora fai il controllo con il while.
  219.         //il while richiede
  220.         //1 condizione)che si tratti due caratteri uguali, due maiuscole oppure due minuscole
  221.         //2 condizione) la seconda condizione richiede che ci sia almeno una stringa
  222.         //che non sia ancora terminata. quindi questo ciclo va avanti finche i due caratteri esaminati
  223.         //sono uguali e finche non sono terminate tutte e due le stringhe
  224.         while(*s1-*s2==0 && (*s1!='\0' || *s2!='\0' ))
  225.             s1++;//avanza il puntatore della stringa 1
  226.             s2++;//avanza il puntatore della stringa 2
  227.         }
  228.     return (*s1-*s2);//se sono uguali dara' zero.
  229. }
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257. /*-----------------------------------------------------------------------*/
  258. //8)Confronta due stringhe | Puntatori |Ignoro il case sensitive
  259.  
  260. int scmpi(char *s1, char *s2){
  261.     if(*s1!='\0' && *s2!='\0' ){
  262.         /*Controllo che l utente non abbia inserito magari due stringhe vuote. Se lo due stringhe non
  263.          * sono vuote procedo allora con il while. */
  264.        
  265.         while((*s1-*s2==0 || *s1-*s2==32 || *s1-*s2==-32 ) && (*s1!='\0' || *s2!='\0')){
  266.             /*La condizione del while e' suddivisa in due parti, la prima e' data da 3 controlli che devono stabilire , se i due
  267.              * caratteri correnti, della prima e seconda stringa facciano parte di una delle 3 combinazioni. la seconda parte del while
  268.              * invece richiede come requisito per continuare, che almeno ci sia almeno una stringa che non sia finita. */
  269.                 s1++;
  270.                 s2++;
  271.         }
  272.        
  273.     }
  274.     return (*s1-*s2);
  275.     /*Se le due stringe sono uguali alla fine i due puntatori punteranno entrambi al carattere terminatore, il che
  276.      * vuole dire che avranno valore 0, quindi se sono uguali questa sottrazione ci dara' come risultato 0 */
  277. }
  278.  
  279.  
  280. /*-----------------------------------------------------------------------*/
  281. //9)Conta gli zeri di un vettore usando i puntatori
  282.  
  283. //conta gli 0 di un vettore usando i puntatori
  284. int contazeri(int *a, int n){
  285.     int *puntatore=a;
  286.     //dichiaro un puntatore che punta al primo elemento del vettore a appena inserito dall'utente
  287.     if(*(puntatore+(n-1))==0)//se l'elemento puntato dal puntatore e' uguale ad uno zero, allora contalo sommando il 1
  288.     //e richiama la stessa funzione ricorsivamente, questa volta pero' esaminando il carattere precedente
  289.         return 1+contazeri(a,n-1);
  290.     else
  291.         return 0+contazeri(a,n-1);//non contare il carattere richiama la funzione
  292.    
  293. }
  294.  
  295. /*-----------------------------------------------------------------------*/
  296. //10) Copia la prima stringa, ed N caratteri della seconda stringa, in un altra stringa
  297.  
  298. /*Questa funzione prende come paramteri 3 stringhe, e un intero.
  299.  * Quello che fa e' ricopiare la stringa1 nella stringa destinazione
  300.  * e copiare n caratteri della stringa2 anche essi nella stringa di destinazione.
  301.  * quindi nella stringa destinazione noi avremmo tutta la stringa1 e n caratteri
  302.  * della stringa2*/
  303.  
  304.  
  305.  
  306. void mystrncat(char *str1, char *str2, char *dest, int n){
  307.     while(*str1){
  308.         /*La condizione presente al interno del ciclo while
  309.          * sta a dire "finche e' vera stringa1, cioe finche non trovi
  310.          * il carattere terminatore della stringa1 tu fai quella cosa specificata
  311.          * all interno del ciclo."*/
  312.             *dest++=*str1++;
  313.             /*Quello che devi fare e' ricopiare i caratteri della prima stringa all
  314.              * interno della stringa destinazione*/
  315.     }  
  316.     while(n-->0 && *str2!='\0'){
  317.         /*Qui invece nel while abbiamo un contatore che ci indica quante caratteri della
  318.          * seconda stringa dobbiamo copiare nella stringa di destinazione.
  319.          * Abbiamo anche la condizione che *str2 deve essere diverso dal carattere terminatore.
  320.          * in poche parole noi dobbiamo ricopiare le lettere finche n non arriva a zero, oppure
  321.          * finche la seconda non arriva alla fine. in questo modo con questa condizione , se noi imettiamo
  322.          * che devono essere copiati n caratteri piu di quanti ci sono nella stringa2 allora
  323.          * verra copiata tutta la stringa. e noi usciremo dal while, perche arrivera' il momento in cui
  324.          * il caratteri esaminato sara' uguale a '\0'. e quindi la condizione *str2!='\0' non sara piu verificata.*/
  325.         *dest++=*str2++;
  326.     }
  327.    
  328.     *dest++='\0';
  329.     /*Alla fine aggiungiamo il carattere di terminazione*/
  330. }
Advertisement
Add Comment
Please, Sign In to add comment