Sei sulla pagina 1di 9

/* Programmazione C */

/* Andrea Giordano */

Sia introdotto da tastiera un testo composto da un numero arbitrario di righe.

Ogni riga e' lunga al massimo 80 caratteri ed e' costituita da una sequenza

di parole (composte solamente da caratteri alfabetici minuscoli, 'a' - 'z')

e numeri (composti solamente da cifre, '0' - '9'), separati da uno o piu'

spazi. Si supponga che non esistano aggregati costituiti da lettere e cifre

insieme.

Si scriva un programma che, per ogni riga, concatena le parole adiacenti in

cui le ultime N (con N<5) lettere della prima parola sono uguali alle prime

N lettere della seconda parola, visualizzando l'output sul video (si noti

che possono essere concatenate anche piu' di due parole).

Il parametro N sia letto da tastiera.

Sul video devono apparire lo stesso numero di spazi tra le parole presenti

nel testo in input (a meno che due o piu' parole consecutive vengano

aggregate). Vedi nota al fondo.

Esempio testo in ingresso:

torino novara 123456789 vercelli

ravenna napoli 12345 456789 891234

98765 livorno novara ragusa 234 3456 salerno nocera

roma

Esempio di uscita (con N=2):

torinovara 123456789 vercelli

ravennapoli 12345 456789 891234


98765 livornovaragusa 234 3456 salernocera

roma

Nota:

Si consiglia, prima di svolgere l'esercizio, di analizzare tutte le funzioni

disponibili per le stringhe (ad esempio, esiste una funzione che permette

di spezzare un testo in tanti segmenti? una funzione per combinare insieme

due stringhe? ecc.). Ci si puo' rivolgere o ai testi di C oppure all'help

in linea del TURBO-C.

Attenzione: non e' detto che, dopo aver analizzato le funzioni disponibili,

si decida di utilizzarle! Ad esempio, le specifiche del problema richiedono

di stampare tutti i separatori tra una parola e l'altra...

#include <stdio.h>

#include <conio.h>

#include <ctype.h>

#include <string.h>

#define MAX_CARATTERI 80

#define MAX_RIGHE 30

#define N 5

typedef enum{FALSE,TRUE}boolean;

char str[MAX_CARATTERI],str_aus[MAX_CARATTERI],stri1[MAX_CARATTERI];

char matr_str[MAX_RIGHE][MAX_CARATTERI];
int num_righe,cont_interruz;

int i,j,lung_str,lung_str_aus,n;

int indice,indice1,i_inter,p,cont;

boolean sono_in_parola;

boolean posso_concatenare(char matr[][MAX_CARATTERI],char stri[],char stri_aus[],int


l_str,int rig,int k,int *p_lung_str_aus,int *p_n);

void stampa_stringa(char string[MAX_CARATTERI]);

void leggi_testo(char matr_car[][MAX_CARATTERI], int *p_num_righe);

main()

clrscr();

printf("Inserisci delle frasi (CTRL+Z per finire):\n");

leggi_testo(matr_str,&num_righe);

sono_in_parola=FALSE;

cont_interruz=0;

i=j=0;

while(i<num_righe)

while(matr_str[i][j]!='\0')

if(sono_in_parola)

while(isalnum(matr_str[i][j]))

str[p]=matr_str[i][j];

if(cont==0)

printf("%c",matr_str[i][j]);
j++;

p++;

cont=1;

lung_str=p;

str[p]='\0';

p=0;

if(!isalnum(matr_str[i][j]))

sono_in_parola=FALSE;

else

if(!isalnum(matr_str[i][j]))

cont_interruz++;

j++;

else

sono_in_parola=TRUE;

if(lung_str>0)

if(matr_str[i][j+1]!=' ')

if(posso_concatenare(matr_str,str,str_aus,lung_str,i,j,&lung_str_aus,&n))

cont_interruz=0;

for(indice1=n;indice1<lung_str_aus;indice1++)
printf("%c",str_aus[indice1]);

else

if(cont_interruz>0)

while(cont_interruz>0)

printf(" ");

cont_interruz--;

stampa_stringa(str_aus);

else

cont_interruz++;

j++;

if(cont_interruz>0)

while((cont_interruz>0)&&(strcmp(str,str_aus)!=0))

printf(" ");
cont_interruz--;

stampa_stringa(str);

else

while(cont_interruz>0)

printf(" ");

cont_interruz--;

i++;

j=0;

cont=0;

lung_str=0;

printf("\n");

str[0]=str_aus[0]='\0';

boolean posso_concatenare(char matr[][MAX_CARATTERI],char stri[],char stri_aus[],int


l_str,int rig,int k,int *p_lung_str_aus,int *p_n)

int col,n_;

boolean finito;

char str1[MAX_CARATTERI],str2[MAX_CARATTERI];

int l_str_aus,c;
l_str_aus=0;

col=0;

n_=N-1;

finito=FALSE;

while(isalnum(matr[rig][k+col]))

stri_aus[col]=matr[rig][col+k];

l_str_aus++;

col++;

stri_aus[col]='\0';

if(isalpha(matr[rig][k]))

stri_aus[col]='\0';

*p_lung_str_aus=l_str_aus;

while((!finito)&&(n_>0))

if((l_str<=n_)||(l_str_aus<=n_))

while((l_str<=n_)||(l_str_aus<=n_))

n_--;

strcpy(str1,&stri[l_str-n_]);

for(c=0;c<n_;c++)

str2[c]=stri_aus[c];

str2[c]='\0';

if((strcmp(str1,str2)==0)&&(n_<N))

finito=TRUE;

else

finito=FALSE;
n_--;

*p_n=n_;

return(finito);

void stampa_stringa(char string[MAX_CARATTERI])

int x;

x=0;

while(string[x]!='\0')

printf("%c",string[x]);

x++;

return;

void leggi_testo(char matr_car[][MAX_CARATTERI], int *p_num_righe)

int riga,colonna,carat;

riga=colonna=0;

while (((carat = getchar())!=EOF) && (riga < MAX_RIGHE))

if (carat != '\n')

if (colonna < MAX_CARATTERI)


{

matr_car[riga][colonna] = carat;

colonna++;

else

matr_car[riga][colonna] = '\0';

colonna = 0;

riga++;

*p_num_righe = riga;

return;