Linguaggio C, funzione con passaggio e titorno array

di il
6 risposte

Linguaggio C, funzione con passaggio e titorno array

Ciao ragazzi!
Il seguente codice, data una stringa e una chiave (molto rudimentale) in input, consente di effetturare una banalissima "crittografia" se così la si può chiamare.
Ad esempio: se inserisco "ciao" e la chiave è 1, allora l'output sarà "djbp".

Il codice funziona, anche se mi da alcuni warning. Ringrazio, tuttavia, alcuni utenti che mi hanno dato in precedenza delle spiegazioni riguardo il getchar()!

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10000

char *cifra(char Frase[], int nA, int chiave);

int main()
{
	char stringa[MAX_SIZE], new_array;
	int i, j; //Indice di scorrimento
	int key; 
	

        printf("Inserire una stringa: ");
        gets(stringa);

	printf("Chiave di cifratura: ");
	scanf("%d", &key);
	
	
        while(stringa[i] != '\0')
		i++;
	
	cifra(stringa, i, key);
	
	printf("\nArray crittografato: \n");
	
	j = 0;
	while(stringa[j] != '\0')
	{
		printf("%c", stringa[j++]);
	}
	printf("\n");
	

	
	return 0;
}

char *cifra(char Frase[], int nA, int chiave)
{
	for(j = 0; j < nA; j++)
	{
		if(Frase[j] != 'z')
			Frase[j] = Frase[j] + chiave;
		else if(Frase[j] == 'z')
		{
			Frase[j] = 'a';
			chiave-=1;
			Frase[j] = Frase[j] + chiave;
		}
	}
	
	return Frase;
	
}
Come potete vedere il prototipo della funzione è il seguente:
char *cifra(char Frase[], int nA, int chiave);
In realtà, però, l'esercizio mi dava come suggerimento il seguente prototipo:
char* cifraFrase(char Frase[], int nA, char (*f)(char c, int s))
L'ho modificato perché non so bene come utilizzare char (*f)(char c, int s). So che si tratta di un puntatore ad una funzione ma non ho ben chiaro a che cosa possa servire.

Il testo dell'esercizio è questo:

Scrivere un programma in linguaggio C che realizzi la seguente funzione: char* cifraFrase(char Frase[], int nA, char (*f)(char c, int s)) che prende in ingresso un array contenente i caratteri che formano una parola o frase (una stringa), alloca dinamicamente un nuovo array di caratteri ed assegna ad ogni posizione il risultato della funzione crittaCarattere al rispettivo carattere nell'array originario. Infine restituisce il nuovo array. Scrivere diverse funzioni di crittografia (esempi: 1. semplice shift del codice del carattere di s posizioni, 2. calcolo dei divisori di s e shift alternato destra sinistra dei divisori, etc...) da passare al puntatore a funzione f. Verificare la funzione mediante un'opportuna funzione main di prova.

Non mi interessa molto la parte della crittografia di per se, come codice fa piuttosto pena dal punto di vista dell'utilizzo. Quello che a me serve è imparare per bene l'utilizzo dei puntatori e delle funzioni.

Piccola curiosità: "Verificare la funzione mediante un'opportuna funzione main di prova." che significa?

Grazie!!

6 Risposte

  • Re: Linguaggio C, funzione con passaggio e titorno array

    Partiamo dall'ultimo ... se scrivi il codice della funzione come fai a sapere se è corretto? Lo devi provare scrivendo anche un main che chiami la funzione ... è quello che ti chiedono di fare.

    Per il resto, è abbastanza chiaro che devi scrivere più funzioni di crittografia, non solo una, e la funzione di crittografia del "singolo carattere" viene passata per puntatore in modo che la funzione che tratta "tutta la stringa" possa operare in modo diverso a seconda della funzione utilizzata.
  • Re: Linguaggio C, funzione con passaggio e titorno array

    Quindi nel caso in cui avessi dovuto utilizzare solo un tipo di crittografia, quel puntatore a funzione non sarebbe servito?

    Tuttavia, come si utilizza il puntatore a funzione? Perché ho questo esempio:
    #include <stdio.h>
    
    int somma(int a, int b);
    
    int main()
    {
       int (*f)(int x, int y);
       
       f = somma;
       printf("Somma: %d\n", (*f)(5, 10));
       
       return 0;
    }
    
    int somma(int a, int b)
    {
       return (a + b);
    }
    
    Però, in questo caso, il puntatore a funzione non è definito nel prototipo della funzione stessa, ma nel main.

    Invece:
    char* cifraFrase(char Frase[], int nA, char (*f)(char c, int s))
    Il puntatore a funzione è definito nel prototipo della funzione stessa e non nel main, e non so come utilizzarlo.

    Grazie
  • Re: Linguaggio C, funzione con passaggio e titorno array

    Ti consiglio di utilizzare typedef per definire il tipo di puntatore per la tua funzione, es.
    typedef int (*typefunc)(int x, int y);
    così puoi scrivere
    typefunc ptrfunc;
    ptrfunc = somma;
  • Re: Linguaggio C, funzione con passaggio e titorno array

    davide.fruci ha scritto:


    Quindi nel caso in cui avessi dovuto utilizzare solo un tipo di crittografia, quel puntatore a funzione non sarebbe servito?
    No. Si usa proprio per rendere flessibile la funzione di crittografia in modo che sia "aperta" a varie possibilità.
    Tuttavia, come si utilizza il puntatore a funzione? Perché ho questo esempio:
    Come argomento passerai il nome della funzione
  • Re: Linguaggio C, funzione con passaggio e titorno array

    L'ultimo codice che ho postato, quello della somma, era un esempio di utilizzo.. Quello l'ho capito..

    Oregon, come faccio a passare come argomento (per il puntatore) il nome della funzione, se il puntatore è definito nella funzione stessa?!
  • Re: Linguaggio C, funzione con passaggio e titorno array

    Il nome della funzione è quello che devi passare.
Devi accedere o registrarti per scrivere nel forum
6 risposte