Laboratório de Programação I (UFBA 2009.1): Prova AVII - Respostas do professor

From AdonaiMedrado.Pro.Br
Jump to: navigation, search

Problema do checksum (Dificuldade 1)

#include <stdio.h>
 
int contar_uns(unsigned char b)
{
	int i, r=0;
	for(i=0;i<8;i++,b>>=1)
		r += b & 1;
	return r;
}
 
int contar_zeros(unsigned char b)
{
	int i, r=0;
	for(i=0;i<8;i++,b>>=1)
		r += (b & 1) ? 0 : 1;
	return r;
}
 
int main(void)
{
	char s[201];
	do
	{
		scanf("%s",s);		
		if (strcmp(s,"0"))
		{
			FILE *fp=fopen(s,"r");
			char b;
			int l=0,c=0;
			while(fread(&b,sizeof(char),1,fp))
			{
				if (c % 2)
					l+=contar_zeros(b);
				else
					l+=contar_uns(b);
				c++;
			}
			printf("%d\n",l);
			fclose(fp);
		}
	} while(strcmp(s,"0"));
}

Problema do TMA

#include <stdio.h>
#include <stdlib.h>
 
int comparar(const void *a, const void *b)
{
	return *((int *)a)-*((int *)b);
}
 
int verificar_moda(int *entrada, int tamanho)
{
	int ant, qnt=0, i, feqmoda=0, feqatual=0, count;
	int *moda=malloc(tamanho*sizeof(int));
 
	if (!tamanho)
		return -1;
 
	ant=entrada[0];
	for(i=0;i<tamanho;i++)
	{
		if (entrada[i]==ant)
			feqatual++;
		else
			feqatual=1;
 
		if (feqatual>feqmoda)
		{
			qnt=0;
			moda[0]=entrada[i];
			feqmoda=feqatual;
		}
		else if (feqatual==feqmoda)
			moda[qnt++]=entrada[i];
 
		ant=entrada[i];
	}
 
	if (qnt==0)
		return moda[0];
	else
		return -1;
	free(moda);
}
 
int main(void)
{
	int ini,fim;
	int max=-1,min=1001,soma=0,qnt=0,tempo;
	int i=0;
	int *entrada=NULL;
 
	FILE *fp=fopen("entrada.txt","r");
	while(fscanf(fp,"%d %d",&ini,&fim)==2)
	{
		if (qnt==0 || qnt/100.0!=qnt/100)
			entrada = realloc(entrada,sizeof(int)*(qnt+100));
		*(entrada+i)=tempo=fim-ini;
		i++;
		if (max<tempo)
			max = tempo;
		if (min>tempo)
			min = tempo;
		soma+=tempo;
		qnt++;
	}
	qsort(entrada,qnt,sizeof(int),comparar);
	printf("%d\n%d\n%d\n%.1f\n",min,max,verificar_moda(entrada,qnt),soma/(float)qnt);
	fclose(fp);
	free(entrada);
}

Problema da seqüência de algarismos agrupados com ordenação

#include <stdio.h>
#include <string.h>
 
int comparar(const void *a, const void *b)
{
	return *(char *)a-*(char *)b;
}
 
int main(void)
{
	char g[10][101] = { { '\0' } };
	char s[26];
	int n, i;
 
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		int indice_g;
		scanf("%s",s);
		indice_g = s[strlen(s)-1]-'0';
		strcat(g[indice_g],s);
		g[indice_g][strlen(g[indice_g])-1] = '\0';		
	}
 
	for(i=0;i<10;i++)		
	{
		if (strlen(g[i])>0)
		{
			qsort(g[i],strlen(g[i]),sizeof(char),comparar);
			printf("%d.%s\n",i,g[i]);
		}
	}
	return 0;
}