Escolar Documentos
Profissional Documentos
Cultura Documentos
Nelma Moreira
Departamento de Cincia de Computadores e Faculdade de Cincias, Universidade do Porto e email: nam@ncc.up.pt
1997
(c) if x>y x=5; (d) if (x>y) { x=5 } (e) if (x>y) x=5 else x=6; 3. Para cada um dos programas seguintes: (a) Siga o funcionamento para os dados indicados, fazendo uma tabela da variao dos valores das variveis. ca a (b) Indique informalmente a sua funo genrica. ca e (a) 20, 30 #include<stdio.h> main() { int x,y,m; printf("Introduza dois valores: "); scanf("%d %d",&x,&y); if (y<x) m=x; else m=y; printf("%d \n",m); } (b) -2 #include<stdio.h> main() { int x,m; printf("Introduza um valor: "); scanf("%d",&x); if (x<0) m=-x; else m=x; printf("%d \n",m); } (c) 3, 9, 7 #include<stdio.h> main() { int x,y,z,m; printf("Introduza tres valores: "); scanf("%d %d %d",&x,&y,&z); m=x;
if (y<=z){ if (x<=y) {m=y;} else if (z<=x) {m=z;} } else if (x<=z) {m=z;} else if (y<=x) {m=y;} printf("%d \n",m); } (d) 10 #include<stdio.h> main() { int s=0,i=1,n; printf("Introduza um valor: "); scanf("%d",&n); while (i<=n) { s=s+i*i; i=i+1; } printf("%d \n",s); } (e) 33, 4, 8, 4, 5, 4, 7, 33 #include<stdio.h> main() { int x,y,n,s=0,; scanf("%d",&n); scanf("%d",&x); scanf("%d",&y); s=0; while (y!=n) { if (y=x) s=s+1; scanf("%d",&y); } printf("%d \n",s); } (f) 20 #include<stdio.h>
main() { int n; while(n<15) n=n-1; while(n>10) n=n+1; printf("%d \n",n); } (g) 325 #include<stdio.h> main() { int n,x; scanf("%d",&n); while(n!=0) { x=n/10; printf("%d \n",n-10*x); n=x; } } (h) 325 #include<stdio.h> #define Base 10 main() { int n,s; scanf("%d",&n); while(n!=0) { s=s+n%Base; n=n/Base; } printf("%d \n",s); } (i) 15, 2 #include<stdio.h> main() { int n,b; scanf("%d %d",&n, &b);
while(n>=b) { printf("%d \n",n%b); n=n/b; } printf("%d \n",n); } (j) #include<stdio.h> #define MAX 20 main() { int x=0,y=1,z,n; printf("%d \n", x); while (y<=MAX) { z=x+y; x=y; y=z; printf("%d \n",y); }}
4. Os seguintes programas pretendiam resolver os problemas enunciados mas nem todos funcionam correctamente. Corriga os erros e teste a sua execuo. ca (a) Somar os nmeros u mpares de 1 a 999. #include<stdio.h> main() { int s, k=1; while (k!=1000) { s=0; s=s+k; k=k+2; } printf("a soma e %d \n",s); } (b) Determinar o menor mltiplo comum entre a e b inteiros positivos. u #include<stdio.h>
main() { int a,b,m; m=a; y=0; while (y==0) { if (m%b==0) y=1; else m=m+a; } printf("o m.m.c entre %d e %b e %d \n",a,b,m); } (c) Determinar por subtraces sucessivas o quociente inteiro entre a e b, co com b = 0. #include<stdio.h> main() { int a,b,q; scanf("%d %d",a,b); q=0; while (a>b) { q++; a-=b; } printf(o quociente e %d\n,q); } (d) Determinar a soma das primeiras n potncias de k. e #include<stdio.h> main() { int k, n, s=1; scanf(%d, k); while(n!=0) { s=k; k=k*k; n=n-1; } printf(a soma e %d,s); }
8. Um nmero inteiro no negativo diz-se perfeito se igual ` soma dos seus u a e a divisores prprios. Por exemplo, 6=2+3+1. Dado n, determine todos os o nmeros perfeitos inferiores a n. u 9. Aproveitando o algoritmo desenvolvido na al ena anterior, calcular a percentagem dos nmeros entre 2 e 20000 tal que: u (a) so inferiores ` soma dos seus divisores; a a (b) so iguais ` soma dos seus divisores; a a (c) so superiores ` soma dos seus divisores. a a 10. Dada uma sequncia de n 1 inteiros determinar o nmero de subsequncias e u e no decrescentes. a 11. Determinar numa sequncia de valores lidos o nmero de valores maiores do e u que os seus dois vizinhos. Por exemplo, para 8, 2, 4, 1, 6, 12, 5, 9 4 e 12 vericam essa condio. ca 12. Produzir uma tabela com 3 colunas, a primeira contendo os inteiros de 1 a 10, a segunda os respectivos quadrados e a terceira os respectivos cubos. 13. Imprimir os termos inferiores a 10000 da sucesso assim determinada: os a 3 primeiros termos so dados; cada termo seguinte a soma dos 3 termos a e anteriores. 14. Dado um ano e uma data em dias, calcular o dia do ms e o ms correspone e dente. Dado um ano (> 1900) e um ms imprimir o calendrio desse ms. e a e Suponha que o 1 de Janeiro de 1900 uma segunda-feira. e 15. Converter um tempo em segundos para horas, minutos e segundos. E viceversa. 16.
1/2i
i=1
4. Dado x e n calcule:
2 n (a) 1 + x + x + . . . + x 2! n! 3 (1)2n+1 x2n+1 (b) x x + . . . + 3! (2n + 1)!
6. A sucesso a an = 4(1 1/3 + 1/5 . . . + (1)n+1 1/(2n 1)) converge para . calcule a1000 fazendo sair os resultados para valores de n de 100 em 100. 7. Tabelar, com 6 algarismos, a funo ca f(x) = cos( x + 1) para x = 0(5)45, em graus. 8. Tabelar a funo ca f(x) = (1)(1/x) /(1/x)! para x = 0.1(0.05)1.0. 9. Dados os nmeros reais a, b e c determine as ra da equao de segundo u zes ca 2 grau ax + bx + c = 0 indicando se as ra so reais ou complexas. zes a
10
Escreva programas em linguagem C para cada um dos seguintes problemas, utilizando se necessrio variveis indexadas. a a 1. Dada uma varivel indexada de inteiros a[100] construa e imprima uma a varivel indexada b[100] tal que: a os elementos de ordem par so iguais aos de a divididos por 2. a os elementos de ordem mpar so iguais aos de a multiplicados por 2. a 2. Lidos o valor de n e valores a[0], a[2], . . . , a[n-1], construa e imprima a varivel indexada resultante de cada uma das seguintes operaes (usando a co apenas a varivel indexada a[]): a (a) Efectuar uma permutao circular tal que a[n-1] passe para a[0]; ca (b) Deslocar para a esquerda os ultimos n-1 valores; (c) Deslocar os primeiros n-1 valores uma posio para a direita; ca (d) Inverter a posio dos valores de a[]; ca (e) Substituir cada a[i] pela mdia (a[i-1]+a[i]+a[i+1])/3. e 3. Dada uma sequncia de n nmeros, eventualmente repetidos, determinar o e u mximo da diferena de 2 elementos consecutivos assim como a(s) posio(es) a c ca o do primeiro desses elementos na sequncia. e 4. Dada uma varivel indexada v[] com valores inteiros, pretende-se imprimir a a soma mxima de uma subsequncia de elementos cont a e guos. Indicar tambm e os ndices inicial e nal da subsequncia. e 5. Use a funo rand() para gerar 1000 umeros aleatrios entre 1 e 100. Conte ca o o nmero de ocorrncias de cada nmero e imprima-os por ordem decrescente u e u de frequncia. e 6. Dado um nmero inteiro n e uma base de numerao b construa uma varivel u ca a indexada que contenha a representao de n na base b. ca 7. Duas variveis indexadas de inteiros n[] e m[] contm os d a e gitos da representao de dois nmeros respectivamente n e m numa base b. Calcular a ca u soma desses dois nmeros nessa base e converter o resultado para a base 10 u e imprimir. 8. Anlogo ao anterior, mas supondo que a base 2. Calcular a soma e o a e produto desses dois nmeros na base 2. u
11
9. Dadas duas sequncias de nmeros (sem repeties) a e b, ordenadas por ore u co dem crescente construir uma nova sequncia c, tambm ordenada, por juno e e ca dos elementos das duas dadas, eliminando repeties. co 10. Ordenar por ordem crescente uma sequncia de valores inteiros a[n] usando e o mtodo da: e Insero Introduzir cada elemento a[i], na subsequncia ordenada de a[0], ca e . . . , a[i-1] de modo a mant-la ordenada. e Para i=1,... n-1 faa x=a[i] c inserir x na posi~o correcta entre as posi~es 0 e i-1 ca co Para inserir x na posio correcta pode usar os mtodos de pesquisa ca e linear binria a Bolha Em cada iterao, percorrer os elementos da sequncia e comparar ca e pares de elementos consecutivos trocando-os se no estiverem ordenados. a Ao m de uma iterao o elemento maior encontrado. Repetir o ca e processo at todos os elementos estarem ordenados (no mximo n vezes). e a Para i=0,... n-2 e enquanto houver trocas para j=1,... n-i se a[j]>a[j+1} trocar a[j] com a[j+1] 11. Pretende-se determinar e imprimir numa sequncia de n valores lidos, todos e eles compreendidos entre 0 e 150, o nmero de valores entre 0 e 5, o nmero u u de valores entre 5 e 10, . . . , o nmero de valores entre 145 e 150 (o limite u inferior exclu e o superior inclu e do e do). 12. Lidos o valores n, e x[i] e y[i] para i=0,1,...n-1, pretende-se determinar o par de pontos mais prximo, admitindo-se que cada par (x[i],y[i]) o representa um ponto no plano. 13. O tringulo de Pascal caracterizado por ter em cada linha: a e (a) na primeira linha o nmero 1; u (b) nas outras a soma entre o nmero imediatamente acima e o nmero u u acima e ` esquerda. a Comea assim c
4.1
12
1 2 1 3 3 4 6
1 4 1
Desenvolva um algoritmo (usando apenas uma varivel uni-dimensional) que a imprima as primeiras 20 linhas do tringulo de Pascal. a Nota: numerando as linhas e colunas de 0 a n-1, na linha i e coluna j, encontra-se o nmero de combinaes de i objectos tomados j a j. u co
4.1
1. Sem utilizar as funes das bibliotecas standard do C escreva funes em C co co para: (a) determinar o comprimento duma string; (b) copiar uma string para outra; (c) vericar se duas strings so iguais; a (d) concatenar duas strings; (e) dadas duas strings determinar se a primeira uma subsequncia da e e segunda; 2. Ler uma linha do terminal e remover os caracteres brancos (espao e tac bulao) e de pontuao. ca ca 3. Determinar a maior linha dum texto (string) lido, guardar a maior linha e escrev-la. e 4. Uma string uma palavra se no contiver caracteres brancos. Lido um texto: e a (a) Determinar a maior palavra e imprimi-la. (b) Classicar as palavras dum texto quanto ao comprimento em 5 classes e determinar a frequncia absoluta de cada classe (nmero de palavras e u em cada classe). Considere na primeira classe comprimentos de palavras entre (exclusive) 0 e 3, na segunda entre 3 e 6 , terceira entre 6 e 9, na quarta entre 9 e 12 e na quinta, comprimentos maiores que 12. (c) Modique o programa anterior para imprimir os resultados em forma de histograma:
4.2
Variveis Indexadas Multidimensionais a Comprimento de Palavras Frequ^ncia e 0--3 ****** 3--6 *********** ... ...
13
(d) Suponha dada uma tabela de palavras, denominadas palavras-chave. Determine o nmero de ocorrncias de cada palavra-chave no texto, u e fazendo sair os resultados da seguinte forma: Palavra-Chave Ocorr^ncias e ... ... 5. Formatao de um texto. Ler um texto, guard-lo e format-lo segundo as ca a a seguintes opes: co (a) nmero mximo de caracteres por linha: p.e. 80. u a (b) ajustamento do texto: ` esquerda, ` direita ou ajustado igualmente ` a a a esquerda e ` direita. a No in cio o utilizador deve poder escolher as caracter sticas anteriores. O texto formatado (que deve ser guardado noutra varivel indexada) deve ser a impresso no nal. Para ajustar o texto, pode introduzir ou retirar caracteres brancos. 6. Baseado no mtodo de ordenao por insero, e usando as funes da biblioe ca ca co teca do C gets(), puts(), strcpy() e strncmp(), ordene uma sequncia de e linhas lidas do terminal. Considere uma varivel bidimensional texto[L][C] a para guardar as linhas de modo ordenado. Sempre que uma linha lida ela e inserida em texto, de modo a que a varivel que ordenada por linhas. e a
4.2
2. Dadas duas matrizes de inteiros a[n][m] e b[m][k] calcular a matriz c[n][k] correspondente ao produto matricial de a por b. 3. Dada uma matriz quadrada de inteiros a[n][n]
4.2
14
(a) calcular a sua transposta. (b) substituir cada componente de a[][] no pertencente aos limites (4 a cantos: superior, inferior, esquerdo e direito) pela mdia aritmtica dos e e seus 8 vizinhos. 4. Dada uma matriz com 1000 linhas e 7 colunas representando 1000 sorteios do totoloto (para valores inteiros de 1 a 52) calcular: (a) Para cada sorteio o nmero de pares de nmeros consecutivos; u u (b) Os 3 nmeros que ocorrem mais vezes; u (c) A maior sequncia de nmeros consecutivos. e u 5. Simulao do jogo do galo. O jogo do galo joga-se num tabuleiro de 3x3 e ca dois jogadores. Cada jogador coloca alternadamente um 1 ou um 2 numa das quadriculas e ganha o que colocar 3 peas em linha (horizontal, vertical ou c diagonal principal). O tabuleiro representado por uma varivel indexada e a a[2][2] que contm as jogadas feitas, supondo-se que se o jogador i jogou e numa certa posio ento o contedo dessa posio i, para i=1,2. Se uma ca a u ca e posio ainda no foi jogada o contedo de a nessa posio 0. Nenhum ca a u ca e jogador pode jogar numa posio j preenchida e o jogo termina empatado ca a se todas as posies esto ocupadas e nenhum jogador ganhou. Em cada co a jogada deve ser imprimido o tabuleiro, isto , a. No in o programa deve e cio pedir o nome de cada um dos jogadores e imprimir o nome do jogador que ganhar. 6. Simulao do jogo 5 em linha. ca Objectivo do Jogo Dois jogadores preenchem alternadamente as posies co dum tabuleiro N N , N > 4. Um joga com peas 0 e o outro joga com c peas 1. Ganha o jogo, o primeiro jogador que conseguir colocar 5 peas c c consecutivas na mesma direco: numa linha, coluna ou diagonal (faz 5 ca em linha). O jogo termina empatado se j no houverem posies a a co para preencher com peas. Supe-se que inicialmente todas as posies c o co do tabuleiro contm o s e mbolo X. Regras do Jogo A situao inicial do tabuleiro e a numerao das linhas e ca ca colunas : e 1 2 3 4 5 1 X X X X X 2 X X X X X 3 X X X X X 4 X X X X X 5 X X X X X
4.2
15
Os dois jogadores jogam alternadamente. Em cada jogada, um jogador selecciona uma posio da matriz indicando apenas a coluna c (de 1 ca a N ) em que pretende jogar. Se a coluna c estiver toda preenchida, e, ainda restarem posies livres noutra coluna, ter de escolher uma dessas co a colunas livres. A posio em que car a sua pea ser a corresponde ca a c a a ` linha de maior numerao ainda livre, nessa coluna. Isto , para ca e uma dada coluna c, a primeira posio a ser preenchida a (c, N ), a ca e segunda a (c, N 1), a terceira a (c, N 2), . . . No m de cada jogada, o computador ter de avaliar se o jogador ganhou o jogo. Para isso, basta a vericar se com a pea que jogou conseguiu fazer 5 em linha. Note que c no necessrio percorrer todas as posies do tabuleiro, mas apenas as a e a co posies que esto na mesma linha, coluna ou diagonais da ultima pea co a c jogada. O programa a desenvolver deve, em cada jogada: mostrar o tabuleiro indicar qual o jogador que deve jogar pedir ao jogador que seleccione uma coluna vericar se o jogador fez 5 em linha vericar se o jogo terminou e indicar o vencedor permitir a continuao do jogo ca
16
17
Se for selecionada a tarefa 5. o utilizador ainda dever escolher qual dos a relatrios e qual a informao a imprimir. Se for selecionada a tarefa 6., o ca dever ser chamada a funo que guarda a base de dados em cheiro. a ca 2. Modique o programa anterior, supondo que a base dados guardada numa e lista ligada. Sugesto: Use a seguinte estrutura para cada livro: a struct livros { char titulo[80]; char autor1[20]; char autor2[20]; unsigned int ano; char tema[40]; struct livros *prox; }; 3. Considerando uma fila escreva uma funo para determinar o seu nmero ca u de elementos. Suponha (a) a fila implementada usando memria sequncial, como uma lista ciro e cular; (b) a fila implementada usando memria dinmica o a 4. Dadas duas filas, implementadas com listas ligadas, escreva um programa que junte as duas las numa, alternando os elementos das duas primeiras. Se uma das las for maior, os seus elementos sero colodados no m. a 5. Uma matriz bi-dimensional de inteiros esparsa uma matriz de grandes die menses em que a maioria das suas entradas so nulas. Uma tal matriz pode o a ser representada convenientemente usando uma lista ligada onde cada elemento tem 5 campos: a linha; a coluna; o valor; a linha do proximo elemento no nulo; a coluna do prximo elemento no nulo. a o a (a) Escreva uma funo que dada uma matriz esparsa construa uma lista ca ligada equivalente; (b) Escreva uma funo que construa uma varivel unidimensional em que ca a cada elemento a soma de todos os elementos duma mesma linha da e matriz esparsa; (c) Escreva uma funo que adicione duas matrizes esparsas (das mesmas ca dimenses) usando listas ligadas; o
18
6. Crie, usando a funo rand(), uma rvore binria com 30 ns em que cada ca a a o n contm um inteiro entre 1 e 100. Para cada n, a sub-rvore esquerda o e o a contm ns cujos inteiros so menores que o desse n e a sub-rvore direita e o a o a contm ns cujos inteiros so maiores. e o a (a) escreva uma funo que determine o valor maior na rvore; ca a (b) escreva uma funo que determine o valor menor na rvore; ca a (c) escreva uma funo que dados dois inteiros, imprima todos os inteiros ca da rvore entre esses valores. a 7. Utilizando uma rvore binria (de pesquisa) determine a frequncia de cada a a e palavra de um texto. Cada n da rvore guarda para alm de uma palavra, o a e a frequncia de ocorrncia dessa palavra no texto. e e 8. Considere o problema da al nea anterior, para o caso de o texto ser um progrma escrito em linguagem C e considerando apenas como palavras as palavras chave da linguagem C, isto : e auto break case char const continue default do double else enum extern float for goto if int struct long switch register typedef return union short unsigned signed void sizeof volatile static while
Suponha que estas palavras se encontram guardadas, por ordem alfabtica, e numa varivel indexada externa char *chaves. a