Jaime Evaristo
Aprendendo a Programar Programando na Linguagem C Para Iniciantes Respostas dos Exercícios Propostos
Capí tulo tulo 1 ndio levaria um branco at é a outra margem e 1. Naturalmente, na primeira travessia um í ndio voltaria sozinho. A quest ão é a segunda: não poderia atravessar um í ndio ndio e um branco, pois ao chegar na outra margem haveria dois brancos e um í ndio; ndio; não poderiam atravessar dois í ndio, 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, ndios, pois já existem dois brancos na outra margem. A questão é o retorno. A única possibilidade é retornar um í ndio ndio e um branco! Temos ent ão o seguinte algoritmo: 1. Atravessem um í ndio ndio e um branco. 2. Retorne o í ndio. ndio. 3. Atravessem dois brancos. 4. Retorne um branco. 5. Atravessem dois í ndios. ndios. 6. Retornem um í ndio ndio e um branco. 7. Atravessem dois í ndios. 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.
Capí tulo tulo 1 ndio levaria um branco at é a outra margem e 1. Naturalmente, na primeira travessia um í ndio voltaria sozinho. A quest ão é a segunda: não poderia atravessar um í ndio ndio e um branco, pois ao chegar na outra margem haveria dois brancos e um í ndio; ndio; não poderiam atravessar dois í ndio, 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, ndios, pois já existem dois brancos na outra margem. A questão é o retorno. A única possibilidade é retornar um í ndio ndio e um branco! Temos ent ão o seguinte algoritmo: 1. Atravessem um í ndio ndio e um branco. 2. Retorne o í ndio. ndio. 3. Atravessem dois brancos. 4. Retorne um branco. 5. Atravessem dois í ndios. ndios. 6. Retornem um í ndio ndio e um branco. 7. Atravessem dois í ndios. 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.
2.2 Se P(3, 1) > 0 ent ão forneça como resposta: a esfera 3 tem peso maior que as esferas 1 e 2. 3. Se P(1, 2) > 0, pese as esferas 1 e 3. 3.1 Se P(1, 3) = 0 ent ão forneça como resposta: a esfera 2 tem peso menor que as esferas 1 e 3. 3.2 Se P(1, 3) > 0 ent ão forneça como resposta: a esfera 1 tem peso maior que as esferas 2 e 3. 3.3 Se P(3, 1) > 0 ent ão forneça como resposta: a esfera 1 tem peso menor que as esferas 2 e 3. 4. Se P(2, 1) > 0, pese as esferas 2 e 3. 4.1 Se P(2, 3) = 0 ent ão forneça como resposta: a esfera 1 tem peso menor que as esferas 2 e 3. 4.2 Se P(2, 3) > 0 ent ão forneça como resposta: a esfera 2 tem peso maior que as esferas 1 e 3. 4.3 Se P(3, 2) > 0 ent ão forneça como resposta: a esfera 2 tem peso menor que as esferas 1 e 3. 4. Para calcular o produto, utilizamos uma vari ável P que assume inicialmente o primeiro valor da rela ção e, para cada novo elemento, vai tendo o seu valor substitu í do do pelo produto do seu valor atual pelo novo elemento. A partir da í , a média geométrica é raiz n-ésima desse produto. 1. Chame de A o primeiro n úmero dado. 2. Chame de N o n úmero de elementos da rela ção 3. Faça P = A. 4. Repita N - 1 vezes as instru ções 4.1 e 4.2. 4.1. Chame de A o pr óximo número dado. 4.2. Substitua o valor de P por P x A. 5. Calcule M = Raiz(P, N) 6. Forneça M para o valor da m édia. 5. Basta observar que os dias da semana, sendo em n úmero de 7, repetem-se em ciclos de 7 dias. dias. Assim, Assim, se 01/01/ 01/01/190 1900 0 foi uma segundasegunda-fei feira, ra, o foram foram tamb também os dias 08/01/1900 08/01/1900,, 15/01/1900, 22/01/1900, 29/01/1900, 05/02/1900 e assim sucessivamente. Basta ent ão determinar o número de dias decorridos entre a data dada e o dia 01/01/1900 e calcular o resto da divis ão por 7. 1. Determine o número n de dias entre a data dada e 01/01/1900. 2. Calcule o resto r da divis ão de n por 7 3. Se r = 1 forneça como resposta segunda-feira. 4. Se r = 2 forneça como resposta terça-feira. 5. Se r = 3 forneça como resposta quarta-feira. 6. Se r = 4 forneça como resposta quinta-feira. 7. Se r = 5 forneça como resposta sexta-feira. 8. Se r = 6 forneça como resposta s ábado. 9. Se r = 0 forneça como resposta domingo. 6. Indicando por A(x, y) a travessia dos integrantes x e y e por V(x) a volta do integrante x, terí amos: amos:
1. A(baterista, baixista). 2. V(baterista). 3. A(guitarrista, vocal). 4. V(baixista) 5. A(baixista, baterista)
Capí tulo tulo 2 1.a) ((-(-9) + sqrt((-9)*(-9) - 4*3*6))/(2*3)) = ((9 + sqrt(81 – 72))/6) = ((9 + sqrt(9))/6) = = ((9 + 3)/6) = (12/6) = 2. (acos(0) == 0)) || (4 % 8 == 3) = (1 && 0) || 0 = 0 || 0 = 0. 1.b) ((pow(3, 2) == 9) && (acos(0) 2.a) /*Programa 2.a) /*Programa que converte uma temperatura dada em graus Fahrenheit para graus Celsius */ #include main() { float Fahrenheit, Celsius; printf("Digite a temperatura em Fahrenheit"); scanf("%f", &Fahrenheit); Celsius = 5 * (Fahrenheit - 32)/9; printf("A temperatura de %.2f Fahrenheit corresponde corresponde a %.2f Celsius Celsius ", Fahrenheit, Celsius); } 2.b) /*Programa 2.b) /*Programa que inverte um numero com tres algarismos*/ #include main() { int Num, Invert, Unid, Dez, Cent; printf("Digite o numero a inverter "); scanf("%d", &Num); Unid = Num % 10; Dez = (Num % 100)/10; Cent = Num/100; Invert = Unid*100 + Dez*10 + Cent; printf("Invertendo-se %d obtemos %d \n", Num, Invert); } 2.c /*Programa para somar duas fra ções*/ #include main() { int Num1, Den1, Num2, Den2, Num, Den; printf("Digite os termos das fracoes \n");
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 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 maior multiplo de %d menor do que ou igual igual %d e' %d \n", Divisor, Num, MaiorMultiplo); } 2.e) /*Programa 2.e) /*Programa para calcular o perimetro de um poligono regular de n lados inscrito numa circunferencia de raio r*/ #include #include 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 3. /*Programa para permutar os conteudos de duas variaveis sem utilizar uma variavel auxiliar*/ #include 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 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 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 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 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 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;
puts("Digite o instante inicial (horas, minutos e segundos)"); scanf("%d %d %d", &h1, &min1, &s1); puts("Digite o instante final (horas, minutos e segundos)"); scanf("%d %d %d", &h2, &min2, &s2); h = h2 -h1; min = min2 - min1; s = s2 - s1; if ((h < 0) || ((h == 0) && (min < 0)) || ((h == 0) && (min == 0) && (s < 0))) puts("Dados invalidos! O segundo instante é anterior ao primeiro"); else { if (s < 0) { min = min - 1; s = s + 60; } if (min < 0) { h = h - 1; min = min + 60; } printf( "Entre os instantes %d h %d min %d s e %d h %d min %d s passaram-se %d h %d min %d s", h1, min1, s1, h2, min2, s2, h, min, s); } } 2. /*Programa para arredondar um numero dado*/ #include main() { float Num, ParteFrac; int Arredondamento; printf("Digite um numero "); scanf("%f", &Num); Arredondamento = Num; ParteFrac = Num - Arredondamento; if (ParteFrac >= 0.5) Arredondamento = Arredondamento + 1; printf("Aredondando %f obtemos %d ", Num, Arredondamento); } 3. /*Programa para verificar se um inteiro dado e um quadrado perfeito*/ #include #include main() {
float RaizReal, ParteFrac; int Num, RaizInteira; printf("Digite um numero "); scanf("%d", &Num); RaizReal = sqrt(Num); RaizInteira = RaizReal; ParteFrac = RaizReal - RaizInteira; if (ParteFrac == 0) printf("%d eh quadrado perfeito de raiz igual a %d \n", Num, RaizInteira); else printf("%d nao eh quadrado perfeito \n ", Num); } 4. /*Progrma para determinar o maior de tres numeros dados*/ #include main() { float a, b, c, Maior; printf("Digite tres numeros"); scanf("%f %f %f", &a, &b, &c); Maior = a; if ((b > a) || (c > a)) if (b > c) Maior = b; else Maior = c; printf("O maior dos numeros %.2f , %.2f e %.2f e' %.2f \n", a, b, c, Maior); } 5. /*Programa para classificar um triangulo quanto ao comprimento dos lados*/ #include main() { float a, b, c; printf("Digite os comprimentos dos lados: \n"); scanf("%f %f %f", &a, &b, &c); if ((a < b + c) && (b < a + c) && (c < a +b)) if ((a == b) && (b == c)) printf("O triangulo de lados %0.2f, %0.2f e %0.2f e equilatero", a, b, c); else if ((a == b) || (a == c) || (b == c)) printf("O triangulo de lados %0.2f, %0.2f e %0.2f e isosceles", a, b, c); else printf("O triangulo de lados %0.2f, %0.2f e %0.2f e escaleno", a, b, c); else printf("Os numeros dados nao sao comprimentos dos lados de um triangulo"); }
6. /*Programa para verificar se um triangulo de lados dados e retangulo*/ #include 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 #include 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 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 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
9 27 2 6 18 1 3 9 2. /*Programa para calcular a soma dos quadrados dos n primeiros inteiros positivos, n dado*/ #include main() { int n, i, Soma; printf("Digite o valor de n: \n"); scanf("%d", &n); Soma = 0; for (i = 1; i <= n; i++) Soma = Soma + i*i; printf("A soma dos quadrados dos %d primeiros numeros naturais e %d \n", n, Soma); } 3.a) /*Programa para calcular a soma dos n primeiros termos de uma sequencia*/ #include main() { float Soma, Num, Den; int n, i; printf("Digite o valor de n: \n"); scanf("%d", &n); Num = 1; Den = 2; Soma = 0.5; for (i = 1; i < n; i++) { Num = Num + 2; Den = Den + 3; Soma = Soma + Num/Den; } printf("A soma dos %d primeiros numeros da sequencia dada e %f \n", n, Soma); } 3.b) /*Programa para calcular a soma dos n primeiros termos de uma sequencia*/ #include main() { float Soma;
int n, i; printf("Digite o valor de n: \n"); scanf("%d", &n); Soma = 0; for (i = 1; i <= n; i++) if (i % 2 == 1) Soma = Soma + 1.0/i; else Soma = Soma - 1.0/i; printf("A soma dos %d primeiros numeros da sequencia dada e %f \n", n, Soma); } 4. /*Programa para determinar o minimo multiplo comum de dois numeros positivos*/ #include main() { int x, y, a, b, Mmc; printf("Digite os dois numeros \n"); scanf("%d %d", &x, &y); a = x; b = y; if (x < y) { a = y; b = x; } Mmc = a; while (Mmc % b != 0) Mmc = Mmc + a; printf("mmc(%d, %d) = %d \n", x, y, Mmc); } 5. /*Programa para determinar os numeros perfeitos menores que um inteiro dado*/ #include main() { int Num, i, Soma, j; Num = 1; while (Num != -1) { printf("Digite o numero (-1 p/ encerrar) \n"); scanf("%d", &Num); printf("Numeros perfeitos menores que %d: \n", Num); for (i = 2; i < Num; i = i + 1) { Soma = i + 1; for (j = 2; j <= i/2; j++)
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 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 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 #include 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 #include 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 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 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); }
13. /*Programa para determinar o menor inteiro n tal que a soma dos n primeiros termos da serie harmonica e' maior que um real k dado*/ #include main() { int i; float Soma, k; k = 1; while (k != -1) { printf("Digite o valor de k (-1 p/ encerrar) \n"); scanf("%f", &k); Soma = 0; i = 0; while (Soma <= k) { i = i + 1; Soma = Soma + 1.0/i; } printf("O menor inteiro n tal que a soma dos n primeiros termos da serie harmonica e' maior que %.2f e' %d \n", k, i); } } 14. /*Programa para determinar os pares de n úmeros amigos menores que um n úmero dado*/ #include long SomaDivisoresMenores(long int n) /* Ver cap í tulo 5*/ { int i, s s = 1; m = n/2; for (i = 2; i <= m; i++) if (n % i == 0) s = s + i; return s; } main() { long int j, x, y; const long m = 10000; printf("Amigos menores que %ld \n", m); for (j = 2; j < m; j++) { x = SomaDivisoresMenores(j); if (j < x)
if (j == SomaDivisoresMenores(x)) printf("%-10ld %-20ld\n", j, x); } } 15. /*Programa que gera subconjuntos com tres elementos*/ #include main() { int n, i, j, k; printf("Digite o valor de n: \n"); scanf("%d", &n); for (i = 1; i <= n - 2; i++) for (j = i + 1; j <= n - 1; j++) for (k = j + 1; k <= n; k++) printf("{%d, %d, %d}\n", i, j, k); }
Capí tulo 5 1. /*Funcao para determinar o k-esimo digito de um numero*/ /*Funcao que retorna o numero de algarismos de um inteiro*/ int NumAlg(int n) { int i = 1; while (pow10(i) < n) i = i + 1; return (i); } int KDigito(int n, int k) { int i, Potencia, Resto; if (k <= NumAlg(n)) { Potencia = pow10(k); Resto = n % Potencia; Potencia = pow10(k – 1); return (Resto/Potencia); } else return(-1); } 2. /*Funcao iterativa para o calculo do fatorial impar*/
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 #include /*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;
for (i = t - 1; i >= 0; i--) printf("%d ", v[i]); } 2. /*Função que verifica se um vetor é palí ndromo*/ int VerificaVetorPalindromo(int *v, int t) { int i; i = 0; while((v[i] == v[t - i - 1]) && (i < t/2)) i = i + 1; if (i == t/2) return (1); else return (0); } 3. /*Função que decompõe um vetor nas componentes de ordem í mpar e de ordem par*/ void DecompVetor(int *v, int t, int *u, int *w) { int i; for (i = 0; i < t; i++) if (i % 2 == 0) u[i/2] = v[i]; else w[((i+1)/2) - 1] = v[i]; } 4. /Função que decompõe um vetor nas componentes de valor par e de valor í mpar*/ void DecompVetor(int *v, int t, int *u, int &k, int *w, int &j) { int i; k = j = 0; for (i = 0; i < t; i++) if (v[i] % 2 == 0) { u[k] = v[i]; k = k + 1; } else { w[j] = v[i]; j = j + 1; } } 5. /*Função que determina a norma de um vetor*/ float NormaVetor(int *v, int t)
{ int i; float Norma = 0; for (i = 0; i < t; i++) Norma = Norma + v[i]*v[i]; return(sqrt(Norma)); } 6. /Função que determina o produto escalar de dois vetores*/ int ProdutoEscalar(int *v, int *w, int t) { int i, ProdEscalar = 0; for (i = 0; i < t; i++) ProdEscalar = ProdEscalar + v[i]*w[i]; return(ProdEscalar); } 7. /*Função que determina a amplitude de uma tabela*/ /*Função que determina a maior componente de um vetor*/ float Maior(float *v, int t) { int i; float m; m = v[0]; for (i = 1; i < t; i++) if (v[i] > m) m = v[i]; return(m); } /*Função que determina a menor componente de um vetor*/ float Menor(float *v, int t) { int i; float m; m = v[0]; for (i = 1; i < t; i++) if (v[i] < m) m = v[i]; return(m); } float Amplitude(float *v, int t) { return(Maior(v, t) - Menor(v, t)); } 8. /Função que determina o desvio padr ão de uma tabela*/ /*Função que determina a m édia aritmética de uma tabela*/
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 MaiorDiferenca(int v[20], int t, int p) { int i, Diferencas[20]; for (i = 0; i < t - 1; i++) Diferencas[i] = v[i+1] - v[i]; return(Maior(Diferencas, t - 1, p)); } 16. /*Função que corrige um teste objetivo*/ int Corrige(int v1[50], int v2[50], int t) { int Acerto, i; Acerto = 0; for (i = 0; i < t; i++) if (v1[i] == v2[i]) Acerto = Acerto + 1; return (Acerto); } 17. /*Função que calcula o valor num érico de um polinomio*/ float ValNumerico(float *v, int g, float x) { int i; float ValorNumerico; ValorNumerico = v[g]; for (i = 0; i < g; i++) ValorNumerico = ValorNumerico + v[i]*pow(x, g - i); return (ValorNumerico); } 18. /*Função que determina uma moda de uma rela ção armazenada num vetor*/ float PosicaoMaior(float v[50], int t) { int i, m; m = 0; for (i = 1; i < t; i++) if (v[i] > m) m = i; return (m); } float Moda(float v[50], int t) { float Freq[50]; int i, j, p; for (i = 0; i < t; i++) {
Freq[i] = 0; for (j = 0; j < t; j++) if (v[j] == v[i]) Freq[i] = Freq[i] + 1; } p = PosicaoMaior(Freq, t); return (v[p]); } 19. /*Função para inverter um numero dado*/ long InverteNumero(int m) { int i, j, n, Alg[20]; long Invert; i = 0; n = m; while (pow10(i) < m) { Alg[i] = n % 10; n = n/10; i = i + 1; } i = i - 1; Invert = 0; for (j = 0; j <= i; j++) Invert = Invert + Alg[i-j]*pow10(j); return (Invert); } 20. /*Função que converte um numero decimal para o sistema bin ário*/ void DecBin(int n) { int i, j, *Bin; i = 0; while (n > 0) { Bin[i] = n % 2; n = n/2; i = i + 1; } for (j = i - 1; j >= 0; j--) printf("%d", Bin[j]); printf("\n"); } 21. /*Função para decompor um n úmero inteiro em fatores primos, armazenando os fatores e suas multiplicidades uma matriz*/ void DecFatPrimos(int n, int Fatores[10][10], int &q)
{ 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;
i = i + 1; } return (Sim); } 27. /*Função que multiplica duas matrizes*/ void MultMat(float m1[5][5], float m2[5][5], float m3[5][5], int l1, int c1, int l2, int c2) { int i = 0, j = 0, k = 0; if (c1 == l2) { while (i < l1) { m3[i][j] = 0; while (j < c2 && k < l2) { m3[i][j] = m3[i][j] + m1[i][k]*m2[k][j]; k = k +1; } k = 0; j = j + 1; if (j == c2) { i = i + 1; j = 0; } } } } 28. /*Função que determina as m édias das linhas de uma matriz, armazenando-as numa nova coluna da matriz*/ float Media(float v[10], int t) { int i; float Soma = 0.0; for (i = 0; i < t; i++) Soma = Soma + v[i]; return(Soma/t); } void MediaLinha(float v[10][10], int m, int n) { int i; for (i = 0; i < m; i++) v[i][n] = Media(v[i], n); }
29. /*Função que fornece o menor elemento de cada linha de uma matriz, indicando sua coluna*/ float Menor(float v[10], 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); } void MenorElemento(float v[10][10], int m, int n) { int i, Col; float Men; for (i = 0; i < m; i++) { Men = Menor(v[i], n, &Col); printf("%d \b %.2f \b %d \n", i + 1, Men, Col + 1); } } 30. /*Programa que determina uma escala para uma viagem entre duas cidades dadas*/ #include #include void LeDistancias(int v[20][20], int n) { int i, j; printf("Digite as distancias entre as cidades\n"); for (i = 0; i < n; i++) for (j = i; j < n; j++) if (i == j) v[i][j] = 0; else { scanf("%d", &v[i][j]); v[j][i] = v[i][j]; } } void EscreveDistancias(int v[20][20], int n) { int i, j;
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 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
1. /*Programa que verifica se uma palavra é palí droma*/ #include #include char *InverteString(char *s) { int i, Comp; char *St; Comp = strlen(s); for (i = 0; i < Comp; i++) St[i] = s[Comp - 1- i]; St[Comp] = '\0'; return (St); } main() { char Str[40], Aux[40]; printf("Digite a string\n"); gets(Str); strcpy(Aux, Str); strupr(Aux); if (strcmp(InverteString(Aux), Aux) == 0) printf("%s e palindroma", Str); else printf("%s nao e palindroma", Str); } 2. /*Programa que determina o n úmero de palavras de um texto dado*/ #include #include int ContaPalavras(char s[1000]) { int i, Cont = 0, Comp; Comp = strlen(s); for (i = 1; i <= Comp; i++) if ((s[i - 1] != ' ') && (s[i] == ' '|| s[i] == '\0')) Cont = Cont + 1; return (Cont); } main() { int NumPalavras; char Texto[1000]; printf("Digite o texto\n"); gets(Texto); NumPalavras = ContaPalavras(Texto); printf("O texto %s tem %d palavras\n", Texto, NumPalavras);
} 3. /*Programa para converter um número do sistema decimal para o sistema bin ário*/ #include char *InverteString(char *s) { int i, Comp; char *St; Comp = strlen(s); for (i = 0; i < Comp; i++) St[i] = s[Comp - 1- i]; St[Comp] = '\0'; return (St); } char *DecBin(int n) { int i, j; char *Bin; i = 0; while (n > 0) { if (n % 2 == 1) Bin[i] = '1'; else Bin[i] = '0'; n = n/2; i = i + 1; } Bin[i] ='\0'; Bin = InverteString(Bin); return(Bin); } main() { int Num; char *Binario; printf("Digite o numero \n"); scanf("%d", &Num); Binario = DecBin(Num); printf("%d = (%s)2 \n", Num, Binario); } 4. /*Programa para converter um n úmero do sistema bin ário para o sistema decimal*/ #include #include
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 #include 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);
} 7. /*Programa que converte um nome para o formato ultimo sobrenome/nome*/ #include #include char *Copia(char *s, int n, int p) { char *Aux; int Comp; Comp = strlen(s); if (p < Comp) { Aux = &s[p]; if (p + n < Comp) Aux[n] = '\0'; else Aux[strlen(Aux)] = '\0'; return(Aux); } else return (NULL); } char *UltimoSobrenome(char *s) { int i, n, Comp; char *Aux; Comp = strlen(s); i = Comp - 1; n = 0; while (s[i] != ' ') { i = i - 1; n = n + 1; } Aux = Copia(s, n, i + 1); return (Aux); } char *PrimeiroNome(char *s) { int i, n; char *Aux; i = 0; while (s[i] != ' ') i = i + 1; Aux = Copia(s, i, 0);
return (Aux); } main() { char Nome[40], Identificacao[40]; int i; printf("Digite o nome: "); gets(Nome); strcpy(Identificacao, UltimoSobrenome(Nome)); strcat(Identificacao, "/"); strcat(Identificacao, PrimeiroNome(Nome)); printf("Identificacao: %s \n", Identificacao); } 8. /*Programa que converte um nome dado para o formato de refer ência bibliográfica*/ #include #include char *Copia(char *s, int n, int p) { char *Aux; int Comp; Comp = strlen(s); if (p < Comp) { Aux = &s[p]; if (p + n < Comp) Aux[n] = '\0'; else Aux[strlen(Aux)] = '\0'; return(Aux); } else return (NULL); } /*Funcao que retorna o ultimo sobrenome de um nome de uma pessoa*/ char *UltimoSobrenome(char *s) { int i, n, Comp; char *Aux; Comp = strlen(s); i = Comp - 1; n = 0; while (s[i] != ' ') { i = i - 1;
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 #include 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 #include struct TRegistro { char Nome[40]; float SalBruto;
}; void GeraArquivoAltosSalarios(char *s, char *s1) { FILE *p, *t; struct TRegistro r; t = fopen(s, "rb"); if (t == NULL) printf("Arquivo %s nao existe", s); else { p = fopen(s1, "rb"); if (p != NULL) printf("Arquivo ja existe"); else { p = fopen(s1, "wb"); fread(&r, sizeof(r), 1, t); while (!feof(t)) { if (r.SalBruto > 5000) fwrite(&r, sizeof(r), 1, p); fread(&r, sizeof(r), 1, t); } } } fclose(p); fclose(t); } main() { char NomeArq[12]; printf("Digite o nome do arquivo\n"); scanf("%s", NomeArq); GeraArquivoAltosSalarios(NomeArq, "AltoSal.arq"); } 4. /*Função que inclui um registro num arquivo ordenado de modo que ele se mant ém ordenado*/ /*Função que copia o último 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); } /*Função que determina a posi ção de inclusão do novo arquivo*/ 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); } 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); } 5. /*Programa para reunir dois arquivos ordenados num terceiro arquivo também ordenado*/ #include #include 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);
scanf("%s", NomeArq2); printf("Digite o nome do novo arquivo"); scanf("%s", NomeArq); GeraArquivoOrdenado(NomeArq1, NomeArq2, NomeArq); } 6. /*Programa que gera um arquivo contendo os registros comuns a dois arquivos de mesma estrutura*/ #include #include struct TRegistro { char Cpf[12]; 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.Cpf) == 0) Achou = 1; else { fgetpos(p, &Byte); fread(&r, sizeof(r), 1, p); } if (Achou == 0) return (-1); else return(Byte); } void CruzaArquivos(char s1[12], char s2[12], char s[12]) { long Tam; struct TRegistro r; FILE *p, *p1, *p2; Tam = sizeof(r); p1 = fopen(s1, "rb"); p2 = fopen(s2, "rb");
p = fopen(s, "wb"); fread(&r,Tam, 1, p1); while (!feof(p1)) { if (ConsultaRegistro(r.Cpf, s2) != -1) fwrite(&r,Tam, 1, p); fread(&r,Tam, 1, p1); } fclose(p1); fclose(p2); fclose(p); } main() { char NomeArq1[12], NomeArq2[12]; printf("Digite o nome do arquivo \n"); scanf("%s", NomeArq1); printf("Digite o nome do segundo arquivo"); scanf("%s", NomeArq2); CruzaArquivos(NomeArq1, NomeArq2, "RegCom"); } 7. /*Funcao que permuta as posi ções de dois registros de um 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); }
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);
fclose(Aux); remove(s); rename("Temp.tmp", s); }
Capí tulo 10 1. /*Função que calcula a m édia aritmética de uma rela ção de números armazenada num lista*/ float Media() { float Md = 0; int i = 0; Prox = Inicio; while (Prox != NULL) { i = i + 1; Md = Md + (*Prox).Valor; Prox = (struct TElemento *) (*Prox).p; } return(Md/i); } 2. /*Função que insere um elemento numa lista ordenada*/ /*Função que determina a posi ção de inserção de um elemento numa lista ordenada*/ struct TElemento *Posicao(int n) { struct TElemento *Aux, *Ant; int i = 0; Prox = Inicio; Ant = Inicio; while ((Prox != NULL) && ((*Prox).Valor > n)) { Ant = Prox; i = i + 1; Prox = (*Prox).p; } return(Prox); } void Insere(int n) { struct TElemento *Aux, *Ant; Aux = Posicao(n); if (Aux == NULL)