Difference between revisions of "Solução: Problema da moda - dificuldade 5 (Lúcio Ribeiro)"

From AdonaiMedrado.Pro.Br
Jump to: navigation, search
(New page: <code lang="c">// Lúcio Ribeiro #include <stdio.h> #include <stdlib.h> #include <string.h> void erro(char **vet,int i, int caso) { while(i) { i--; free(*(vet+i)); } free(vet); f...)
 
Line 1: Line 1:
<code lang="c">// Lúcio Ribeiro
+
<code lang="c">
 +
// Lúcio Ribeiro
 
#include <stdio.h>
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <stdlib.h>
 
#include <string.h>
 
#include <string.h>
  
void erro(char **vet,int i, int caso)
+
void erro(char **vet,char *palavra, int i, int caso)
 
{
 
{
 
while(i)
 
while(i)
Line 12: Line 13:
 
}
 
}
 
free(vet);
 
free(vet);
free(palavra);
 
 
if(caso)
 
if(caso)
 
exit(1);
 
exit(1);
 +
}
 +
int comparar(const void *a ,const void *b)
 +
{
 +
return strcmp( *(char**)a, *(char**)b );
 
}
 
}
 
   
 
   
 +
 
int main()
 
int main()
 
{
 
{
Line 33: Line 38:
 
palavra = (char *) realloc(palavra, sizeof(char)*(k+1));
 
palavra = (char *) realloc(palavra, sizeof(char)*(k+1));
 
if(palavra==NULL)
 
if(palavra==NULL)
erro(vet,linha,1);
+
erro(vet,palavra,linha,1);
 
fscanf(arquivo,"%s",palavra);
 
fscanf(arquivo,"%s",palavra);
 
linha++;
 
linha++;
Line 39: Line 44:
 
*(vet+linha-1) = (char*) malloc(sizeof(char)*(k+1));
 
*(vet+linha-1) = (char*) malloc(sizeof(char)*(k+1));
 
if(vet==NULL||*(vet+linha-1)==NULL)
 
if(vet==NULL||*(vet+linha-1)==NULL)
erro(vet,linha,1);
+
erro(vet,palavra,linha,1);
 
strcpy(*(vet+linha-1), palavra);
 
strcpy(*(vet+linha-1), palavra);
 
}while(1);
 
}while(1);
Line 51: Line 56:
 
   
 
   
  
for(i=0;i<linha;i++) /*ordenar*/
+
qsort(vet,linha,sizeof(char**),comparar);
{
+
for(j=i+1;j<linha;j++)
+
{
+
if(strcmp(*(vet+i),*(vet+j))>0)
+
{
+
palavra = (char *) realloc(palavra, sizeof(char)*(strlen(*(vet+i))+1));
+
strcpy(palavra, *(vet+i));
+
*(vet+i) = (char*) realloc(*(vet+i),sizeof(char)*(strlen(*(vet+j))+1));
+
strcpy(*(vet+i), *(vet+j));
+
*(vet+j) = (char*) realloc(*(vet+j),sizeof(char)*(strlen(palavra)+1));
+
strcpy(*(vet+j), palavra);
+
}
+
}
+
}
+
 
   
 
   
 
j=1;
 
j=1;
Line 86: Line 77:
 
printf("%s\n",*(vet+i));
 
printf("%s\n",*(vet+i));
 
}
 
}
erro(vet,linha,0)
+
erro(vet,palavra,linha,0);
 
return 0;
 
return 0;
 
}
 
}

Revision as of 19:03, 12 June 2009

// Lúcio Ribeiro
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void erro(char **vet,char *palavra, int i, int caso)
{
	while(i)
	{
		i--;
		free(*(vet+i));
	}
	free(vet);
	if(caso)
		exit(1);
}
int comparar(const void *a ,const void *b)
{
	return strcmp( *(char**)a, *(char**)b );
}
 
 
int main()
{
	char **vet=NULL;
	char *palavra=NULL;
	int k,linha=0,moda=1,cont=1, i,j;
	FILE *arquivo;
 
 
	arquivo = fopen("dif5.txt","r");
 
	do /*ler e alocar*/
	{
		if(fscanf(arquivo,"%d",&k)==EOF)
			break;
		palavra = (char *) realloc(palavra, sizeof(char)*(k+1));
		if(palavra==NULL)
			erro(vet,palavra,linha,1);
		fscanf(arquivo,"%s",palavra);
		linha++;
		vet = (char **) realloc(vet, sizeof(char*)*linha);
		*(vet+linha-1) = (char*) malloc(sizeof(char)*(k+1));
		if(vet==NULL||*(vet+linha-1)==NULL)
			erro(vet,palavra,linha,1);
		strcpy(*(vet+linha-1), palavra);
	}while(1);
 
 
	if(linha==1)/*importantissimo*/
	{
		printf("%s",*vet);
		return 0;
	}
 
 
	qsort(vet,linha,sizeof(char**),comparar);
 
	j=1;
	for(i=1;i<linha;i++)/*j eh parcial*/
	{
		if(!strcmp(*(vet+i),*(vet+i-1)))
			j++;
		else j=1;
		if(j>moda)
				moda=j;
	}
 
	for(i=1;i<linha;i++)
	{
		if(!strcmp(*(vet+i),*(vet+i-1)))
			cont++;
		else
			cont=1;
		if(cont==moda)
			printf("%s\n",*(vet+i));
	}
	erro(vet,palavra,linha,0);
	return 0;
}