AleksandarArkan

Allocazione Dinamica - vari esempi

Mar 27th, 2015
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.64 KB | None | 0 0
  1. //Allocazione dinamica
  2.  
  3. /*-----------------------------------------------------------------------*/
  4. //1)Duplica un array preso in input |Rialloca la memoria
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. //funziona
  8.  
  9. //prototipo della funzione
  10. int *dupplica_array(int *array, int dim);
  11.  
  12. int main(){
  13.     int *p;
  14.     int numero;
  15.    
  16.     printf("inserisci la dimensione del vettore: ");
  17.     scanf("%d", &numero);
  18.    
  19.     p=(int*)malloc(sizeof(int)*numero);
  20.     printf("inserisci gli elementi : \n");
  21.     int i;
  22.     for(i=0;i<numero;i++){
  23.         printf("inserisci elemento: \n");
  24.         scanf("%d", &p[i]);
  25.     }
  26.    
  27.     p=realloc(p,2*numero);
  28.    
  29.     dupplica_array(p,numero);
  30.    
  31.    
  32.    
  33.     printf("stampo array : \n");
  34.     for(i=0;i<numero*2;i++){
  35.         printf("elemento %d \n", *p);
  36.     }
  37.     free(p);
  38.  
  39.     return 0;
  40.    
  41. }
  42.  
  43. //definizione della funzione
  44.  
  45. int *dupplica_array(int *array,int dim){
  46.     int *duplicato;
  47.     //alloco la memoria. ma devo per forza???
  48.     //non potrei dichiare un vettore normale, e poi fare
  49.     // return vettore alla fine?
  50.    
  51.     duplicato=(int *)malloc(sizeof(int)*2*dim);
  52.     //ricopio la prima volta
  53.     int i;
  54.    
  55.     for(i=0;i<dim;i++){
  56.             duplicato[i]=array[i];
  57.     }
  58.     for(i=dim;i<dim*2;i++){
  59.         duplicato[i]=array[i];
  60.     }
  61.    
  62.     return duplicato;
  63. }
  64.  
  65. /*-----------------------------------------------------------------------*/
  66. //2)Sostituisci spazi con underscore | All.dinamica
  67.  
  68. #include <stdio.h>
  69. #include <stdlib.h>
  70.  
  71. /*3)scrivere un programma che preso in input una stringa, usando l'aritmetica dei puntatori, sostituisca gli spazi vuoti
  72. con il simbolo _*/
  73.  
  74. void sostSpazi(char *stringa);
  75.  
  76. int main(){
  77.     char *stringa;
  78.     int dimensione;
  79.     //in questo esercizio devo passare al programma una stringa
  80.     //quello che posso fare e' andare a chiedere all'utente quanti
  81.     //caratteri avra' la sua stringa, allocare la dimensione necessaria,
  82.     //e poi fare la lettura.
  83.    
  84.     printf("Quanti caratteri avra' la tua stringa\n");
  85.     scanf("%d", &dimensione);
  86.    
  87.     getchar();;
  88.    
  89.     //alloco la memoria necessaria
  90.     int numcar;
  91.     numcar=dimensione+1;
  92.     stringa=(char *)malloc(sizeof(char)*numcar);
  93.    
  94.     printf("Inserisci la tua stringa: \n");
  95.     fgets(stringa,dimensione,stdin);
  96.    
  97.     sostSpazi(stringa);
  98.    
  99.     printf("Dopo la sostituzione degli spazi la stringa risulta: \n");
  100.     printf("%s", stringa);
  101.     return 0;
  102.    
  103.    
  104.     }
  105.  
  106. //definizione della funzione
  107. void sostSpazi(char *stringa){
  108.     while(*stringa!='\0'){
  109.         if(*stringa==' ')
  110.             *stringa='_';
  111.         stringa++;
  112.         }
  113.    
  114.     }
  115.    
  116. /*-----------------------------------------------------------------------*/
  117. //3)Sostituisci el. dispari con gli zeri |All.dinamica
  118.  
  119. /*1) scrivere un programma che preso in input un vettore e la sua dimensione, usando l'aritmetica dei puntatori, rimpiazzi
  120. tutti i numero dispari con uno zero*/
  121.  
  122. #include <stdio.h>
  123. #include <stdlib.h>
  124.  
  125. //prototipo funzione
  126. void sostituisci(int *vettore, int n){
  127.     while(n>=0){
  128.         if(*(vettore+(n-1))%2==1){
  129.             *(vettore+(n-1))=0;
  130.         }
  131.         n--;
  132.     }
  133. }
  134.  
  135. //main di prova
  136. int main(){
  137.     int *p;
  138.     int numero;
  139.     int i;
  140.    
  141.     printf("quanti elementi avra' il tuo vettore: \n");
  142.     scanf("%d", &numero);
  143.    
  144.    
  145.    
  146.    
  147.     p=(int *)malloc(sizeof(int)*numero);
  148.     //chiamo la funzione
  149.    
  150.     //inserisco gli elementi nel vettore
  151.     printf("Inserisci gli elementi nel vettore: \n");
  152.     for(i=0;i<numero;i++){
  153.         printf("inserisci elemento in posizione%d \n",i+1 );
  154.         scanf("%d", &p[i]);
  155.     }
  156.    
  157.     sostituisci(p,numero);
  158.    
  159.    
  160.     //stampo il nuovo vettore dopo la sostituzione degli elementi
  161.     //dispari con il numero zero
  162.     printf("dopo l'effetto della funzione: \n");
  163.     for(i=0;i<numero;i++){
  164.         printf("%d ", p[i]);
  165.         }
  166.        
  167.        
  168.     return 0;
  169. }
  170.  
  171.  
  172.  
  173. /*-----------------------------------------------------------------------*/
  174. //4) Rendi maiuscole la prima lettere di ogni parola di una frase
  175.  
  176. #include <stdio.h>
  177. #include <stdlib.h>
  178. #include <string.h>
  179. /*4)scrivere un programma che presa in input una stringa renda maiuscole tutte le prime lettere di ogni parola
  180. della stringa*/
  181.  
  182. void maiusc(char *stringa);
  183.  
  184. int main(){
  185.     char *s;
  186.     int numero;
  187.     int dimensione;
  188.    
  189.     printf("Quanti elementi avra' la tua stringa: \n");
  190.     scanf("%d", &dimensione);
  191.     numero=dimensione+1;
  192.    
  193.     //alloco la memoria
  194.     s=(char *)malloc(sizeof(char)*numero);
  195.    
  196.     getchar();
  197.     printf("inserisci la stringa: \n");
  198.     fgets(s,dimensione, stdin);
  199.    
  200.    
  201.    
  202.     maiusc(s);
  203.    
  204.     printf("Dopo la modifica : %s", s);
  205.     free(s);
  206.     return 0;
  207.  
  208.     }
  209.    
  210. void maiusc(char *stringa){
  211.     toupper(stringa[0]);
  212.     while(*stringa!='\0'){
  213.         if(*stringa==' '){
  214.             stringa++;
  215.             //dopo essere passato al carattere successivo, controllo che il carattere
  216.             //in oggetto sia minuscolo, perche se e gia maiuscolo non ha senso che
  217.             //faccia qualcosa.
  218.             //quindi noi passiamo alla lettera maiscola, dopo che abbiamo incontrato
  219.             //uno spazio e dopo che ci siamo assicurati che il carattere non e' gia maiuscolo
  220.             //ma e' minuscolo
  221.             if(*stringa>96 && *stringa<123){
  222.             *stringa=*stringa-32;
  223.             stringa++;
  224.             }      
  225.          }
  226.         stringa++;
  227.     }
  228. }
  229.  
  230. /*-----------------------------------------------------------------------*/
  231. //5)Copia una stringa all’interno di una stringa allocata dinamicamente
  232.  
  233. #include <stdio.h>
  234. #include <stdlib.h>
  235. #include <string.h>
  236.  
  237. //scrivere la funzione ricorsiva stringCopia che
  238. //copia una stringa all'interno di un altra
  239.  
  240. //vado anche ad allocare dinamicamente la stringa di destinazione
  241.  
  242. //prototipo
  243. void stringCopia(char *destinazione, char *sorgente);
  244.  
  245. //main di prova
  246. int main(){
  247.     char stringa[80];
  248.    
  249.     printf("Inserisci la stringa : MAX 80 char \n");
  250.     fgets(stringa,80,stdin);
  251.    
  252.     //quanto spazio sto allocando ora? 80, o la lunghezza inserita dall'utente ricavata con strlen?
  253.     char *p;
  254.     p=(char *)malloc(strlen(stringa)+1);
  255.     stringCopia(p,stringa);
  256.     printf("Stampo la stringa : \n : %s", p);
  257.    
  258.     free(p);
  259.     return 0;
  260.    
  261. }
  262.  
  263.  
  264. //definizione della funzione
  265. void stringCopia(char *destinazione, char *sorgente){
  266.     if((*destinazione=*sorgente)!='\0')
  267.         stringCopia(++destinazione,++sorgente);
  268.         //cosi funziona ma se metto nella riga sopra
  269.         //destinazione++, e sorgente++ mi va in segmentatio fault
  270.     else
  271.         *destinazione='\0';
  272.    
  273. }
  274.  
  275. //ricordarsi che strlen non conta il carattere di terminazione
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286. /*-----------------------------------------------------------------------*/
  287. //6) Somma gli elementi di una porzione di un array allocato dinamicamente
  288.  
  289. #include <stdio.h>
  290. //importantissimo includere la libreria stdlib.h perche
  291. //le funzioni per l'allocazione dinamica della memoria risiedono
  292. //in essa
  293. #include <stdlib.h>
  294.  
  295. //prototipo della funzione
  296. int sommaporzione(int arr[], int inizio, int fine);
  297.  
  298. int main(){
  299.         int i, elementi;
  300.         int *area;
  301.         int inizio;
  302.         int fine;
  303.        
  304.         printf("Quanti elementi avra' il tuo vettore che vuoi analizzare: \n");
  305.         scanf("%d", &elementi);
  306.        
  307.         //alloco la memoria, conoscendo/sapendo quanti elementi inserira' il
  308.         //nostro utente
  309.         area=(int *)malloc(sizeof(int)*elementi);
  310.        
  311.         printf("Inserisci i tuoi elementi all'interno del vettore: \n");
  312.         for(i=0;i<elementi;i++){
  313.             printf("Inserisci il tuo elemento in posizione %d :", i+1);
  314.             scanf("%d", &area[i]);//uso notazione mista puntatore/vettore
  315.         }
  316.        
  317.         printf("Ora inserisci inserisci gli indici per determinare la porzione della quale calcolare la somma\n");
  318.        
  319.         do{
  320.         printf("Inserisci indice inferiore\n");
  321.         scanf("%d", &inizio);
  322.         }while(inizio<0 || inizio>elementi);
  323.        
  324.         do{
  325.         printf("Inserisci indice superiore\n");
  326.         scanf("%d", &fine);
  327.         }while(fine<inizio || fine>elementi);
  328.        
  329.         int ris;
  330.         ris=sommaporzione(area,inizio,fine);
  331.         printf("La somma della porzione delmitata dagli indici e': %d\n", ris);
  332.        
  333.        
  334.         free(area);
  335.         return 0;
  336. }
  337.  
  338. //definizione della funzione
  339.  
  340. int sommaporzione(int arr[], int inizio, int fine){
  341.     int somma;
  342.     somma=0;
  343.     if(inizio==fine)
  344.         return 0+ somma;
  345.     else
  346.         somma=arr[inizio]+sommaporzione(arr, inizio+1,fine);
  347.    
  348.     return somma;
  349. }
  350.  
  351. /*-----------------------------------------------------------------------*/
  352. //7)Conta gli elementi pari, di un array allocato dinamicamente
  353.  
  354. #include <stdio.h>
  355. //importantissimo includere la libreria stdlib.h perche
  356. //le funzioni per l'allocazione dinamica della memoria risiedono
  357. //in essa
  358. #include <stdlib.h>
  359.  
  360. //prototipo della funzione
  361. int contapari(int arr[],int n);
  362.  
  363. int main(){
  364.     int i, num_ele;
  365.     int *p;
  366.     //per ora dichiaro solo il puntatore, che mi servira'
  367.     //per tenere l'indirizzo della memoria dinamica che allochero'.
  368.     //allocando dinamicamente la memoria mi evito di dover gia in partenza
  369.     //dover dichiarare un vettore di una dimensione prefissata
  370.     // (es. array[100]), dove con molta probabilita'
  371.     //andrei incontro ad uno spreco di memoria, questo perche e' impossibile che io
  372.     //sappia gia di mio, l'utente quanti elementi ha intenzione di inserire.
  373.     //quindi quello che faccio , prima chiedo all'utente quanti elementi vuole inserire
  374.     //e poi con quella informazione mi alloco la memoria che mi serve, senza sprecare
  375.     //spazio, alloco quella dimensione che mi ha detto l'utente.
  376.    
  377.     printf("Quanti elementi avra' il tuo vettore che vuoi inserire?\n");
  378.     scanf("%d", &num_ele);
  379.    
  380.     //alloco la memoria necessaria
  381.     p=(int *)malloc(num_ele*sizeof(int));
  382.    
  383.     printf("Inserisci i tuoi elementi all'interno del vettore: \n");
  384.     for(i=0;i<num_ele;i++){
  385.         printf("Inserisci il tuo elemento in posizione %d :", i+1);
  386.         scanf("%d", &p[i]);
  387.     }
  388.    
  389.     //ora richiamo la funzione
  390.     int ris;
  391.     ris=contapari(p,num_ele);
  392.    
  393.     //stampo il risultato
  394.     printf("Il numero di elementi pari all'interno del nostro vettore e':%d", ris);
  395.    
  396.     free(p);
  397.    
  398.     return 0;
  399. }
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406. int contapari(int arr[],int n){
  407.    
  408.     if(n==0)
  409.         return 0;
  410.     else{
  411.         if(arr[n]%2==0){
  412.             return 1+contapari(arr,n-1);
  413.         }
  414.         else{
  415.             return 0+contapari(arr,n-1);
  416.         }
  417.     }
  418. }
Advertisement
Add Comment
Please, Sign In to add comment