Category: programação (C)
Aprender umas coisas de C (iniciantes e nivel médio)
Aulas em video sobre programação em C
Guião laboratorial n.º 1 – exercício 21
“Considere que pretende resolver um quebra-cabeças que surgiu no seu jornal. Existe um retângulo, com um determinado número de linhas e um determinado número de colunas, preenchido com caracteres alfabéticos em cada uma das suas posições. Na figura pode ver um exemplo para um quebra cabeças com 5 linhas e 6 colunas.
Desenvolva uma função que procure todas as ocorrências de uma determinada palavra no quebra cabeças. A palavra pode ocorrer numa linha ou numa coluna. De cada vez que a função encontrar uma ocorrência da palavra deve escrever no monitor o número da linha e da coluna em que a palavra tem início. Considerando o exemplo da figura, se a palavra a pesquisar for lua a função deveria escrever:
A palavra lua surge:
– Ao longo da coluna 0 com início na linha 1
– Ao longo da linha 3 com início na coluna 3
A função recebe como argumentos o endereço inicial da matriz de caracteres, as suas dimensões (n.º de linhas e de colunas) e um ponteiro para a palavra a pesquisar.”
Guião laboratorial n.º 1 – exercício 20
“Escreva um programa que para um dado mês à escolha do utilizador, indique o seu correspondente em Língua Inglesa.”
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 12 void indica_mes(int t, char *m) { int *p, mes=1, i=0; p=m; printf("Qual o mes que deseja ver traduzido (1-12)?\n"); scanf("%d", &mes); for(i=0; i<t+1; i++, p++){ if(mes==i){ puts(*(p-1)); } } } int main() { char *mesesP[]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; indica_mes(TAM, mesesP); return 0; }
ajuda: LINK
Guião laboratorial n.º 1 – exercício 19
“Pretende-se reduzir uma imagem a metade do seu tamanho original. A imagem inicial consiste num tabela bidimensional com M×M valores inteiros onde cada pixel (ponto na imagem) pode tomar um valor inteiro entre 0 e 9 (tonalidades de cinza). A imagem reduzida é armazenada num tabela bidimensional com M/2×M/2 valores reais onde cada elemento (pixel) corresponde á média dos 4 elementos que substitui. Para melhor compreensão do enunciado veja o exemplo apresentado de seguida (neste caso, para M=8):
Escreva uma função em C que efetue esta operação. A função recebe 3 argumentos: endereço inicial da matriz original, endereço inicial da matriz reduzida e o valor M.”
#include <stdio.h> #define TAM 8 void reduzir_i(float *o, float *r, int d) { int i,j, k,aux; float *p, *s, *q, soma=0, media=0; p=o; q=r; //imprimir a matriz original printf("matriz original: \n"); for(i=0; i<d; i++){ for(j=0; j<d; j++, p++){ printf("%.f ", *p); } printf("\n"); } p=o; s=o+d; printf("\n"); for(i=0; i<d; i=i+2, p=p+d, s=s+d){ for(j=0; j<d; j++, p++, s++){ for(k=0 ; k<j+1; k=k+d){ //printf("%.f-%.f ", *p,*s); soma=soma+*p+*s; } if(aux<1){ aux++; }else{ media=soma/4; *q=media; //printf("%2.f \n", *q); aux=0; soma=0; media=0; q++; } } } //imprimir a matriz reduzida printf("\n"); q=r; printf("matriz reduzida: \n"); for(i=0; i<d/2; i++){ for(j=0; j<d/2; j++, q++){ printf("%.1f ", *q); } printf("\n"); } } int main() { float matO[TAM][TAM]={{0,4,9,3,6,7,2,9}, {9,4,7,8,3,4,7,2}, {5,1,2,6,3,8,6,2}, {7,1,4,8,7,2,0,7}, {4,9,3,5,2,1,5,7}, {5,3,4,7,8,9,1,0}, {2,3,5,6,7,9,2,4}, {2,3,4,5,6,7,8,9}}; float matR[TAM/2][TAM/2]={{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}}; reduzir_i(matO, matR, TAM); return 0; }
Guião laboratorial n.º 1 – exercício 18
“Desenvolva uma função que calcule a média dos valores armazenados em cada uma das colunas de uma matriz de números reais (float). A função recebe como argumentos o endereço inicial da matriz e as suas dimensões. Os valores calculados devem ser escritos na consola.”
#include <stdio.h> #define L1 3 #define C1 3 void media_r(int l, int c, float *m1) { int i,j; float *p, valor=0, soma=0, media; p=m1; for(i=0; i<l; i++, p++){ for(j=0; j<c*l; j=j+c){ soma=soma+(*p+j); } media=soma/j; printf("coluna %d\tsoma: %.2f\tmedia %.2f", i, soma , media); printf("\n"); soma=0; } } int main() { float matA[L1][C1]={{1,2,3},{4,5,6},{7,8,9}}; printf("\nMedia das colunas:\n"); media_r(L1, C1, matA); return 0; }
Guião laboratorial n.º 1 – exercício 17
“Desenvolva uma função que efetue a transposição numa matriz N*N de inteiros. A transposição consiste em trocar as linhas pelas colunas. A função recebe como argumentos o endereço inicial da matriz e o valor N (pode assumir que a matriz é quadrada).”
#include <stdio.h> #define L1 3 #define C1 3 void transpor_q(int l, int c, int *m1) { int *p, *q, aux[l][c],aux2[l][c],i,j; p=m1; q=m1; for(i=0; i<l; i++){ for(j=0; j<c; j++, p++){ aux[j][i]=*p; printf("%d\t", aux[j][i]); q=p; } printf("\n"); } for(i=0; i<l; i++){ for(j=0; j<c; j++){ *p=aux[i][j]; printf("%d\t", *p); } printf("\n"); } } int main() { int matA[L1][C1]={{1,2,3},{4,5,6},{7,8,9}}; printf("\nMatriz da soma:\n"); transpor_q(L1, C1, matA); return 0; }
Guião laboratorial n.º 1 – exercício 16
“Desenvolva uma função que some duas matrizes de inteiros, A e B. A função deve receber a informação necessária para efetuar a soma. O resultado da soma deve ficar armazenado na matriz A.”
#include <stdio.h> #define L1 3 #define C1 2 void adicao(int l, int c, int *m1, int *m2) { int *p, *q, i=0, j=0, aux[l][c]; p=m1; q=m2; for(i=0; i<l; i++){ for(j=0; j<c; j++, p++, q++){ aux[i][j]=*p+*q; //printf("%d\t", aux[i][j]); *p=aux[i][j]; printf("%d\t", *p); } printf("\n"); } } int main() { int matA[L1][C1]={{1,3},{1,0},{1,2}}; int matB[L1][C1]={{0,0},{7,5},{2,1}}; printf("\nMatriz da soma:\n"); adicao(L1, C1, matA, matB); return 0; }
+ajudas: LINK
Guião laboratorial n.º 1 – exercício 15
“Complete o seguinte programa:
(…)
A função escreve() deve mostrar o conteúdo de uma matriz de inteiros na consola. A função recebe como argumentos o número de linhas, o número de colunas e o endereço inicial da matriz. Neste exemplo, o resultado será o seguinte:
”
#include <stdio.h> #define L1 3 #define C1 2 #define L2 4 #define C2 3 void escreve(int n_lin, int n_col, int *m) { int *p, i=0, j=0; p=m; for(i=0; i<n_lin; i++){ for(j=0; j<n_col; j++, p++){ printf("%d\t", *p); } printf("\n"); } } int main() { int mat1[L1][C1]={{1,2},{3,4},{5,6}}; int mat2[L2][C2]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; printf("\nMatriz mat1:\n"); escreve(L1, C1, mat1); printf("\nMatriz mat2:\n"); escreve(L2, C2, mat2); return 0; }
Guião laboratorial n.º 1 – exercício 14
“Desenvolva uma função que receba o endereço inicial e as dimensões (i.e., nº de linhas e nº de colunas) de uma matriz de números inteiros e a preencha com valores aleatórios entre 1 e 100.”
#include <stdio.h> #include <stdlib.h> #define linhas 10 #define colunas 10 void aleatorio(int l, int c,int *a){ int *p, i=0,j=0; p=a; //random time_t t; srand((unsigned) time(&t)); for(i=0; i<l ; i++){ for(j=0; j<c ; j++,p++){ *p=rand() % 100; } } p=a; for(i=0 ; i<l ; i++){ for(j=0; j<c ; j++, p++){ printf("%d\t", *p); } printf("\n"); } } int main() { int vector[linhas][colunas]={}; aleatorio(linhas, colunas, vector); return 0; }
ajuda(random): link
Guião laboratorial n.º 1 – exercício 13.1
“Escreva um programa para verificar se dois vetores, introduzidos pelo utilizador, são perpendiculares. Considere a dimensão máxima dos vetores igual a 25.
Nota: Dois vetores são perpendiculares se o seu produto escalar for zero.”
não me apeteceuuuu
Guião laboratorial n.º 1 – exercício 13
“Desenvolva uma função que calcule o produto escalar de dois vetores de números reais a, b, com dimensão n, sabendo que:
A declaração da função poderá ter o seguinte formato:
double produto_escalar (double *a, double *b, int n)
”
#include <stdio.h> #include <stdlib.h> #define tam1 10 #define tam2 10 // nao usei o double porque nao percebi o printf.. int produto_escalar(int *a, int *b, int n){ int *p,*q; int soma=0; for(p=a, q=b; p<a+n && q<b+n; p++, q++){ soma=soma+*p+*q; printf("\n%d\t%d\t%d", *p, *q, soma); } return soma; } int main() { int vector1[]={0,1,2,3,4,5,6,7,8,9}; int vector2[]={0,1,2,3,4,5,6,7,8,9}; int valor; valor=produto_escalar(vector1, vector2, tam1); printf("\nO produto escalar vem: %d", valor); return 0; }
Guião laboratorial n.º 1 – exercício 12
“Modifique a função do exercício anterior de modo a permitir comparar matrizes de inteiros (i.e., tabelas com duas dimensões).”
#include <stdio.h> #include <stdlib.h> #define linha1 2 #define linha2 2 #define coluna1 2 #define coluna2 2 int vector_igual(int l1, int c1, int v1[l1][c1], int l2, int c2, int v2[l2][c2]){ int *p, *q, verifica=0; p=v1[0]; q=v2[0]; if(l1==l2 && c1==c2){ for(p=v1[0], q=v2[0]; p<v1[0]+l1*c1, q<v2[0]+l2*c2; p++, q++){ if(*p!=*q){ verifica++; } printf("\n%d %d", *p, *q); } } if(verifica==0){ verifica=1; }else{ verifica=0; } return verifica; } int main() { int vector1[linha1][coluna1]={{0,1},{2,3}}; int vector2[linha2][coluna2]={{0,1},{2,4}}; int valor; valor=vector_igual(linha1, coluna1, vector1, linha2, coluna2, vector2); printf("\n1 se os vetores forem iguais, e 0 no caso contrario: %d", valor); return 0; }
Guião laboratorial n.º 1 – exercício 11
“Desenvolva uma função que receba, como argumentos, os nomes e as dimensões de dois vetores de inteiros e verifique se estes são iguais. Considere que dois vetores de inteiros são iguais se tiverem o mesmo número de elementos e se, em posições equivalentes, tiverem elementos com o mesmo valor. A função devolve 1 se os vetores forem iguais, e 0 no caso contrário. ”
#include <stdio.h> #include <stdlib.h> #define TAM1 10 #define TAM2 10 int vector_igual(int *v1, int t1, int *v2, int t2){ int *p, *q, verifica=0; p=v1; q=v2; if(t1==t2){ for(p=v1, q=v2; p<v1+t1, q<v2+t2; p++, q++){ if(*p!=*q){ verifica++; } printf("\n%d %d", *p, *q); } } if(verifica==0){ verifica=1; }else{ verifica=0; } return verifica; } int main() { int vector1[]={0,1,2,3,4,5,6,7,8,9}; int vector2[]={0,1,2,3,4,5,6,7,8,8}; int valor; valor=vector_igual(vector1, TAM1, vector2, TAM2); printf("\n1 se os vetores forem iguais, e 0 no caso contrario: %d", valor); return 0; }
Guião laboratorial n.º 1 – exercício 10
“Desenvolva uma função que receba, como argumentos, o nome e a dimensão de um vetor de números reais e devolva um ponteiro para o elemento que mais se aproxima da média de todos os elementos do vetor.”
#include <stdio.h> #include <stdlib.h> #define TAM 10 int mais_proximo(int *v, int t){ int *p, media=0, soma=0, posi=0, dif=0, guarda[t], i, dif2=0; p=v; for(p=v;p<v+t;p++){ soma=soma+*p; } media=soma/t; for(p=v, i=0; p<v+t ; p++, i++){ dif=media-*p; if(dif<0){ dif=-dif; } guarda[i]=dif; printf("\n%d\t %d\t %d", i, guarda[i], media); } for(i=0, dif2=guarda[i]; i<t ; i++){ if(dif2>guarda[i]){ posi=i; dif2=guarda[i]; } } return posi; } int main() { int vector[]={11,2,63,4,55,6,106,8,99,1000}; int valor=0; valor=mais_proximo(vector, TAM); printf("\nEsta na posicao: %d", valor); return 0; }
Guião laboratorial n.º 1 – exercício 9
Desenvolva uma função que verifique se existem 3 caracteres consecutivos iguais numa frase. A função recebe como argumento um ponteiro para o início da frase (deve assumir que no final existe um ‘\0’). Deve devolver 1 se existirem 3 caracteres consecutivos iguais, ou 0 no caso contrário. A sua declaração é a seguinte:
int tres_consecutivos(char *frase);
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 10 int tres_consecutivos(char *frase){ int totalc=0,valor=0; char *p, *q, *e; p=frase; q=frase+1; e=frase+2; totalc=strlen(frase); for( ; e<frase+totalc; p++, q++, e++){ if(*p==*q && *q==*e){ valor=1; } } return valor; } int main() { char frase_completa[]="Qualquer coisaaa assim assada!"; int valor=0; valor=tres_consecutivos(frase_completa); if(valor==1){ printf("\nExistem 3 caracteres consecutivos iguais na frase"); }else{ printf("\nNao existem 3 caracteres consecutivos iguais na frase"); } return 0; }
Guião laboratorial n.º 1 – exercício 8
Desenvolva um função que determine em que posição de uma tabela de inteiros se encontra o elemento que regista a maior subida em relação ao elemento anterior. Esta posição deve ser devolvida como resultado. A função recebe como argumentos um ponteiro para o início da tabela e o número de elementos que esta contém. A sua declaração é a seguinte:
int maior_subida(int *tab, int dim);
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 10 int maior_subida(int *tab, int dim){ int *p, *q; p=tab; q=tab+1; int dif=0, aux2=0, valor=0,i=0; for(p=tab; p<tab+dim && q <tab+dim; p++,q++){ aux2=*p-*q; if(aux2<0) { aux2=-aux2; } printf("\n%d\t%d\t%d\t%d", i, *p, *q, aux2); if(aux2>dif){ dif=aux2; valor=i; } i++; } return valor; } int main() { int tabela[]={1,3,7,42,22,10,9,7,7,33}; int posicao; posicao=maior_subida(tabela, TAM); printf("\nPosicao da maior subira: %d", posicao); return 0; }
Guião laboratorial n.º 1 – exercício 7
Desenvolva uma função,
void procura_dupla(int a[], int tam, int *prim, int *seg);
que encontre os dois maiores elementos de um vetor de inteiros. A função recebe, como argumentos, o nome e a dimensão do vetor, e os ponteiros para as variáveis onde os dois maiores elementos devem ser armazenados.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 10 void procura_dupla(int *a, int tam, int *prim, int *seg){ int *p; p=a; int aux1=0, aux2=0; for(p=a; p<a+tam; p++){ if(*p>aux1){ aux1=*p; } } for(p=a; p<a+tam; p++){ if(*p>aux2 && *p<aux1){ aux2=*p; } } *prim=aux1; *seg=aux2; } int main() { int tabela[]={1,3,7,5,22,10,9,7,7,33}; int primeiro, segundo; procura_dupla(tabela, TAM, &primeiro, &segundo); printf("\nPrimeiro maior: %d", primeiro); printf("\nSegundo maior: %d", segundo); return 0; }
Guião laboratorial n.º 1 – exercício 6
“Desenvolva uma função que receba um tabela de inteiros positivos e o seu tamanho e verifique quantos dos elementos da tabela são pares e quantos são ímpares. Deve ainda calcular qual o maior valor presente na tabela e a posição onde ele se encontra.
Por exemplo, se o conteúdo da tabela for:
1 3 7 5 2 10 9 7 7 1
Existem 2 números pares, 8 números ímpares. O maior número é o 10 e está na posição 5.
A função recebe como argumentos um ponteiro para o início da tabela, o número de elementos que esta contém, um ponteiro para o inteiro onde deve colocar o n.º de elementos ímpares, um ponteiro para o inteiro onde deve colocar o n.º de elementos pares, um ponteiro para o inteiro onde deve colocar o maior valor armazenado na tabela e um ponteiro para o inteiro onde deve colocar a posição onde o maior valor se encontra. A sua declaração é a seguinte:
void f(int *t, int tam, int *np, int *ni, int *maior, int *pos);
”
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 10 void f(int *t, int tam, int *np, int *ni, int *maior, int *pos){ int *p; p=t; int conta_par=0, conta_impar=0, m= p[0],posicao=0, aux=0; for(p=t; p<t+tam; p++){ if(*p%2==0){ conta_par++; }else{ conta_impar++; } if(*p>m){ m=*p; } } for(p=t; p<t+tam; p++){ aux++; if(*p==m){ printf("%d %d", aux, posicao); posicao=aux; } } *np=conta_par; *ni=conta_impar; *maior=m; *pos=posicao; } int main() { int tabela[]={1,3,7,5,22,10,9,7,7,11}; int n_pares=0, n_impares=0, maior=0, posicao=0; f(tabela, TAM, &n_pares, &n_impares, &maior, &posicao); printf("\nTotal de numeros pares: %d", n_pares); printf("\nTotal de numeros impares: %d", n_impares); printf("\nO maior numero: %d", maior); printf("\nPosicao do maior numero: %d", posicao); return 0; }
Guião laboratorial n.º 1 – exercício 5
“Desenvolva uma função que verifique se uma sequência de caracteres representa um número de telefone da rede fixa PT. A sequência deve obedecer à seguinte propriedade:
– É composta por 9 caracteres, em que o primeiro representa o dígito 2 e os restantes
qualquer um dos 10 dígitos existentes.
A declaração da função é a seguinte: void verifica(char *tel, char *c);
O argumento tel aponta para o primeiro elemento da sequência de caracteres que representa o número de telefone (existe um ‘\0’ no final) e o argumento c aponta para uma variável do tipo caracter onde deve ser colocado o resultado da avaliação. Se o número de telefone analisado for válido deve aí ser colocado o caracter ‘V’. Caso contrário, deve ser colocado o caracter ‘I’.
Nota: pode utilizar a função int isdigit(char c); da biblioteca
um valor diferente de 0 se o argumento c for um caracter que represente um dígito.
”
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 9 void verifica(char *tel, char *c){ int tamanho=0; tamanho=strlen(tel); if(tel[0]=='2' && tamanho==TAM){ *c='V'; }else{ *c='I'; } } int main() { char numero[]="223456789"; char avaliacao; verifica(&numero, &avaliacao); printf("\nVericado (V)valido (I)invalido: %c ", avaliacao); return 0; }
Guião laboratorial n.º 1 – exercício 4
“Desenvolva uma função que determine quantos elementos de uma tabela de inteiros são iguais à média dos seus dois vizinhos. A função recebe como argumentos um ponteiro para o início da tabela, o número de elementos que esta contém e um ponteiro para uma variável inteira onde deve ser colocado o resultado (i.e., quantos elementos são iguais à média dos seus vizinhos). A sua declaração é a seguinte:
void vizinhos(int *tab, int dim, int *igual);
”
#include <stdio.h> #include <stdlib.h> #define TAM 10 void vizinhos(int *tab, int dim, int *igual){ float media=0; int *p, conta=0, soma=0; for(p=tab+1; p<tab+dim; p++){ soma=soma+ *p; } media=soma/dim; for(p=tab+1; p<tab+dim; p++){ if(*p==media){ conta++; } } printf("\nMedia %f ", media); *igual=conta; } int main() { int vector[]={0,1,2,3,4,5,6,7,8,9}; int resultado=0; vizinhos(vector, TAM, &resultado); printf("\nTotal de elementos iguais a media dos visizinhos %d ", resultado); return 0; }
Guião laboratorial n.º 1 – exercício 3
“Desenvolva uma função de nome calculo que receba por parâmetro dois inteiros A e B e dois ponteiros para inteiro P e Q. A função deve calcular a subtração entre os dois inteiros e colocar a diferença no local referenciado por P. Deve igualmente calcular a adição dos dois inteiros e colocar a soma no local referenciado por Q.”
#include <stdio.h> #include <stdlib.h> void calculo(int a, int b, int *p, int *q){ *p=a+b; *q=a-b; } int main() { int aa=4,bb=2, soma=0, subtracao=0; calculo(aa,bb, &soma, &subtracao); printf("a soma vem: %d e a subtracao vem %d:", soma,subtracao); return 0; }
Guião laboratorial n.º 1 – exercício 2
“Desenvolva uma função que receba, como argumentos, o nome a dimensão de uma tabela unidimensional de números inteiros e que coloque a zero todos os elementos cujo valor seja inferior à média dos elementos dessa tabela. Pode assumir que quando a função for chamada a tabela já foi inicializada.”
#include <stdio.h> #include <stdlib.h> #define TAM 10 void recebe(int *d, int t){ int *e,soma=0; float media=0; for(e=d;e<d+t;e++){ soma=soma+ *e; } printf("\nsoma: %d", soma); media=(soma/t); printf("\nmedia: %f", media); for(e=d; e<d+t;e++){ if(*e<media){ *e=0; } } } int main() { int nome[TAM]={0,1,2,3,4,5,6,7,8,9}; int *q; printf("\nAntes "); for(q=nome+0;q<nome+TAM;q++){ printf("%d ", *q); } recebe(nome, TAM); printf("\nDepois "); for(q=nome+0;q<nome+TAM;q++){ printf("%d ", *q); } return 0; }
Guião laboratorial n.º 1 – exercício 1
”
Considere o seguinte esqueleto da função main():
#include
int main()
{
int a, b, total, *p = &a, *q = &b, *r = &total;
/* completar esta secção */
}
O objetivo do programa é pedir dois números inteiros ao utilizador e guardá-los nas variáveis a, b. A seguir deve somar esses valores e guardar o resultado na variável total. Finalmente deve apresentar ao utilizador o valor da adição. Termine a implementação da função main(), sem nunca se referir explicitamente (i.e., pelo seu nome) às variáveis a, b ou total.”
#include <stdio.h> #include <stdlib.h> int main() { int a, b, total, *p = &a, *q = &b, *r = &total; printf("\nQual o valor de a: "); scanf("%d",p); printf("\nQual o valor de b: "); scanf("%d",q); *r=*p+*q; printf("\nO valor da soma: %d", *r); return 0; }
Guião laboratorial n.º 1
Tópicos da matéria:
– Noções básicas sobre ponteiros e endereços.
– Aritmética de ponteiros
– Tabelas de ponteiros para caracter.
– Argumentos da linha de comando.
Bibliografia:
K. N. King, C Programming: A Modern Approach: Capítulos 11, 12 e 13.