Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Programação linguagem C: exercícios e respostas, Manuais, Projetos, Pesquisas de Teoria dos Jogos

Aprendendo a programar: programando a linguagem C + exercícios e respostas

Tipologia: Manuais, Projetos, Pesquisas

Antes de 2010
Em oferta
30 Pontos
Discount

Oferta por tempo limitado


Compartilhado em 21/06/2009

emerson-damasceno-de-oliveira-8
emerson-damasceno-de-oliveira-8 🇧🇷

5

(1)

18 documentos

1 / 59

Documentos relacionados


Pré-visualização parcial do texto

Baixe Programação linguagem C: exercícios e respostas e outras Manuais, Projetos, Pesquisas em PDF para Teoria dos Jogos, somente na Docsity! Aprendendo  a  Programar Programando  na  Linguagem C Para Iniciantes Jaime Evaristo Respostas dos Exercícios  Propostos  Capítulo 1 1.  Naturalmente, na primeira travessia um índio levaria um branco até a outra margem e  voltaria sozinho. A questão é a segunda: não poderia atravessar um índio e um branco, pois ao  chegar na outra margem haveria dois brancos e um índio; não poderiam atravessar dois índio, pois  o terceiro ficaria com dois brancos. A solução é atravessar dois brancos e um deles retornar. A  terceira travessia só pode ser feita por dois índios, pois já existem dois brancos na outra margem.  A questão é o retorno. A única possibilidade é retornar um índio e um branco! Temos então o  seguinte algoritmo: 1. Atravessem um índio e um branco. 2. Retorne o índio. 3. Atravessem dois brancos. 4. Retorne um branco. 5. Atravessem dois índios. 6. Retornem um índio e um branco. 7. Atravessem dois índios. 8. Retorne um branco. 9. Atravessem dois brancos. 10. Retorne um branco. 11. Atravessem dois brancos.   2. Indicando por 1, 2, 3, 4, ... os discos na ordem crescente dos seus diâmetros, temos para  o caso n = 2:  1. Disco 1 da origem para auxiliar. 2. Disco 2 da origem para o destino. 3. Disco 1 da auxiliar para o destino. Para o caso n = 3, basta observar que é necessário apenas transportar os dois discos 1 e 2 da  origem para auxiliar (que é o caso anterior), transportar o disco três da origem para o destino e os  discos 1 e 2 da torre auxiliar para o destino (que é, novamente, o caso anterior). 1. Disco 1 da origem para destino. 2. Disco 2 da origem para  auxiliar. 3. Disco 1 do destino para  auxilia. 4. Disco 3 da origem para destino. 5. Disco 1 da auxiliar para origem. 6. Disco 2 da auxiliar para o destino. 7. Disco 1 da origem para o destino. 3. Indiquemos por P(m, n) = 0 se m e n  têm o mesmo peso e P(m, n) > 0 se a esfera m é  mais pesada que a esfera n. Temos então a seguinte proposta: 1. Pese as esferas 1 e 2. 2. Se P(1, 2) = 0, pese as esferas 1 e 3. 2.1 Se P(1, 3) > 0 então forneça como resposta:  a esfera 3 tem peso menor que as  esferas 1 e 2. scanf("%d %d %d %d", &Num1, &Den1, &Num2, &Den2); Num = Num1*Den2 + Num2*Den1; Den = Den1*Den2; printf("(%d/%d) + (%d/%d) = (%d/%d)", Num1, Den1, Num2, Den2, Num, Den); } 2.d) /* Programa que determina o maior multiplo de um inteiro menor ou igual a outro  inteiro*/ #include <stdio.h> main() { int Num, Divisor, MaiorMultiplo; printf("Digite o inteiro do qual ser o número procurado deve ser multiplo \n"); scanf("%d", &Divisor); printf("Digite o inteiro que deve ser maior do o que múltiplo procurado\n"); scanf("%d", &Num); MaiorMultiplo = Num ­ Num % Divisor; printf(" \n O maior multiplo de  %d menor do que ou igual %d e' %d \n",  Divisor, Num,  MaiorMultiplo); } 2.e) /*Programa para calcular o perimetro de um poligono regular de n lados inscrito numa  circunferencia de raio r*/ #include <stdio.h> #include <math.h> main() { const float Pi = 3.1416; float r, Perim, Seno; int n; printf("Digite o numero de lados do poligono e o raio \n"); scanf("%d %f", &n, &r); Perim = 2*n*r*sin(Pi/n); printf("Perimetro do poligono regular de %d lados inscrito numa circunferencia de raio  %.2f: %.2f \n", n, r, Perim); } 3. /*Programa para permutar os conteudos de duas variaveis sem utilizar uma variavel  auxiliar*/ #include <stdio.h> main() { float x, y; printf("Digite os dois numeros \n"); scanf("%f %f", &x, &y); printf("Conteudos antes da troca x =  %0.1f, y = %0.1f \n", x, y); x = x + y; y = x ­ y; x = x ­ y; printf("Conteudos depois da troca x = %0.2f, y = %0.2f \n", x, y); } 4. /*Programa para determinar entrada mais duas parcelas inteiras de uma compra*/ #include <stdio.h> main() { float Compra, Entrada; int Parcelas; printf("Digite o valor da compra: "); scanf("%f", &Compra); Parcelas = Compra/3; Entrada = Compra ­ 2*Parcelas; printf("Entrada = %0.2f, Parcelas %d.00 \n", Entrada, Parcelas); } 5. /*Programa para converter um tempo dado em segundos para horas, minutos e  segundos*/ #include <stdio.h> main() { int Tempo, Horas, Minutos, Segundos; printf("Digite o valor do intervalo de tempo (em segundos): "); scanf("%d", &Tempo); Horas = Tempo/3600; Minutos = (Tempo % 3600)/60; Segundos = Tempo % 60; printf("O intervalo de tempo de %d segundos equivale a %d h %d min %d s \n", Tempo,  Horas, Minutos, Segundos); } 6. /*Programa para converter um tempo dado em minutos para horas, minutos e segundos*/ #include <stdio.h> main() { float Tempo, Segundos; int Horas, Minutos; printf("Digite o valor do intervalo de tempo (em minutos): "); scanf("%f", &Tempo); Horas = Tempo/60; Minutos = Tempo ­ 60*Horas; Segundos = (Tempo ­ 60*Horas ­ Minutos)*60; printf("O intervalo de tempo de %.2f min equivale a %d h %d min %.2f s \n", Tempo,  Horas, Minutos, Segundos); } 7. /*Programa para discriminar as notas de um saque num caixa eletrônico*/  #include <stdio.h> main() { int s, Saque, Notas100, Notas50, Notas10, Notas5, Notas1; printf("Digite o valor do saque: "); scanf("%d", &Saque); Notas100 = Saque/100; s = Saque % 100; Notas50 = s/50; s = s % 50; Notas10 = s/10; s = s % 10; Notas5 = s/5; Notas1 = s % 5; printf("Valor do saque: %d \n Distribuicao da notas: \n %d de 100 \n %d notas de 50 \n %d  notas de 10 \n %d notas de 5 \n %d notas de 1", Saque, Notas100, Notas50, Notas10, Notas5,  Notas1); } 8. /*Programa para determinar a prestação de um financiamento*/ #include <math.h> main() { float Valor, i, Coef, Pot, Prestacao; int n; printf("Digite o valor do financiamento: "); scanf("%f", &Valor); printf("Digite o valor da taxa: "); scanf("%f", &i); i = i/100; puts("Digite o número de prestações: "); scanf("%d", &n); Pot = pow(1 + i, n); Coef = (Pot ­ 1)/(i*Pot); Prestacao = Valor/Coef; printf("Financiamento: %.2f\n Taxa: %.2f\n Número de prestações: %d\n Valor da  prestação: %.2f", Valor, 100*i, n, Prestacao); } Capítulo 3 1. /*Programa que determina o intervalo de tempo decorrido entre dois instantes*/ main() { int h1, min1, s1, h2, min2, s2, h, min, s; 6. /*Programa para verificar se um triangulo de lados dados e retangulo*/ #include <stdio.h> main() { float a, b, c, Hip, Cat1, Cat2; printf("Digite os comprimentos dos lados: \n"); scanf("%f %f %f", &a, &b, &c); Cat1 = b; Cat2 = c; if ((a < b + c) && (b < a + c) && (c < a +b)) { if ((a > b) && (a > c)) Hip = a; else if (b > c) { Hip = b; Cat1 = a; } else { Hip = c; Cat2 = a; } if (Hip*Hip == Cat1*Cat1 + Cat2*Cat2) printf("Triangulo retangulo de hipotenusa   %0.2f  e  catetos %0.2f  e %0.2f",  Hip,  Cat1, Cat2); else printf("O triangulo de lados %0.2f, %0.2f e %0.2f nao e retangulo", a, b, c); } else printf("Os numeros dados nao sao comprimentos dos lados de um triangulo"); }  7. /*Programa para determinar as raizes de uma equacao do segundo grau*/ #include <stdio.h> #include <math.h> main() { float a, b, c, Imag, Real, Delta, x1, x2; printf("Digite os coeficientes \n"); scanf("%f %f %f", &a, &b, &c); if (a != 0) { Real = ­b/(2*a); Delta = b*b ­ 4*a*c; if (Delta >= 0) { Imag = sqrt(Delta)/(2*a); x1 = Real + Imag; x2 = Real ­ Imag; printf("As raizes da equacao de coeficientes %.2f, %.2f e %.2f sao %.2f e %.2f ", a, b,  c, x1, x2); } else { Imag = sqrt(­Delta)/(2*a); printf("As raizes da equacao de coeficientes %.2f , %.2f e %.2f sao %.2f + %.2fi e %.2f  ­ %.2fi ", a, b, c, Real, Imag, Real, Imag); } } else printf("A equacao nao e do segundo grau"); } 8. /* Programa para determinar a idade de uma pessoa em anos, meses e dias*/ #include <stdio.h> main() { int DiaNasc, MesNasc, AnoNasc, DiaAtual, MesAtual, AnoAtual, Anos, Meses, Dias; printf("Digite a data do nascimento \n"); scanf("%d %d %d", &DiaNasc, &MesNasc, &AnoNasc); printf("Digite a data de hoje \n"); scanf("%d %d %d", &DiaAtual, &MesAtual, &AnoAtual); Anos = AnoAtual ­ AnoNasc; Meses = MesAtual ­ MesNasc; Dias = DiaAtual ­ DiaNasc; if ((Anos < 0) || ((Anos == 0) && (Meses < 0)) || ((Anos == 0) && (Meses == 0) && (Dias  < 0))) printf("Data de nascimento invalida"); else { if (Meses < 0) { Anos = Anos ­ 1; Meses = Meses + 12; } if (Dias < 0) { if (Meses > 0) Meses = Meses ­ 1; else Anos = Anos ­ 1; switch (MesNasc) { case 2 : if (AnoAtual % 4 == 0) Dias = Dias + 29; else Dias = Dias + 28; break; case 4: case 6: case 9: case 11: Dias = Dias + 30; break; default: Dias = Dias + 31; }; } printf("Idade = %d ano(s), %d mes(es) e %d dia(s)", Anos, Meses, Dias); } } 9. /*Programa para calular a nota minima de um aluno*/ #include <stdio.h> main() { float Bim1, Bim2, Bim3, Bim4, MediaBimestral, NotaMinima; printf("Digite as notas bimestrais: \n"); scanf("%f %f %f %f", &Bim1, &Bim2, &Bim3, &Bim4); MediaBimestral = (Bim1 + Bim2 + Bim3 + Bim4)/4; if ((MediaBimestral >= 5) && (MediaBimestral < 7)) { NotaMinima = (55 ­ 6*MediaBimestral)/4; printf("O aluno com notas bimestrais %0.2f, %0.2f, %0.2f e %0.2f precisa na final de  %0.2f", Bim1, Bim2, Bim3, Bim4, NotaMinima); } else printf("O aluno com notas bimestrais %0.2f, %0.2f, %0.2f e %0.2f nao esta na prova  final"); } Capítulo 4 1. 5 15 45 4 12 36 3 if (i % j == 0) Soma = Soma + j; if (Soma == 2 * i) printf("%d \n", i); } } } 6. /*Programa para listar todos so numeros xyzt tais (xy + zt)*(xy + zt) = xyzt*/ #include <stdio.h> main() { int Mil, Cen, i; printf("Numeros xyzt tais (xy + zt)*(xy + zt) = xyzt"); for (i = 1000; i < 10000; i++) { Cen = i % 100; Mil = i/100; if ((Cen + Mil)*(Cen + Mil) == i) printf("%d \n", i); } } 7. /*Programa para listar todos os numeros com dois algarismos cujo produto nao se altera  se os algarismos sao invertidos*/ #include <stdio.h> main() { int InvertI, InvertJ, i, j; printf("Numeros com dois algarismos cujo produto nao se altera os algarismos sao  invertidos"); for (i = 10; i < 100; i++) { InvertI = (i % 10)*10 + (i/10); for (j = 10; j < 100; j++) { InvertJ = (j % 10)*10 + (j/10); if (i*j == InvertI*InvertJ) printf("%d*%d = %d*%d = %d \n", i, j, InvertI, InvertJ, i*j); } } } 8. /*Programa para determinar o numero  de algarismos de um inteiro positivo*/ #include <stdio.h> #include <math.h> main() { int Num, NumAlg, n; Num = 1; while (Num != ­1) { printf("Digite o  numero (­1 p/ encerrar) \n"); scanf("%d", &Num); NumAlg = 1; while (pow10(NumAlg) < Num) NumAlg = NumAlg + 1; printf("%d possui %d algarismo(s) \n", Num, NumAlg); } } 9. /*Programa para verificar se um inteiro maior que 2 e' um produto de dois primos*/ #include <stdio.h> #include <math.h> main() { int Num, Fator1, Fator2, r, i; Num = 1; while (Num != ­1) { printf("Digite o  numero (­1 p/ encerrar) \n"); scanf("%d", &Num); r = sqrt(Num); Fator1 = 2; while ((Num % Fator1 != 0) && (Fator1 <= r)) Fator1 = Fator1 + 1; if (Fator1 > r) printf("%d é primo\n", Num); else { Fator2 = Num/Fator1; r = sqrt(Fator2); i = 2; while ((Fator2 % i != 0) && (i <= r)) i = i + 1; if (i <= r) printf("%d nao e produto de dois primos \n", Num); else printf("%d e' produto dos primos %d e %d \n", Num, Fator1, Fator2); } } } 10. /*Programa para determinar a decomposição em fatores primos de um inteiro*/ #include <stdio.h> main() { int Num, i, n, Mult; Num = 1; while (Num != ­1) { printf("Digite o  numero (­1 p/ encerrar) \n"); scanf("%d", &Num); n = Num; printf("Decomposicao em fatores primos de %d: \n", Num); i = 2; while (n > 1) { Mult = 0; while (n % i == 0) { n = n/i; Mult = Mult + 1; } if (Mult > 0) printf("%d com multiplicidade  %d  \n", i, Mult); i = i + 1; } } } 11. Ver solução na seção 5.6 do capítulo 5. 12. /* Programa que determina o n­esimo termo da sequencia de Fibbonaci*/ #include <stdio.h> main() { int n, i, Ant1, Ant2, Termo; printf("Digite n \n"); scanf("%d", &n); Termo = 1; Ant1 = 1; Ant2 = 0; i = 1; while (i < n) { Termo = Ant1 + Ant2; Ant2 = Ant1; Ant1 = Termo; i = i + 1; } printf(" O termo de ordem %d da sequencia de Fibbonaci e' %d \n",  n, Termo); } long int FatImpar(int n) { long int Fat; int i; if (n % 2 == 1) { Fat = 1; for (i = 3; i <= n; i = i + 2)      Fat = Fat * i; return (Fat); } else return(­1); } /*Funcao recursiva para o calculo do fatorial impar*/ long int FatImparRec(int n) { if (n % 2 == 1) if (n == 1) return(1); else return(n*FatImparRec(n ­ 2)); else return(­1); } 3. /*Programa para determinar o fatorial primo de um inteiro dado*/ #include <stdio.h> #include <math.h> /*Funcao que recebe um inteiro e verifica se ele e primo*/ int Primo(int x) { int j; j = 2; while ((x % j != 0) && (j <= sqrt(x))) j = j + 1; if (j <= sqrt(x)) return(0); else return(1); } main() { int Num, j; long FatPrim; printf("Digite o inteiro \n"); scanf("%d", &Num); if (Primo(Num)) { FatPrim = 2; for (j = 3; j <= Num; j++) if (Primo(j)) FatPrim = FatPrim*j; printf("Fatorial primo de %d e igual a %d \n", Num, FatPrim); } else printf("%d nao e primo \n", Num); } 4. /*Funcao que retorna a soma dos algarismos de um inteiro dado*/ /*Funcao que retorna o numero de algarismos de um inteiro dado*/ int NumAlg(int n) { int i = 1; while (pow10(i) < n) i = i + 1; return (i); } int SomaAlgarismos(int n) { int i, Potencia, NumAlgarismos, Soma; NumAlgarismos = NumAlg(n); Soma = n % 10; for (i = 1; i < NumAlgarismos; i++) { n = n/10; Soma = Soma + n%10; } return (Soma); } 5. /*Função recursiva para determinar o n­esimo termo da sequencia de Fibbonaci*/ int FibbRec(int x) { if ((x == 1) || (x == 2)) return(1); else return(FibbRec(x ­ 1) + FibbRec(x ­ 2)); } 6. /*Função recursiva para gerar uma tabuada de multiplicação*/ void Tabuada(int x) { int y; static a = 1, b = 1; if (x <= 9) { for (y = 2; y <= 9; y++) { gotoxy(a, b); printf("%d x %d = %d", x, y, x*y); b++; } if (x % 5 != 0) { a = a + 13; b = b ­ 8; } else { a = 1; b = 10; } Tabuada(x + 1); } } Capítulo 6 0. /*Função recursiva que determina a maior componente de um vetor*/  float MaiorDe2(float x, float y) { if (x > y) return x; else return y; } float MaiorCompRec(float *v, int t) { if (t == 2) return v[t ­ 1]; else return MaiorDe2(v[t ­ 1], MaiorCompRec(v, t ­ 1)); } 1. /*Função que exibe um vetor na ordem inversa*/ void InverteVetor(int *v, int t) { int i; float Media(float *v, int t) { int i; float Soma = 0.0; for (i = 0; i < t; i++) Soma = Soma + v[i]; return(Soma/t); } float DesvioPadrao(float *v, int t) { int i; float *d; float Med; Med = Media(v, t); for (i = 0; i < t; i++) d[i] = (v[i] ­ Med)*(v[i] ­ Med); return(sqrt(Media(d, t))); } 9. /*Função para determinar as componentes distintas de um vetor*/ /*Função que verifica se um dado valor está armazenado num vetor*/ int PesqSequencial(int v1[30], int t1, int x) { int i; i = 0; while ((v1[i] != x) && (i < t1)) i = i + 1; if (v1[i] == x) return (1); else return (0); } int ComponentesDistintas(int v2[30], int Aux[30], int t2) { int i, k; Aux[0] = v2[0]; k = 0; for (i = 1; i < t2; i++) if (PesqSequencial(Aux, k + 1, v2[i]) == 0) { k = k + 1; Aux[k] = v2[i]; } return(k + 1); } 10. /*Função que realiza um sorteio a partir dos algarismos das unidades dos números  sorteados pela loteria*/ void LeSorteio(int v[5]) { int i; for (i = 0; i < 5; i++) scanf("%d", &v[i]); } long NumeroSorteado(int v[5]) { int i; long n = 0; for (i = 4; i >= 0; i­­) n = n + (v[i] % 10)*(int)pow10(4 ­ i); return (n); } 11. /*Função que insere um valor num vetor numa posição dada*/ void InsereComponente(int *v, int &t, int x, int p) { int i; t = t + 1; for (i = t; i > p; i­­) v[i] = v[i ­ 1]; v[p] = x; } 12. /*Função que insere uma componente num vetor ordenado de modo que ele se mantém  ordenado*/ void InsereOrdenado(int *v, int t, int x) { int i, j; i = 0; while ((v[i] < x) && (i < t)) i = i + 1; t = t + 1; for (j = t; j > i; j­­) v[j] = v[j ­ 1]; v[i] = x; } 13. /*Função que exclui uma componente de um vetor*/ void DeletaComponente(int *v, int &t, int p) { int i; if (p < t) { for (i = p; i < t; i++) v[i] = v[i + 1]; t = t ­ 1; } } 14. /*Função que determina as componentes comuns de dois vetores*/ int PesqSequencial(int *v, int t, int x) { int i; i = 0; while ((v[i] != x) && (i < t)) i = i + 1; if (v[i] == x) return (1); else return (0); } void InterseptaVetores(int *v1, int t1, int *v2, int t2, int *v, int &t) { int i; t = 0; for (i = 0; i < t1; i++) if (PesqSequencial(v2, t2, v1[i]) == 1) { v[t] = v1[i]; t = t + 1; } } 15. /*Função que determina a maior diferença entre duas componentes consecutivas de um  vetor ordenado*/ int Maior(int *v, int t, int &p) { int i; float m; m = v[0]; p = 0; for (i = 1; i < t; i++) if (v[i] > m) { m = v[i]; p = i; } return(m); } { int i, Mult; i = 2; q = 0; while (n > 1) { Mult = 0; while (n % i == 0) { n = n/i; Mult = Mult + 1; } if (Mult > 0) { Fatores[q][0] = i; Fatores[q][1] = Mult; q = q + 1; } i = i + 1; } } 22. /*Função que verifica a aprovação de um aluno da Universidade Federal de Alagoas*/ float Menor(float v[4], int b) { int i, m; m = v[0]; b = 0; for (i = 1; i < 4; i++) if (v[i] <  m) { m = v[i]; b = i; } return (m); } void Reavaliacao(float v[4]) { int b, MenorNota; char s; float Reav; MenorNota = Menor(v, &b); if (MenorNota < 7) { printf("O aluno fez reavaliacao (S/N)?"); fflush(stdin); scanf("%c", &s); if (toupper(s) == 'S') { printf("Digite a nota da reavaliacao"); scanf("%f", &Reav); v[b] = Reav; } } } float Media(float v[4]) { int i; float m = 0; for (i = 0; i < 4; i++) m = m + v[i]; return(m/4); } float MediaFinal(float v[4], char *Sit) { float  NotaFin, MediaFin, MediaBim; char s; Reavaliacao(v); MediaBim = Media(v); if ((MediaBim < 5) || (MediaBim >= 7)) MediaFin = MediaBim; else { printf("O aluno fez prova final(S/N)?"); scanf("%c", &s); if (toupper(s) == 'S') { printf("Digite a nota da prova final"); scanf("%f", &NotaFin); MediaFin = (6*MediaBim + 4*NotaFin)/10; } } if (MediaFin < 5.5) *Sit = 'R'; else *Sit = 'A'; return(MediaFin); } 23. /*Função que retorna a transposta de uma matriz*/ void Transposta(float Mat[10][10], float Transp[10][10], int m, int n) { int i, j; for (i = 0; i < m; i++) for(j = 0; j < n; j++) Transp[j][i] = Mat[i][j]; } 24. /*Função que permuta duas linhas de uma matriz*/ void TrocaLinha(float v[10][10], int n, int Lin1, int Lin2) { int i; float Aux; for (i = 0; i < n; i++) { Aux = v[Lin1][i]; v[Lin1][i] = v[Lin2][i]; v[Lin2][i] = Aux; } } 25. /*Função que verifica se uma matriz é triangular*/ int VerificaMatrizTriangular(float v[10][10], int n) { int i = 0, j, Sim = 1; while ((i < n) && (Sim == 1)) { j = i + 1; while((j < n) && (Sim == 1)) if (v[i][j] != 0) Sim = 0; else j = j + 1; i = i + 1; } return (Sim); } 26. /*Função que verifica se uma matriz é simétrica*/  int VerificaMatrizSimetrica(float v[10][10], int n) { int i = 0, j, Sim = 1; while ((i < n) && (Sim == 1)) { j = 0; while((j < n) && (Sim == 1)) if (v[i][j] != v[j][i]) Sim = 0; else j = j + 1; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) printf("%d \t", v[i][j]); printf("\n"); } } int Escala(int v[20][20], int n, int o, int d) { int i, Esc, Menor; Esc = 1; Menor = v[o][o + 1] + v[0][d]; for (i = 0; i < n; i++) if (v[o][i] + v[i][d] < Menor) { Menor = v[o][i] + v[i][d]; Esc = i + 1; } return(Esc); } main() { int NumCidades, x, y, Origem, Destino, Esc; int Distancias[20][20]; clrscr(); printf("Digite o numero de cidades"); scanf("%d", &NumCidades); LeDistancias(Distancias, NumCidades); EscreveDistancias(Distancias, NumCidades); printf("Digite a origem e o destino \n"); scanf("%d %d", &Origem, &Destino); if (Origem < Destino) { x = Origem; y = Destino; } else { x = Destino; y = Origem; } if (Distancias[x­1][y­1] > 400) { Esc = Escala(Distancias, NumCidades, x, y) + 1; printf("A viagem de %d para  %d deve ter uma escala em %d", Origem, Destino, Esc); } else if (Distancias[x­1][y­1] == 0) printf("\aOrigem e destino iguais!"); else printf("A viagem de %d para % deve ser feita sem escalas"); } 31. /*Função recursiva para a exibição das combinações de n com taxa k, n e k dados*/ #include <stdio.h> void Combinacoes(int n, int k, int i, int s, int v[30]) { int m, j; if (i < k) for (j = s; j <= n ­ k + i + 1 ; j++) { v[i] = j; s = j + 1; Combinacoes(n, k, i + 1, s, v); if (i == k ­ 1) { for (m = 0; m < k; m++) printf("%d  ", v[m]); printf("\n"); } } } Capítulo 7 1. /*Fumção que realiza uma pesquisa "pessimista" num vetor*/ int PesquisaPessimista(int *v, int t, int x) { int i; i = 0; while((v[i] != x) && (v[t ­ i ­ 1] != x) && (i < t/2)) i = i + 1; if (v[i] == x) return (i); else if (v[t ­ i ­ 1] == x) return (t ­ i ­ 1); else return(­1); } 2. /*Função que implementa o insertsort*/ /*Função que insere um elemento num vetor ordenado*/ void InsereOrdenado(int v1[500], int &t, int x) { int i, j; i = 0; while ((v1[i] < x) && (i < *t )) i = i + 1; t = t + 1; for (j = t; j > i; j­­) v1[j] = v1[j ­ 1]; v1[i] = x; } void InsertSort(int v[500], int t) { int Aux[500]; int i, j = 1; Aux[0] = v[0]; for (i = 1; i < t; i++) InsereOrdenado(Aux, &j, v[i]); for (i = 0; i < t; i++) v[i] = Aux[i]; } 3. /*Versão recursiva do selectsort*/ void SelectSortRec(int *v, int t) { int Pos, m; if (t > 1) { MaiorElemento(v, t ­ 1, m, Pos); if (v[t ­ 1] < v[Pos]) { v[Pos] = v[t ­ 1]; v[t ­ 1] = m; } SelectSortRec(v, t ­ 1); } } Capítulo 8 int *BinDec(char *s) { int i, Comp, Dec = 0; Comp = strlen(s); for (i = 0; i < Comp; i++) if (s[i] == '1') Dec = Dec + pow(2, Comp ­ i ­ 1); return (Dec); } main() { char *Binario; int Decimal; printf("Digite o numero do sistema binario"); gets(Binario); Decimal = BinDec(Binario); printf("%s no sistema decimal: %d \n", Binario, Decimal); } 5. /*Função que verifica se uma conta foi digitada corretamente*/ int ArmazenaDigitos(char *s, int *v) { int i,  Comp; Comp = strlen(s); for (i = 0; i < Comp; i = i + 1) v[i] = (int) (s[i] ­ '0'); return(i); } char CalculaDigito(char *s) { char c; int t, i, j, Digito, *v; t = ArmazenaDigitos(s, v); Digito = 0; j = 2; for (i = t ­ 1; i >= 0; i = i ­ 1, j = j + 1) Digito = Digito + v[i]*j; Digito = Digito % 11; Digito = 11 ­ Digito; if ((Digito == 10) || (Digito == 11)) Digito = 0; c = (char) Digito + '0'; return (c); } int VerificaConta(char *s) { int Comp; char Dv, UltDigito; char Conta[30]; Comp = strlen(s); UltDigito = s[Comp ­ 1]; strncpy(Conta, s, Comp ­ 1); Conta[Comp ­ 1] = '\0'; Dv = CalculaDigito(Conta); if (UltDigito == Dv) return (1); else return (0); } 6. /*Programa que substitui uma palavra de um texto*/ #include <stdio.h> #include <string.h> int Pos(char *s1, char *s2) { char *Aux; Aux = strstr(s1, s2); if (Aux != NULL) return(Aux ­ s1); else return (­1); } void DeletaCaracteres(char *s, int n, int p) { int i,  Comp; char *Aux; Comp = strlen(s); if (p + n <= Comp) { i = p; while (i <= Comp ­ n) { s[i] = s[i + n]; i = i + 1; } } else s[p + 1] = '\0'; } void InsereCadeia(char *s1, char *s2, int p) { int Comp; char Aux1[50], Aux2[50]; Comp = strlen(s1); if (p <= Comp) { Comp = strlen(s1); strncpy(Aux1, s1, p); Aux1[p] = '\0'; strcpy(Aux2,  s1); DeletaCaracteres(Aux2, p, 0); strcat(Aux1, s2); strcat(Aux1, Aux2); strcpy(s1, Aux1); } } int Substituir(char *s1, char *s2, char *s3) { int p, Comp; p = Pos(s1, s2); if (p != ­1) { Comp = strlen(s2); DeletaCaracteres(s1, Comp, p); InsereCadeia(s1, s3, p); } else printf("Palavra nao encontrada"); return (p); } main() { char Texto[1000], Str1[1000], Str2[1000]; int i; printf("Digite o texto: "); gets(Texto); printf("Substituir: "); gets(Str1); printf("Substituir por: "); gets(Str2); printf("Texto original: %s \n", Texto); i = Substituir(Texto, Str1, Str2); if (i != ­1) printf("Novo texto: %s \n", Texto); n = n + 1; } Aux = Copia(s, n, i + 1); return (Aux); } /*Funcao que retorna as iniciiais dos nomes e dos sobrenomens, exceto do último  sobrenome*/ char *Iniciais(char *s) { int i, k, Comp; char Aux[40]; Aux[0] = s[0]; Aux[1] = '.'; Aux[2] = ' '; Comp = strlen(s); k = 3; for (i = 1; i < Comp ­ 1; i++) if ((s[i] == ' ') && (s[i+1] != ' ')) { Aux[k] = s[i+1]; Aux[k+1] = '.'; Aux[k+2] = ' '; k = k + 3; } Aux[k ­ 3] = '\0'; return (Aux); } void DeletaCaracteres(char *s, int n, int p) { int i,  Comp; char *Aux; Comp = strlen(s); if (p + n <= Comp) { i = p; while (i <= Comp ­ n) { s[i] = s[i + n]; i = i + 1; } } else s[p + 1] = '\0'; } /*Funcao para verificar se uma string esta contida numa outra string*/ int Pos(char *s1, char *s2) { char *Aux; Aux = strstr(s1, s2); if (Aux != NULL)  return(Aux ­ s1); else return (­1); } /*Funcao para deletar as particulas de, do, dos, da, das, e*/ void DeletaParticulas(char *s, char *Part) { int Comp, p; p = Pos(s, Part); Comp = strlen(Part); if ((p != ­1) && (s[p­1] == ' ') && (s[p + Comp] == ' ')) DeletaCaracteres(s, Comp, p); } main() { char Nome[40], Aux[40], Autor[40]; printf("Digite o nome: "); gets(Nome); strcpy(Aux, Nome); DeletaParticulas(Aux, "de"); DeletaParticulas(Aux, "da"); DeletaParticulas(Aux, "das"); DeletaParticulas(Aux, "do"); DeletaParticulas(Aux, "dos"); DeletaParticulas(Aux, "e"); strcpy(Autor, UltimoSobrenome(Aux)); strcat(Autor, ", "); strcat(Autor, Iniciais(Aux)); printf("Referencia bibliografica: %s \n", Autor); } 9. /*Função que retorna uma palavra no formato P A L A V R A*/  #include <string.h> #include <ctype.h> char *Aviso(char *s) { int c, i; c = strlen(s); for (i = c; i >= 0; i­­) { s[2*i] = toupper(s[i]); s[2*i ­ 1] = ' '; } s[2*i + 1] = '\0'; return s; } Capítulo 9 2. /*Funcao que reune dois arquivos de mesma estrutura (definida em struct TRegistro)*/ void ReuneArquivos(char s[12], char s1[12], char s2[12]) { FILE *p, *p1, *p2; struct TRegistro r; int Tam; Tam = sizeof(r); p1 = fopen(s1, "rb"); p2 = fopen(s2, "rb"); p = fopen(s, "wb"); fread(&r, Tam, 1, p1); while (!feof(p1)) { fwrite(&r, Tam, 1, p); fread(&r, Tam, 1, p1); } fread(&r, Tam, 1, p2); while (!feof(p2)) { if (ConsultaRegistro(r.Mat, s1) == ­1) fwrite(&r, Tam, 1, p); fread(&r, Tam, 1, p2); } fclose(p); fclose(p1); fclose(p2); } 3. /*Programa que gera, a partir de um arquivo contendo nomes e salarios, um arquivo com  os salarios maiores que 5.000,00*/ #include <stdio.h> #include <string.h> struct TRegistro { char Nome[40]; float SalBruto; fwrite(&r, Tam, 1, p); fgetpos(p, &Pos); Pos = Pos ­ 3*Tam; } fsetpos(p, &Byte); fwrite(&Reg, Tam, 1, p); fclose(p); } 5.  /*Programa   para   reunir   dois   arquivos   ordenados   num   terceiro   arquivo   também  ordenado*/ #include <stdio.h> #include <string.h> struct TRegistro { char Mat[4]; char Nome[40]; }; /*Funcao que verifica se um registro com matricula dada pertence ao arquivo*/ int ConsultaRegistro(char s[12], char s1[12]) { FILE *p; int Achou = 0; struct TRegistro r; fpos_t Byte; p = fopen(s1, "rb"); fgetpos(p, &Byte); fread(&r, sizeof(r), 1, p); while (!feof(p) && !Achou)       if (strcmp(s, r.Mat) == 0) Achou = 1; else { fgetpos(p, &Byte); fread(&r, sizeof(r), 1, p); } if (Achou == 0) return (­1); else return(Byte); } /*Funcao que copia o ultimo registro no final do arquivo*/ void CopiaUltimoRegistro(char s[12]) { struct TRegistro r; FILE *p; long Byte, Tam; p = fopen(s, "rb"); Tam = sizeof(r); fseek(p, ­Tam, SEEK_END); fgetpos(p, &Byte); fsetpos(p, &Byte); fread(&r, Tam, 1, p); fclose(p); p = fopen(s, "ab"); fwrite(&r, Tam, 1, p); fclose(p); } /*Funcao que determina a posicao de inclusao de um novo registro*/ long PosicaoDeInclusao(struct TRegistro Reg, char s[12]) { struct TRegistro r; long Tam, Byte, Pos; FILE *p; p = fopen(s, "rb"); Byte = 0; Tam = sizeof(r); fread(&r, Tam, 1, p); while ((!feof(p)) && (strcmp(Reg.Mat, r.Mat) > 0)) { Byte = Byte + Tam; fread(&r, Tam, 1, p); } fclose(p); return (Byte); } /*Funcao que inclui um registro num arquivo ordenado de modo que ele se mantenha  ordenado*/ void IncluiRegistroOrdenado(struct TRegistro Reg, char s[12]) { struct TRegistro r; long Tam, Byte, Pos; FILE *p; Tam = sizeof(r); Byte = PosicaoDeInclusao(Reg, s); CopiaUltimoRegistro(s); p = fopen(s, "rb+"); fseek(p, ­3*Tam, SEEK_END); fgetpos(p, &Pos); while (Pos >= Byte) { fsetpos(p, &Pos); fread(&r, Tam, 1, p); fgetpos(p, &Pos); fsetpos(p, &Pos); fwrite(&r, Tam, 1, p); fgetpos(p, &Pos); Pos = Pos ­ 3*Tam; } fsetpos(p, &Byte); fwrite(&Reg, Tam, 1, p); fclose(p); } void GeraArquivoOrdenado(char s1[12], char s2[12], char s[12]) { int Tam; FILE *p1, *p2, *p; struct TRegistro r; Tam = sizeof(r); p1 = fopen(s1, "rb"); p = fopen(s, "wb"); fread(&r, Tam, 1, p1); while (!feof(p1)) { fwrite(&r, Tam, 1, p); fread(&r, Tam, 1, p1); } fclose(p); p2 = fopen(s2, "rb"); while (!feof(p2)) { fread(&r, Tam, 1, p2); if (ConsultaRegistro(r.Mat, s) == ­1) IncluiRegistroOrdenado(r, s); } fclose(p1); fclose(p2); fclose(p); } main() { struct TRegistro NovoRegistro; char NomeArq1[12], NomeArq2[12], NomeArq[12]; printf("Digite os nomes dos arquivos a serem reunidos\n"); scanf("%s", NomeArq1); void TrocaRegistros(char s1[12], char s2[12], char s[12]) { int Tam; FILE *p; struct TRegistro r1, r2; fpos_t Byte1, Byte2; p = fopen(s, "rb+"); Tam = sizeof(r1); Byte1 = ConsultaRegistro(s1, s); if (Byte1 != ­1) { Byte2 = ConsultaRegistro(s2, s); if (Byte2 != ­1) { fsetpos(p, &Byte1); fread(&r1, Tam, 1, p); fsetpos(p, &Byte2); fread(&r2, Tam, 1, p); fsetpos(p, &Byte1); fwrite(&r2, Tam, 1, p); fsetpos(p, &Byte2); fwrite(&r1, Tam, 1, p); } else printf("Registro nao encontrado"); } else printf("Registro nao encontrado"); fclose(p); } 8. /*Função para ordenar um arquivo*/  /*Funcao que copia o ultimo registro no final do arquivo*/ void CopiaUltimoRegistro(char s[12]) { struct TRegistro r; FILE *p; long Byte, Tam; p = fopen(s, "rb"); Tam = sizeof(r); fseek(p, ­Tam, SEEK_END); fgetpos(p, &Byte); fsetpos(p, &Byte); fread(&r, Tam, 1, p); fclose(p); p = fopen(s, "ab"); fwrite(&r, Tam, 1, p); fclose(p); } /*Funcao que determina a posicao de inclusao de um novo registro*/ long PosicaoDeInclusao(struct TRegistro Reg, char s[12]) { struct TRegistro r; long Tam, Byte, Pos; FILE *p; p = fopen(s, "rb"); Byte = 0; Tam = sizeof(r); fread(&r, Tam, 1, p); while ((!feof(p)) && (strcmp(Reg.Mat, r.Mat) > 0)) { Byte = Byte + Tam; fread(&r, Tam, 1, p); } fclose(p); return (Byte); } /*Funcao  que  inclui  um registro  num arquivo  ordenado de modo que ele  se  mantenha  ordenado*/ void IncluiRegistroOrdenado(struct TRegistro Reg, char s[12]) { struct TRegistro r; long Tam, Byte, Pos; FILE *p; Tam = sizeof(r); Byte = PosicaoDeInclusao(Reg, s); CopiaUltimoRegistro(s); p = fopen(s, "rb+"); fseek(p, ­3*Tam, SEEK_END); fgetpos(p, &Pos); while (Pos >= Byte) { fsetpos(p, &Pos); fread(&r, Tam, 1, p); fgetpos(p, &Pos); fsetpos(p, &Pos); fwrite(&r, Tam, 1, p); fgetpos(p, &Pos); Pos = Pos ­ 3*Tam; } fsetpos(p, &Byte); fwrite(&Reg, Tam, 1, p); fclose(p); } void OrdenaArquivo(char s[12]) { int Tam; FILE *p, *Aux; struct TRegistro r; Tam = sizeof(r); p = fopen(s, "rb"); Aux = fopen("Temp.tmp", "wb"); fread(&r, Tam, 1, p); while (!feof(p)) { IncluiRegistroOrdenado(r, "Temp.tmp"); fread(&r, Tam, 1, p); } fclose(p); fclose(Aux); remove(s); rename("Temp.tmp", s); } 9. /*Função que remove comentarios, linha a linha, de um programa em C*/ void DeletaComentarios(char *s) { int Pos1, Pos2; FILE *p, *Aux; char Linha[80]; int i, Tamanho; p = fopen(s, "rt"); Aux = fopen("Temp.tmp", "wt"); Tamanho = TamanhoArquivo(s); i = 0; while (i < Tamanho) { fgets(Linha, 80, p); i = i + strlen(Linha); Pos1 = Pos(Linha, "/*"); if (Pos1 != ­1) { Pos2 = Pos(Linha, "*/"); if (Pos2 != ­1) DeletaCaracteres(Linha, Pos2 ­ Pos1 + 3, Pos1); } fwrite(Linha, strlen(Linha), 1, Aux); } fclose(p);
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved