Newsgroup: it.comp.lang.c
Titolo: Ordinamento

Sto cercando di fare un programmino che, dato un testo, calcoli le
ricorrenze di
ogni lettera e poi le ordini.
Il problema è che, una volta ordinati i risultati, non so come associare
ad
ogni lettera la rispettiva ricorrenza
E.S:  a=23  b=19  c=10
li ordino, ottengo  10  19  23, come faccio a fargli stampare c=10 b=19
a=23???
Questo è il codice che ho scritto. Scusate la lunghezza del messaggio
Potete aiutarmi???
Grazie a tutti
Fede
/* Conta ricorrenze lettere */
#include <stdio.h>
#include <stdlib.h>
#define DIM 26
void bubble(int [], int);  /* prototipo di bubble */
int main(int argc, char *argv[])
{
 int c, i, nswap, letter[DIM], letterm[DIM], ord1[DIM], ord2[DIM];
 FILE *ifp, *ofp;
 if(argc!=3)  {
  printf("\n%s%s%s\n\n%s\n%s\n\n",
   "Usage: ", argv[0], " infile outfile",
   "The uppercase letters in infile will be counted.",
   "The results will be written in outfile.");
  exit(1);
 }
 ifp=fopen(argv[1], "r");
 ofp=fopen(argv[2], "w");
 for (i=0; i<DIM; ++i) { /* inizializza l'array a 0 */
  letter[i]=0;
  letterm[i]=0;  }
 while ((c=getc(ifp))!=EOF)
  if(c>='A' && c<='Z') {          /* trova le lettere maiuscole */
   ++letter[c-'A'];   }
  else  {
             if(c>='a' && c<='z')        /* trova le lettere minuscole
*/
                 ++letterm[c-'a'];   }
 for(i=0; i<DIM; ++i) {     /* stampa i risultati */
  if(i%6==0)
          putc('\n', ofp);
         fprintf(ofp, "%c:%5d    ", 'A'+i, letter[i]);  /* lettere
maiuscole */
  ord1[i]=letter[i];
 }
 fprintf(ofp, "\n");  /* inserisce uno spazio */
 for(i=0; i<DIM; ++i) {     /* stampa i risultati */
  if(i%6==0)
          putc('\n', ofp);
         fprintf(ofp, "%c:%5d    ", 'a'+i, letterm[i]);  /* lettere
minuscole  */
         ord2[i]=letterm[i];
 }
 putc('\n', ofp);
 /* li ordino con bubblesort */
 bubble(ord1, DIM);
 bubble(ord2, DIM);
 fprintf(ofp, "\n");  /* inserisce uno spazio */
 /* li stampo sul file */
 for(i = 0; i < DIM; i++)
  fprintf(ofp,"%d ",ord1[i]);
 fprintf(ofp,"\n");
 fprintf(ofp, "\n");  /* inserisce uno spazio */
 for(i = 0; i < DIM; i++)
  fprintf(ofp,"%d ",ord2[i]);
 fprintf(ofp,"\n");
 return 0;
}
/* bubble ordina i primi n elementi
   dell'array di interi a[],
   usando bubblesort.
*/
void bubble(int a[], int n)
{
 int i,j,tmp;
 for(i = 0; i < n - 1; i++)
  /* sistemo l'i-esimo elemento piu' piccolo */
  for(j = n - 1; j > i; j--)
   if(a[j-1] > a[j]) {
    /* scambio */
    tmp = a[j-1];
    a[j-1] = a[j];
    a[j] = tmp;
   }
}


Talking about music is like dancing about architecture.
                -- Laurie Anderson

Perfetto, funziona
Grazie
Ciao
Fede


ricorrenze di ogni lettera e poi le ordini.
<CODE>
#include <stdio.h>
typedef struct {
        int occ;
        char c;
} array_item;
array_item items[256];
void bubble_sort(array_item *, int);
int main()
{
    int c, i;
    for (i = 0; i < 256; i++)
    {
        items[i].occ = 0;
        items[i].c = i;
    }
    while ((c = getchar()) != EOF)
    {
          ++items[c].occ;
    }
    bubble_sort(items, 256);
    for (i = 0; i < 256; i++)
    {
        if (items[i].occ)
        {
           printf("%c = %d; ", items[i].c, items[i].occ);
        }
    }
    printf("\n");
    printf("Premi INVIO per uscire...");
    getchar();
    return 0;
}
void bubble_sort(array_item a[], int n)
{
     int i, j;
     array_item tmp;
     for (i = 0; i < n-1; i++)
     {
         for (j = n-1; j > i; j--)
         {
            if (a[j-1].occ > a[j].occ)
            {
               tmp = a[j-1];
               a[j-1] = a[j];
               a[j] = tmp;
            }
         }
     }
}
</CODE>
-- 
The Follet

>  /* li ordino con bubblesort */


Ti ringrazio per l'aiuto, ma essendo alle prime armi, il programmino è 
una scusa per imparare, non riesco a capire come funziona, perchè un 
array da 256??
Adesso cerco i comandi sul libro e mi studio il tuo codice.
Grazie
Fede


array da 256??
Perche' si suppone che tu stia leggendo un file contenente
byte da 8 bit che puo' assumere, quindi, 256 valori.
-- 
The Follet

 Ciao Fede
ciao ... e sorry about ;-)))



forse (come alcuni esercizi iniziali del K&R) funziona solo per
particolari file (mi sembra quelli che non contengono il carattere di
codice ascii 26) cmq provatelo su file binari. 
Come mia curiositą sapete un modo per ovviare la situazione
limitatamente a stdin (su file normali aperti in mode binario č facile
e funziona bene).