Soluzioni esercizi Homework 2

Esercizio 1

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

char* leggi_input (){
  char* stringa =(char*) calloc(101, sizeof(char));
  int current;
  int i = 0;
  int j = 0;
  //  for (i = 0; i < 101; i++){
  while (((current = getchar()) != EOF) && (current != '\n') && (i < 101)) {
    i = i + 1;
    if ((current == ' ') && ((j == 0) || (stringa [j-1] == ' '))){
      j = j - 1;
    } else stringa[j] = tolower(current);
    j = j + 1;
  }  // end While
  if ((j-1 >= 0) && (stringa[j-1] == ' ')) j = j - 1;
  stringa[j] = '\0';
  return stringa;
}


int conta_parole (char* stringa) {
  int i = 0;
  int parole = 1;
  if (stringa == NULL) return 0;
  for (i = 0; stringa[i] != '\0'; i++)
    if ((stringa[i] == ' ') && (stringa[i+1] != '\0')) parole = parole + 1;
  return parole;
}


void trova_anagrammi (char* stringa, int numero_parole, char* pattern) {
  int i = 0;
  int inizio = 0;  // mantiene indice al primo carattere del token corrente
  int corrente = 0;  // mantiene contatore alla parola corrente
  int no_anagrammi = 1;  // ruolo di booleano per verifica finale
  if (!stringa || !pattern) {  // nel caso uno dei due sia vuoto
    printf("Non ci sono anagrammi\n");
    return;
  }

  for(i = 0; (i < strlen(stringa)) && (corrente < numero_parole); i++) {
    if (stringa[i] == ' ') {  // caso carattere spazio
      char* parola_corrente = (char*) calloc((i-inizio+1),sizeof(char));
      int j;  // contatore caratteri successivi che precedono il
         // carattere spazio
      for (j = 0; j< (i-inizio); j++){
        parola_corrente[j]=stringa[inizio+j];  // copia in parola_corrente
                      // il token precedente a ' '
      }
      parola_corrente[j] = '\0';  // termina la parola corrente
      if (anagramma (pattern, parola_corrente)) {  // controllo se anagramma
        printf("%s\n", parola_corrente);  // stampa parola corrente
        no_anagrammi = 0;
      }
      free(parola_corrente);  // libera la memoria del puntatore parola_corrente
      inizio = i+1;  // pone inizio del seguente token al carattere
           // succesisvo a ' '
      corrente = corrente + 1;  //
    }
  }
  if (no_anagrammi) printf("Non ci sono anagrammi\n");
  return;
}


int anagramma(char* Pattern, char* Parola){
  if (strlen(Pattern)==strlen(Parola))  // controllo lunghezza stringhe
    if ((strspn(Pattern, Parola) == strlen(Pattern)) &&   // controllo se tutti i char di  Parola  stanno in Pattern e viceversa
        (strspn(Parola, Pattern) == strlen(Pattern))) return 1;
  return 0;
}


int main () {
  char* testo = leggi_input();
  char pattern[101];
  int nr_parole = conta_parole(testo);
  scanf("%s",pattern);
  trova_anagrammi (testo, nr_parole, pattern);
  if (testo != NULL) free(testo);
  return 1;
}

Eserzicio 2

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

/* Legge n numeri con virgola da standard input e ritorna 
   il vettore che li contiene. */
double* leggi_numeri (int n) {
  int i = 0;  // contatore ciclo for
  double* numeri = NULL;  // vettore che conterra' i numeri
  if (n == 0) return NULL;
  if (!(numeri = calloc(n, sizeof(float))))  // allocazione di memoria 
    return NULL;
  for (i = 0; i < n; i++){
    double num_corrente;
    scanf("%f", &num_corrente);
    numeri[i] = num_corrente;
  }
  return numeri;
}


/* Prende in input un vettore di double, la sua dimensione dim
   e un indice b < dim. Scambia l'ultimo numero del vettore
   con quello che si trova alla casella b*/
void switch_numbers(double* numeri, int dim, int b) {
  double appoggio = numeri[dim-1];
  numeri[dim-1] = numeri[b];
  numeri[b] = appoggio;
  return;
}


/* Prende in input un vettore di double e la sua dimensione n
   e ritorna il vettore con i numeri ordinati. */
double* selection_sort(double* numeri, int n) {
  int index_massimo = 0;
  int i = 0;  // contatore ciclo for
  if (n == 1) return numeri;
  for (i = 0; i < n; i++) {
    if (numeri[index_massimo] < numeri[i]) index_massimo = i;
  }
  if (index_massimo)
    switch_numbers(numeri, n, index_massimo);  // pone il massimo alla
                      // casella n-1 (alla fine)
  return selection_sort(numeri, n-1);  // chiamata ricorsiva agli n-1
                   // numeri piu' piccoli del vettore
}


int conta_differenti (double* numeri, int n) {
  int i = 0;  // contatore ciclo for
  int conta = (n != 0);  // mantiene numero numeri differenti
  numeri = selection_sort(numeri, n);  // ordina i numeri
  for (i = 1; i < n; i++){
    if (numeri[i-1] != numeri[i]) conta = conta + 1;
  }
  return conta;
}


int main () {
  char numero [150];
  int n = 0;
  int differenti = 0;
  double* numeri = NULL;
  scanf("n = %s", numero);
  n = atoi (numero);
  numeri = leggi_numeri (n);
  differenti = conta_differenti (selection_sort(numeri, n), n);
  printf("%d\n", differenti);
  return 1;
}

Esercizio 3

#include <stdio.h>

int main () {
  char stringa[150];
  char numero[150];
  int n = 0;
  scanf("%s %s", stringa, numero);  // legge la stringa, tralascia gli
                // spazi, legge la sequenza di numeri
  n = atoi(numero);  // trasforma la sequenza di numeri in intero
  while (0 < n--) printf("%s\n", stringa);  // stampa la stringa n volte
  return 1;

}

Esercizio 4

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

char* vigenere_semplice (char* stringa, int gap) {
  int lunghezza = strlen(stringa);
  char* nuova_stringa = (char*) calloc(lunghezza, sizeof(char));
  int i;  // contatore ciclo for

  nuova_stringa [lunghezza] = '\0';
  gap = gap % 26;  // se gap e' piu' grande di 26 (o piu' piccolo di
         // -26) lo trasforma in (gap mod 26)
  if (gap < 0) gap = 26 + gap;  // se gap < 0 lo trasforma in uno > 0
  for (i = 0; i < lunghezza; i++){
    if (!isalpha(stringa[i])) return "";
    char curr_char;  // mantiene il carattere corrente
    int k = ((i + gap + (tolower(stringa[i])-'a')) % 26 )+'a';
    curr_char = (char) k;
    nuova_stringa[i] = curr_char;
  }
  return nuova_stringa;
}

-- JulindaStefa - 14 Nov 2007

Edit | Attach | Watch | Print version | History: r2 < r1 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r2 - 2007-11-26 - JulindaStefa






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback