Escolar Documentos
Profissional Documentos
Cultura Documentos
exercícios
de fixação
em C
nina edelweiss
maria aparecida castro livi
2 Respostas dos Exercícios de Fixação em C
3 algoritmos sequenciais 5
Exercício 3.1 Algoritmo Média1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Exercício 3.2 Algoritmo Círculo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Exercício 3.3 Algoritmo ConversãoParaDólar . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Exercício 3.4 Algoritmo ComissãoSobreVenda . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Exercício 3.5 Permuta2Variáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5 estruturas de repetição 13
Exercício 5.1 Algoritmo Fibonacci – opção 1 . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Algoritmo Fibonacci – opção 2 . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Exercício 5.2 Algoritmo NúmerosPerfeitos. . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Exercício 5.3 Algoritmo ConverteTemperaturas . . . . . . . . . . . . . . . . . . . . . . . 15
9 subprogramas 34
Exercício 9.1 Algoritmo TesteMenu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Exercício 9.2 Algoritmo TesteImpPares. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Exercício 9.3 Algoritmo TesteMaior3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Exercício 9.4 Algoritmo TesteBuscaValor. . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
10 manipulação de strings 37
Exercício 10.1 Função ContaStrings: inteiro. . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Exercício 10.2 Procedimento SubstituiSubstr. . . . . . . . . . . . . . . . . . . . . . . . . 39
Exercício 10.3 Função Palíndroma: lógico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
11 registros 41
Exercício 11.1 Algoritmo FuncionáriosSalMaiorMédia. . . . . . . . . . . . . . . . . . . 41
Exercício 11.2 Algoritmo IdadeAluno. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
12 conjuntos 44
13 arquivos 44
Exercício 13.1 Função ContaVogaisEmArqTexto: inteiro. . . . . . . . . . . . . . . . . . . 44
Exercício 13.2 Procedimento ExcValArqInt. . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4 Respostas dos Exercícios de Fixação em C
15 recursividade 59
Exercício 15.1 Procedimento MostraVersão1. . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Procedimento MostraVersão2. . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Exercício 15.2 Função Fibonacci: inteiro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercício 15.3 Procedimento Quick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercício 15.4 Função Lugar: inteiro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Exercício 15.5 Função PalíndromaRec: lógico var. . . . . . . . . . . . . . . . . . . . . . . . 63
Exercício 15.6 Procedimento RV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Respostas dos Exercícios de Fixação em C 5
3 algoritmos sequenciais
Exercício 3.1 Algoritmo Média1
//Informa a soma e a media das 3 notas de um aluno
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
float nota1, nota2, nota3;
float soma, media;
printf("Informe as tres notas (reais):");
scanf("%f %f %f", ¬a1, ¬a2, ¬a3);//Entrada das 3 notas
//informa as notas lidas
printf("\nNota1 = %8.2f nota2 = %8.2f nota3 = %8.2f\n",
nota1, nota2, nota3);
soma = nota1 + nota2 + nota3; // calcula a soma
printf("\nSoma = %8.2f\n", soma); // informa a soma
media = soma / 3; // calculo da media
printf("\nMedia = %8.2f\n", media); // informa media calculada
printf("\n\n");
system("pause");
return 0;
}
}
//informa valor a pagar
printf("\nValor a pagar = %8.2f\n", apagar);
if (desconto != 0)
printf("\nDesconto = %8.2f\n", desconto);//informa desconto recebido
printf("\n\n");
system("pause");
return 0;
}
system("pause");
return 0;
}
Algoritmo DiasDoMês2
//Informa quantos dias tem um determinado mes
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
int mes, ano; // dados de entrada - mes e ano
int dias; // numero de dias do mes neste ano
int ehbissexto;
//entrada de dados
printf("Forneca mes e ano: ");
scanf("%d" "%d", &mes, &ano);
switch (mes)
{
case 2: //fevereiro
ehbissexto = 0;
if (!(ano % 100))
{
if (!(ano % 400))
ehbissexto = 1;
}
else if (!(ano % 4))
ehbissexto = 1;
if (ehbissexto)
dias = 29; // ano bissexto
else dias = 28;
break;
case 4: //abril
case 6: //junho
case 9: //setembro
case 11: //novembro
dias = 30;
break;
default: //demais meses
dias = 31;
break;
} // fim comando de selecao multipla
//informa numero de dias do mes
printf("\nDias = %d\n", dias);
printf("\n\n");
system("pause");
return 0;
}
12 Respostas dos Exercícios de Fixação em C
case '-':
case '*':
case '/': printf("\nOperador aritmetico\n");
break;
5 estruturas de repetição
Exercício 5.1 Algoritmo Fibonacci – opção 1
*/Gera uma sequencia de N termos da serie de Fibonacci,
usando 3 termos */
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
int n, i, termo, termo_1, termo_2;
termo_2 = 0;//inicializa primeiro termo da serie
termo_1 = 1; // inicializa segundo termo da serie
do //consiste numero desejado de termos
{
printf("\nNumero de termos: ");
scanf("%d", &n);
}
while (n <= 0);
for (i = 1; i <= n; i++)
{
switch (i) // informa conceito
{
case 1:
printf("\n%d\n", termo_2);
break;
case 2:
printf("\n%d\n", termo_1);
break;
default:
termo = termo_1 + termo_2;
printf("\n%d\n", termo);
termo_2 = termo_1;
termo_1 = termo;
break;
}
14 Respostas dos Exercícios de Fixação em C
}
printf("\n\n");
system("pause");
return 0;
}
} // fim do if
}
while (opcao != 5); //opcao de encerramento
printf("\n\n");
system("pause");
return 0;
}
{
int vet1[MAX], vet2[MAX]; // vetores de entrada
int vet_inters [MAX]; // vetor interseccao
int i, j;// indices dos vetores vet1 e vet2
int k; // indice do vetor vet_inters
int igual;
// Leitura dos dois vetores de entrada
for (i = 0; i < MAX; i++)
{
printf("\nValor %d do vetor 1: ", i + 1);
scanf("%d", &vet1[i]);
}
for (i = 0; i < MAX; i++)
{
printf("\nValor %d do vetor 2: ", i + 1);
scanf("%d", &vet2[i]);
}
//Geracao do vetor interseccao
k = -1; // inicializa indice para vetor vazio
for (i = 0; i < MAX; i++) //i percorre vet1
{
j = 0; // j vai percorre vet2
igual = 0; // inicializa variavel logica
do
{
if (vet1[i] == vet2[j])
igual = 1;// achou elem. igual em vet1 e vet2
j++; // avanca para proximo elemento em vet2
}
while ((igual == 0) && (j <= MAX)) ;
if (igual)
{
k++; // incrementa indice de vet_inters
vet_inters[k] = vet1[i]; // copia elem. para vet_inters
}
}
// Apresentacao do resultado: vetor interseccao ou mensagem
if (k >= 0)
{
printf("\nConjunto interseccao\n\n");
for (i= 0; i <= k; i++)
printf("%d ",vet_inters[i]);
}
else
printf("\nNao ha conjunto interseccao\n\n");
printf("\n\n");
system("pause");
return 0;
}
Respostas dos Exercícios de Fixação em C 19
{
printf("\nValor %d: ", i + 1);
scanf("%d", &vet[i]); // preenche vet por leitura
}
printf("\nValor a procurar: ");
scanf("%d", &procurado); // le valor a ser procurado em vet
achado = 0; // inicializa achado
i = MIN;
while ((!achado) && (i < MAX))
{
if (vet[i] == procurado)
achado = 1;
i++;
}
if (achado)
printf("\nEncontrou o valor buscado!\n");
else
printf("\nNao encontrou o valor buscado!\n");
printf("\n\n");
system("pause");
return 0;
}
printf("\n\n");
system("pause");
return 0;
}
system("pause");
return 0;
}
if (tabpop[i][j] <= 0)
printf("\nPopulacao deve ser > 0!");
}
while (tabpop[i][j] <= 0);
}
//Calcula a media da populacao das capitais}
somapopcap = 0;
for (i = 0; i < MAX_EST; i++)
somapopcap = somapopcap + tabpop[i][0];
mediapopcap = (float)somapopcap / MAX_EST;
printf ("Media de populacao das capitais: %12.0f" ,
mediapopcap);
//Determinacao do municipio mais populoso e
//em que estado se encontra
maior = tabpop[0][1];
estadomaior = 0;
municipiomaior = 1;
for (i = 0; i < MAX_EST; i++)
for (j = 1; j < MAX_MUNIC; j++)
if (tabpop[i][j] > maior)
{
maior = tabpop[i][j];
estadomaior = i;
municipiomaior = j;
}
printf("\n\n");
printf
("O municipio mais populoso eh o %d do estado %d com %d habitantes",
municipiomaior , estadomaior + 1 , maior );
printf("\n\n");
//Determinacao e apresentacao dos municipios que tem populacao maior
//que a media da populacao das capitais.
primeiravez = 1;
for (i = 0; i < MAX_EST; i++)
for (j = 1; j < MAX_MUNIC; j++)
if (tabpop[i][j] > mediapopcap)
{
if (primeiravez) // cabecalho so quando for escrever
{
puts (titulo);
// printf("\n\n");
primeiravez = 0;
}
printf
("\nMunicipio : %d do Estado: %d Populacao: %12d",
j , i + 1, tabpop[i][j]);
}
if (primeiravez)
{
Respostas dos Exercícios de Fixação em C 27
printf
("\nNenhum dos municipios mais populosos tem populacao");
printf("\nsuperior aa media da populacao das capitais.");
}
printf("\n\n");
system("pause");
return 0;
}
printf("\nRua invalida\n\n");
}
while (rua < MINRUAS || rua > MAXRUAS);
do
{
printf
("Numero acidentes do cruzamento avenida %d com rua %d: \n",
avenida, rua);
printf("\n\n avenida %d rua %d\n\n",
avenida - 1, ((rua - IND_AJUST) - 1));
scanf("%d", &matriz[avenida - 1] [(rua - IND_AJUST) - 1]);
if (matriz[avenida - 1] [(rua - IND_AJUST) - 1] < 1)
printf("\nNumero de acidentes invalido!\n");
}
while (matriz[avenida - 1] [(rua - IND_AJUST) - 1] < 1);
do
{
printf("Avenida de 1 a %d, ou -1 para parar): ", MAXAVENIDAS);
scanf("%d", &avenida);
if ((avenida < 1 || avenida > MAXAVENIDAS) && avenida != -1)
printf("\nAvenida invalida");
}
while ((avenida < 1 || avenida > MAXAVENIDAS) && avenida != -1);
}
for (avenida = 0; avenida < MAXAVENIDAS; avenida++)
{
printf("\n");
for (rua = 0; rua < MAXRUAS - IND_AJUST; rua++)
printf("\%2d ", matriz[avenida] [rua]);
}
// Geracao da matriz condensada
linha = -1;
for (i = 0; i < MAXAVENIDAS; i++)
{
for (j = 0; j < MAXRUAS - IND_AJUST; j++)
if ( matriz[i] [j] > 0)
{
linha++;
cont_com_acidentes++;
matriz_condensada[linha] [0] = matriz[avenida] [j];
matriz_condensada[linha] [1] = i + 1;
matriz_condensada[linha] [2] = j + IND_AJUST + 1;
}
}
printf("\nCruzamentos com acidentes:");
printf("\nAvenida Rua Acidentes");
printf("\n\n");
for (i = 0; i <= linha; i++)
printf("\n%6d %6d %6d", matriz_condensada[i] [0],
matriz_condensada[i] [1], matriz_condensada[i] [2]);
Respostas dos Exercícios de Fixação em C 29
printf("\n\n");
system("pause");
return 0;
}
}
do
{
scanf("%d", &estoque[i]);
if ((estoque[i] < 0) || (estoque[i] > MAX_ESTOQ))
printf
("Estoque invalido! \n\nEntre com o valor correto: ");
}
while ((estoque[i]< 0) || (estoque[i] > MAX_ESTOQ));
}
//laco para processamento de varias vendas
do
{
printf("\nForneca a letra inicial do produto desejado");
printf(" (c, l, e, b ou f para terminar):\n");
scanf(" %c", &p);
printf("\nQuantos produtos deseja? ");
scanf("%d", &nr);
switch (p)
{
case 'c': //Caderno
if (estoque[caderno] >= nr)
estoque[caderno] = estoque[caderno] - nr;
else printf("\nSem estoque!");
break;
case 'l': //Lapis
if (estoque[lapis] >= nr)
estoque[lapis] = estoque[lapis] - nr;
else printf("\nSem estoque!");
break;
case 'e': //Esferografica
if (estoque[esferografica] >= nr)
estoque[esferografica] = estoque[esferografica] - nr;
else printf("\nSem estoque!");
break;
case 'b': //Borracha
if (estoque[borracha] >= nr)
estoque[borracha] = estoque[borracha] - nr;
else printf("\nSem estoque!");
break;
case 'f': //Fim do laco de vendas
printf("\n FIM \n\n");
break;
}
}
while (p != 'f');
// Informa estoques finais
for (i = caderno; i <= borracha; i++)
34 Respostas dos Exercícios de Fixação em C
{
switch (i)
{
case caderno: printf("\nCadernos: ");
break;
case lapis: printf("\nLapis: ");
break;
case esferografica: printf("\nEsferograficas: ");
break;
case borracha: printf("\nBorrachas: ");
break;
}
printf("%d \n", estoque[i]);
}
printf("\n\n");
system("pause");
return 0;
}
9 subprogramas
Exercício 9.1 Algoritmo TesteMenu
//Chama uma funcao void para apresentar ao usuario um menu de opcoes
#include <stdio.h>
#include <stdlib.h>
void ApresentaMenu ( );
int main ( )
{
int lido;
lido = 0;
while (lido != 10)
{
ApresentaMenu ( );
scanf("%d", &lido);
printf("\nLido = %d", lido);
}
printf("\n\n");
system("pause");
return 0;
}
void ApresentaMenu ( )
{
// apresenta ao usuario um menu com diferentes opcoes
printf("\nEscolha sua opcao de compra:\n");
printf("\n1: Refrigerante");
printf("\n2: Cerveja");
printf("\n3: Bauru");
Respostas dos Exercícios de Fixação em C 35
{
float vet_maiores [ARR_SUP];
float v1[ARR_SUP], v2[ARR_SUP], v3[ARR_SUP];
int indice;
for (indice = ARR_INF; indice < ARR_SUP; indice++)
{
printf("\nForneca o primeiro valor real: ");
scanf("%f", &v1[indice]);
printf("\nForneca o segundo valor real: ");
scanf("%f", &v2[indice]);
printf("\nForneca o terceiro valor real: ");
scanf("%f", &v3[indice]);
vet_maiores[indice] =
Maior3(v1[indice], v2[indice], v3[indice]);
}
printf("\n\n");
// Imprime vetor de maiores valores
for (indice = ARR_INF; indice < ARR_SUP; indice++)
printf(" %6.2f ", vet_maiores[indice]);
printf("\n\n");
system("pause");
return 0;
}
float Maior3 (float val1, float val2, float val3)
{
float maior;
maior = val1;
if (val2 > maior)
maior = val2;
if (val3 > maior)
maior = val3;
return maior;
}
10 manipulação de strings
Exercício 10.1 Função ContaStrings: inteiro
/*Usa uma funcao que devolve o numero de ocorrencias de uma string dentro de
outra*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNOME 60
int ContaStrings (char *, char *);
int main ( )
{
int resultado;
char string1[MAXNOME];
char string2[MAXNOME];
printf("Forneca string principal (sem espacos): ");
scanf("%s", &string1);
38 Respostas dos Exercícios de Fixação em C
printf
("Forneca string a ser pesquisada(igual ou menor que a anterior): ");
scanf("%s", &string2);
printf
("\n\nO texto %s tem %d ocorrencias do texto %s\n",string1,
ContaStrings(string1, string2), string2 );
printf("\n\n");
system("pause");
return 0;
}
int ContaStrings (char st1[], char st2[])
{
int inds1, inds2; // indices para percorrer strings
int comps1, comps2; // comprimento das strings
int cont; // contador de ocorrencias
int inicomp; // indice de st1 que inicia uma comparacao
inds1 = 0;
inds2 = 0;
comps1 = strlen(st1);
comps2 = strlen (st2);
cont = 0; // inicializa contador de ocorrencias
while ((comps1 - 1) >= (comps2 - 1))
{
inicomp = inds1; // guarda onde inicia esta comparacao
while ((st1[inds1] == st2[inds2]) && (inds2 < comps2))
{
inds1++;
inds2++;
}
if (inds2 >= comps2) // encontrou uma ocorrencia de st2 em st1
{
cont++;
// diminui comprimento de st1 para busca
comps1 = comps1 - comps2;
// posiciona novamente no primeiro caractere de st2
inds2 = 0;
}
else
{
inds1 = inicomp + 1;
inds2 = 0;
comps1--;
}
}
return cont; //devolve contagem
}
Respostas dos Exercícios de Fixação em C 39
11 registros
Exercício 11.1 Algoritmo FuncionáriosSalMaiorMédia
//Informa nomes dos funcionarios com salario superior a media
#include <stdio.h>
#include <stdlib.h>
#define MAXNOME 60
#define NRFUNC 2
#define NRSAL 2
struct tipo_salario
{
int ano;
float valor;
};
struct funcionario
{
int cod;
char nome[MAXNOME];
tipo_salario salario[NRSAL] ;
int depto;
char cargo;
};
int main ()
{
int indfunc, indsal; //indices
float somasal, mediasal; // soma e media dos salarios
struct funcionario funcionarios[NRFUNC];
42 Respostas dos Exercícios de Fixação em C
{
struct data
{
int dia;
int mes;
int ano;
};
struct tipo_aluno
{
char nome[MAXNOME];
struct data admissao;
struct data nasc;
};
int idade; // idade que o aluno entrou no curso
struct tipo_aluno aluno;
//Leitura dos dados do aluno
printf("\nNome do aluno: ");
scanf("%s", aluno.nome);
printf("\nData de admissao do aluno\n ");
printf("\nDia:");
scanf("%d", &aluno.admissao.dia);
printf("\nMes: ");
scanf("%d", &aluno.admissao.mes);
printf("\nAno: ");
scanf("%d", &aluno.admissao.ano);
printf("\nData de nascimento do aluno\n ");
printf("\nDia: ");
scanf("%d", &aluno.nasc.dia);
printf("\nMes: ");
scanf("%d", &aluno.nasc.mes);
printf("\nAno: ");
scanf("%d", &aluno.nasc.ano);
printf("\n%s\n ", aluno.nome);
//Calculo da Idade de Ingresso
if (aluno.admissao.mes == aluno.nasc.mes)
if (aluno.admissao.dia >= aluno.nasc.dia)
idade = aluno.admissao.ano - aluno.nasc.ano;
else
idade = aluno.admissao.ano - aluno.nasc.ano - 1;
else
if (aluno.admissao.mes > aluno.nasc.mes)
idade = aluno.admissao.ano - aluno.nasc.ano;
else
idade = aluno.admissao.ano - aluno.nasc.ano - 1;
//Informa idade de ingresso
printf("\nIdade de ingresso de %s = %d\n ", aluno.nome, idade);
system("pause");
return 0;
}
44 Respostas dos Exercícios de Fixação em C
12 conjuntos
Na versão do C utilizada, não existe o tipo Conjunto.
13 arquivos
Exercício 13.1 Função ContaVogaisEmArqTexto: inteiro
/*Utiliza uma funcao que conta as vogais em um arquivo texto*/
#include <stdio.h>
#include <stdlib.h>
int ContaVogaisEmArqTexto (FILE *, char *);
int main( )
{
FILE *arq_ent;
char nome_arq_ent[] = "texto.txt";
system("color f1");
printf("\nNumero de vogais no arquivo: %d\n",
ContaVogaisEmArqTexto(arq_ent, nome_arq_ent));
system ("pause");
return 0;
}
int ContaVogaisEmArqTexto (FILE *arq_ent, char *nome_arq_ent )
{
int total_de_vogais = 0;
char caract;
if ((arq_ent = fopen(nome_arq_ent, "r")) == NULL)
{
printf("Erro abertura arquivo para ler\n");
system("pause");
}
else
{
while (!(feof(arq_ent)))// laco de leitura
{
caract = getc(arq_ent); // leitura caractere a caractere
if (caract == 'a' || caract == 'A' || caract == 'e'
|| caract == 'E' ||
caract == 'i' || caract == 'I' || caract == 'o'
|| caract == 'O' ||
caract == 'u' || caract == 'U' )
total_de_vogais++;
}
fclose (arq_ent);
return total_de_vogais;
}
}
Respostas dos Exercícios de Fixação em C 45
}
else
{
if ((arq_sai = fopen(nome_arq_sai, "w")) == NULL)
{
printf("Erro abertura arquivo para escrever\n");
system("pause");
}
else
{
printf("\nValor a excluir: \n");
scanf("%d", &val_excl);
while(fread(&valor, sizeof(int),1,arq_ent) !=0)
{
if (valor != val_excl)
fwrite(&valor, sizeof(int), 1, arq_sai);
else
*resultado = 1;
}
fclose (arq_ent);
fclose (arq_sai);
}
}
}
char fone[MAXTEL];
};
int main( )
{
int codigo, resultalt;
FILE *arq_cli1;
FILE *arq_cli2;
struct regist reg;
system ("color 70");
char nome_cli1[MAX], nome_cli2[MAX];
fflush(stdin);
printf("Nome do arquivo de entrada (arq_cli1): ");
fgets(nome_cli1, sizeof(nome_cli1), stdin);
if (nome_cli1[strlen(nome_cli1) - 1] == '\n')
nome_cli1 [strlen(nome_cli1) - 1] = '\0';
fflush(stdin);
printf("Nome do arquivo de saida (arq_cli2): ");
fgets(nome_cli2, sizeof(nome_cli2), stdin);
if (nome_cli2[strlen(nome_cli2) - 1] == '\n')
nome_cli2 [strlen(nome_cli2) - 1] = '\0';
fflush(stdin);
do
{
printf("\nCodigo do registro a alterar: ");
scanf("%d", &codigo);
if (codigo < 1 || codigo > MAXCOD)
printf("Codigo deve ser entre 1 e %d", MAXCOD);
}
while ((codigo < 1) || (codigo > MAXCOD));
AltCampRegArq(arq_cli1, arq_cli2, nome_cli1,
nome_cli2, codigo, reg, &resultalt, MAX);
if (resultalt)
printf("\nAlteracao do reg %d bem sucedida!", codigo);
system("pause");
return 0;
}
void AltCampRegArq(FILE *arq_cli1, FILE *arq_cli2, char* nome_arq_cli1, char*
nome_arq_cli2, int codigo, struct regist reg, int* alterou_ok, int maximo)
{
char endereco_aux[maximo];
*alterou_ok = 0;
if(!(arq_cli1 = fopen(nome_arq_cli1,"r")))
{ //abre para leitura
printf("Erro de abertura arquivo arquivo de entrada");
system("pause");
}
else
{
if(!(arq_cli2 = fopen(nome_arq_cli2,"w")))
48 Respostas dos Exercícios de Fixação em C
{
int cod;
char nome[MAXNOME];
char endereco[MAXEND];
char telefone[MAXTEL];
};
FILE* arq_cli;
FILE* abrearquivo(int);
int geraarquivo(FILE *,struct regist *, int, int, int, int);
void listagem(FILE *, struct regist *);
int main()
{
struct regist emp;
if(((arq_cli = abrearquivo(MAX))== NULL))
{
printf("\nOcorreu um erro na abertura do arquivo inicial.\n");
system("pause");
}
else
{
printf("Listados: %d",geraarquivo(arq_cli, &emp,
MAXCOD, MAXNOME, MAXTEL, MAXEND));
fclose(arq_cli);
system("pause");
return 0;
}
}
FILE * abrearquivo(int maximo)
{
char nome[maximo];
printf("\nInforme o nome do arquivo:");
fflush(stdin);
fgets(nome, maximo, stdin);
if (nome[strlen(nome)-1]=='\n')
(nome[strlen(nome)-1]='\0');
return fopen(nome, "wb+");
}
int geraarquivo(FILE *arquivo, struct regist *emp,
int max_cod, int max_nom, int max_fone, int max_end)
{
int continuar=0, cod=0, cont=0;
do
{
do
{
printf("\nCodigo da empresa (1 a %d):", max_cod);
fflush(stdin);
scanf("%d", &emp->cod);
50 Respostas dos Exercícios de Fixação em C
{
printf("\nOcorreu um erro na abertura do arquivo inicial.\n");
system("pause");
}
else
{
listagem(arq_cli, &emp);
fflush(stdin);
printf("\n");
fclose(arq_cli);
system("pause");
return 0;
}
}
FILE * abrearquivo(int maximo)
{
char nome[maximo];
printf("\nInforme o nome do arquivo:");
fflush(stdin);
fgets(nome, maximo, stdin);
if (nome[strlen(nome)-1]=='\n')
(nome[strlen(nome)-1]='\0');
return fopen(nome, "r");
}
void listagem(FILE *arquivo, struct regist *emp)
{
while(!feof(arquivo))
{
if(fread(emp, sizeof(struct regist), 1, arquivo)==1)
{
if ((emp->cod)>0)
{
printf("Codigo: %d\n\n", emp->cod);
printf("Nome: %s\n\n", emp->nome);
printf("Endereco: %s\n\n", emp->endereco);
printf("Fone: %s\n\n", emp->telefone);
}
}
}
}
#define MAXCOD 10
#define MAXNOME 31
FILE *arq;
struct atlet
{
int cod;
char nome[MAXNOME];
int idade;
float altura;
};
void CriaArqAtletRand(FILE *, int, int, struct atlet);
void EliminaNovaLinha (char *);
FILE * AbreArqLeituraEEscrita (FILE *, char *);
void VeSePosOcupNoArq (FILE *, int , struct atlet, int *);
int main( )
{
struct atlet reg;
system ("color f1");
CriaArqAtletRand(arq, MAXCOD, MAXNOME, reg );
system("pause");
return 0;
}
void CriaArqAtletRand(FILE *arq, int maxcod, int maxnome, struct atlet atleta )
{
char nomearq[maxnome];
int cod_ent, op, a_listar, ocup;
int result_leitura;
struct atlet buffer;
fflush(stdin);
printf
("Nome do arquivo (com no maximo %d caracteres): ", maxnome - 1);
fgets(nomearq, sizeof(nomearq), stdin);
EliminaNovaLinha (nomearq);
fflush(stdin);
if (!(arq = AbreArqLeituraEEscrita (arq, nomearq)))
{
printf("Erro abertura");
system("pause");
}
else
{
do
{
do
{
printf("Codigo do atleta: ");
scanf("%d", &cod_ent);
if (cod_ent < 1 || cod_ent > maxcod)
Respostas dos Exercícios de Fixação em C 53
printf
("\nCodigo deve estar entre 1 e %d!\n", maxcod);
}
while (cod_ent < 1 || cod_ent > maxcod);
VeSePosOcupNoArq (arq, cod_ent, atleta, &ocup);
if (!ocup)
{
atleta.cod = cod_ent;
fflush(stdin);
printf
("\nNome (com no maximo %d caracteres): ",
maxnome - 1);
fgets (atleta.nome, sizeof(atleta.nome), stdin);
EliminaNovaLinha (atleta.nome);
fflush(stdin);
printf("\nIdade: ");
scanf("%d",&atleta.idade);
printf("\nAltura: ");
scanf("%f",&atleta.altura);
fseek(arq,cod_ent*sizeof(struct atlet),SEEK_SET);
fwrite(&atleta,sizeof(struct atlet),1,arq);
fflush(arq);
}
else
printf
("\nCodigo - %d - inclusao para ja existente!\n", cod_ent);
printf("\n1-InserirNovo, 2-Encerrar\n");
scanf("%d", &op);
}
while(op != 2);
/*
//para ativar este trecho basta retirar os símbolos de
//comentario.
fseek(arq, 0 * sizeof(struct atlet), SEEK_SET);
printf("-----Comeco da listagem-----\n");
while(!feof(arq))
{
if (fread(&atleta,sizeof(struct atlet),1,arq) == 1)
{//le e confirma se o que foi lido eh estrutura,
//entao imprime
if (atleta.idade > 0)
{
printf("Codigo: %d\n", atleta.cod);
printf("Nome: %s\n",atleta.nome);
printf("Idade: %d\n",atleta.idade);
printf("Altura: %6.2f\n\n",atleta.altura);
}
}
}
54 Respostas dos Exercícios de Fixação em C
printf("-----Fim da listagem-----\n");
*/
fclose(arq);
}
}
void EliminaNovaLinha (char estringue[])
{
if (estringue[strlen(estringue) - 1] == '\n')
estringue[strlen(estringue) - 1] = '\0';
}
FILE * AbreArqLeituraEEscrita (FILE *arq, char *nomarq)
{/* tenta abrir como r+b, se o arquivo
nao existir abre como w + b*/
if(!(arq = fopen(nomarq,"r+b")))
arq = fopen(nomarq, "w+b");
return arq;
}
void VeSePosOcupNoArq (FILE *arq_atleta, int num, struct atlet reg, int *ocup)
{
//verifica se posicao num do arquivo esta ocupada
//posicionamento do arquivo
fseek(arq,num*sizeof(struct atlet),0);
*ocup = fread(®,sizeof(struct atlet),1,arq); // leitura
//ocup recebera 1 se leitura for bem sucedida.
//0, se nao existir a posicao
if (*ocup == 1 && reg.idade == 0)
// neste caso a posicao existe, mas eh do sistema,
// entao pode ser usada
*ocup = 0;
}
int cod;
char nome[30];
int idade;
float altura;
};
Respostas dos Exercícios de Fixação em C 55
int i;
struct tipoNo *plista_Al, *paux;
tipoNo *alunos[MAXALUNOS];
//ler dados de todos os alunos, montando listas
printf("\nForneca dados dos alunos\n ");
printf ("Codigo do aluno: ");
scanf("%d", &aluno); // leitura do codigo do primeiro aluno
// enquanto codigo for valido
while ((aluno > 0) && (aluno < (MAXALUNOS + 1)))
{
plista_Al = MontaListaEncadeada() ;
//Guardar ponteiro do inicio da lista desse aluno no vetor
alunos[aluno -1] = plista_Al;
printf ("\n\nCodigo do aluno: ");
scanf("%d", &aluno); // le codigo do proximo aluno
}
/*
//Para ativar este trecho, basta tirar os simbolos de //comentario.
//Lista disciplinas e medias de todos os alunos
for (i = 0; i < MAXALUNOS; i++)
{
printf("\n\nDados do aluno %d ", i + 1);
paux = alunos[i];
while (paux != NULL)
{
printf
("\nCodigo %d valor %6.2f", paux->codigo, paux->valor);
paux = paux->elo;
}
}
*/
//informar disciplinas e notas de um determinado aluno
printf("\n\n\nLista dados de um aluno determinado\n");
do
{
printf ("\n\nCodigo do aluno: ");
scanf("%d", &aluno); //leitura do codigo do aluno a ser pesquisado
if ((aluno < 1) || (aluno > MAXALUNOS))
printf("\nCodigo entre 1 e %d\n", MAXALUNOS);
}
while ((aluno < 1) || (aluno > MAXALUNOS));
paux = alunos[aluno - 1];
while (paux != NULL)
{
//informa disciplina e nota
printf("\nCodigo %d valor %6.2f", paux->codigo, paux->valor);
//avanca para proximo nodo
paux = paux->elo;
}
58 Respostas dos Exercícios de Fixação em C
printf("\n\n");
system ("pause");
return 0;
}
tipoNo * MontaListaEncadeada()
{
struct tipoNo *pnovo, *pult, *plista;
int cod;
float val;
//inicializar plista para lista vazia
plista = NULL;
//Ler dados da primeira disciplina
printf("\nForneca codigo da disciplina:");
scanf("%d", &cod);
printf("\nForneca media:");
scanf("%f", &val);
//repetir enquanto nao tiver sido lido o ultimo no
while (cod >= 0)
{
// alocar novo no para a lista
pnovo = (struct tipoNo *) malloc (sizeof (tipoNo));
//preencher no com os dados lidos
pnovo->codigo = cod;
pnovo->valor = val;
if (plista == NULL)
{
plista = pnovo;//eh o primeiro no da lista
pult = pnovo;
}
else
{
// encadear no novo com o ultimo
pult->elo = pnovo;
// avancar ponteiro do ultimo para o novo no alocado
pult = pnovo;
}
//ler dados das proximas disciplinas
printf("\nForneca codigo da disciplina:");
scanf("%d", &cod);
printf("\nForneca media:");
scanf("%f", &val);
}
if (plista != NULL) // testa se a lista tem algum no
pult->elo = NULL; // elo do ultimo passa a ser nulo
return plista;
}
Respostas dos Exercícios de Fixação em C 59
15 recursividade
Exercícios 15.1 Procedimento MostraVersão1
/*Usa uma funcao void recursiva, com informacoes sendo apresentadas
na fase do desempilhamento.*/
#include <stdio.h>
#include <stdlib.h>
void MostraVersao1(int, int);
int main ( )
{
int vali = 2;
int valn = 8;
system("color f1");
MostraVersao1(vali, valn);
printf("\n\n");
system("pause");
return 0;
}
void MostraVersao1(int i, int n)
{
if (i >= n)
{
printf("\n\nChamadas Recursivas concluidas");
printf("\n%d", i);
}
else
{
MostraVersao1(i+2, n);
printf("\n%d", i);
}
}
Procedimento MostraVersão2
/*Usa uma funcao void recursiva, com informacoes sendo apresentadas
na fase do empilhamento.*/
#include <stdio.h>
#include <stdlib.h>
void MostraVersao1(int, int);
int main ( )
{
int vali = 2;
int valn = 8;
system("color f1");
MostraVersao1(vali, valn);
printf("\n\n");
system("pause");
return 0;
}
60 Respostas dos Exercícios de Fixação em C
}
}
{
int vetor[LIMSUP];
int i;
system("color f1");
for (i = 0; i < LIMSUP; i++)
{
printf("\nValor %d: ", i + 1);
scanf("%d", &vetor[i]);
}
for (i = 0; i < LIMSUP; i++)
printf("\n%d ", vetor[i]);
Quick(vetor,0, LIMSUP - 1);
for (i = 0; i < LIMSUP; i++)
printf("\n%d ", vetor[i]);
printf("\n\n");
system("pause");
return 0;
}
void Quick(int *v, int li, int ls)
{
int x;
int i, j; // indices utilizados para percorrer o vetor
int pivo; // valor contido no primeiro elemento considerado
int sinal; // indica final de uma varredura
sinal = 0;
if (li < ls)
{
i = li; // posiciona i e j no inicio e no final
j = ls;
pivo = v[li];
do
{
i++;
//avanca i enquanto o elemento for inferior ao pivo e nao chegar
//ao final do segmento analisado
while ((v[i] < pivo) && (i < ls))
i++;
//recua j enquanto o elemento for superior ao pivo
//e nao chegar ao inicio do segmento analisado
while ((v[j] > pivo) && (j > li))
j-- ;
if (i < j) // permuta dois elementos
Troca(v + i, v + j);
else
sinal = 1; // indica que terminou
}
while (!sinal);
Troca(v + j, v + li); //posiciona pivo em sua posicao
Quick(v, li, j - 1);
62 Respostas dos Exercícios de Fixação em C
Quick(v, j + 1, ls);
}
}
void Troca(int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}
scanf("%d", &valor);
}
printf("\nPesquisa encerrada!\n");
system("pause");
return 0;
}
int lugar (int *v, int x, int inf, int sup)
{
int meio;
if (((inf == sup) && (v[sup] != x)) || (inf > sup))
return -1; // nao achou
else
{
// determina elemento central
meio = (inf + sup) / 2;
if (*(v + meio) == x)
return meio; //achou
else
//identifica a metada onde sera continuada a pesquisa e
//faz chamada recursiva, alterando um dos limites.
if (x < *(v + meio))
return lugar(v, x, inf, meio - 1); //metade superior
else
return lugar(v, x, meio + 1, sup); //metade inferior
}
}
}
int palindroma (char s [], int inicio, int fim )
{
if (inicio >= fim)
return 1;
else
if (s[inicio] == s[fim])
return palindroma(s, ++inicio, --fim);
else
return 0;
}