View Full Version : ordinamento lessicografico stringhe in C con mergesort
mariom86
15-12-2006, 15:12
[I]Qualcuno può aiutarmi con questo esercizio, sono disperato!!!
Ecco il testo:
[B]Scrivere un programma in C che riceva in input un insieme di parole (stringhe, possibilmente lette da un file di testo) e produca in output (possibilmente su file) le parole di input ordinate. Esempio:
Input: “Oggi è proprio una bella giornata. Quasi quasi vado al mare.”
Output:
al
bella
è
giornata
mare
Oggi
proprio
Quasi
quasi
una
vado
Per l’ordinamento utilizzare l’algoritmo di Merge Sort (versione ricorsiva) ovviamente modificato per operare su array di puntatori a char anziché su array di int. Inoltre, lo spazio da allocare in memoria per memorizzare le parole lette da file deve essere dinamico, ovvero bisogna contare prima le parole e poi allocare lo spazio necessario.
mariom86
15-12-2006, 15:22
vi prego, devo consegnarlo entro domani sera
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int caricamento(char *frase);
void ordinamento(char **parole, int );
void swap(char **p, char **q);
void stampa(char **parole, int );
int main(){
char *frase,**parole,*temp;
int np,i,j;
frase=(char*)malloc(1);
if (frase== NULL)
printf("ERRORE DI ALLOCAZIONE DI MEMORIA");
np=caricamento(frase);
if (np>0){
parole=new char*[np];
parole[0]=strtok(frase," ");
for(i=1;i<np;i++)
parole[i]=strtok(NULL," ");
ordinamento(parole,np);
stampa(parole,np);
}else printf("non hai inserito nulla\n");
system("pause");
}
int caricamento(char *frase){
int i,np=0;
printf("Inserire frase...\n");
for(i=0;;i++){
frase[i]=getchar();
if(frase[i]==' ') np++;
else if(frase[i]=='\n'){
frase[i]='\0';
if(i!=0) np++;
break;
}
}
return np;
}
void ordinamento(char **parole, int np){
int i,j;
for (i=0;i<np;++i){
for (j=i+1;j<np;++j){
if (strcmp(parole[i],parole[j])>0){
swap(&parole[i], &parole[j]);
}
}
}
}
void swap(char **p, char **q){
char *temp;
temp=*p;
*p=*q;
*q=temp;
}
void stampa(char **parole, int np){
int i;
printf("Parole ordinate:\n");
for (i=0;i<np;i++)
printf("%s\n",parole[i]);
}
ora qwualcuno sostituisca bubblesort con mergesort e il gioco è fatto
mariom86
16-12-2006, 20:40
Qualcuno riesce a modificarlo per ordinare una stringa? Vi prego, devo consegnarlo entro domani sera.
#include <stdlib.h<
#include <stdio.h<
#define MAX 300
/*
* Legge in input il numero n ed n numeri interi
* che memorizza nell'array. Restituisce il numero
* di elementi letti (n).
*/
int leggi_array(int V[]) {
int n, i;
printf("Numero di elementi: ");
scanf("%d", &n);
for (i=0; i<n; i++)
scanf("%d", &V[i]);
return(n);
}
/*
* Stampa in output l'array.
*/
void stampa_array(int V[], int n) {
int i;
for (i=0; i<n; i++) {
printf("%d ", V[i]);
}
printf("\n");
return;
}
/*
* Funzione Merge per la fusione di due
* componenti ordinate dell'array.
*/
void Merge(int A[], int p, int q, int r) {
int i, j, k, B[MAX];
i = p;
j = q+1;
k = 0;
while (i<=q && j<=r) {
if (A[i]<A[j]) {
B[k] = A[i];
i++;
} else {
B[k] = A[j];
j++;
}
k++;
}
if (i<=q) {
while (i<=q) {
B[k] = A[i];
i++;
k++;
}
} else {
while (j<=r) {
B[k] = A[j];
j++;
k++;
}
}
for (k=p; k<=r; k++)
A[k] = B[k-p];
return;
}
/*
* Funzione ricorsiva MergeSort.
*/
void MergeSort(int A[], int p, int r) {
int q;
if (p<r) {
q = (p+r)/2;
MergeSort(A, p, q);
MergeSort(A, q+1, r);
Merge(A, p, q, r);
}
return;
}
/*
* Funzione principale
*/
int main(void) {
int n, V[MAX];
n = leggi_array(V);
MergeSort(V, 0, n-1);
stampa_array(V, n);
return(1);
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.