Baixe o app para aproveitar ainda mais
Prévia do material em texto
PonteirosPonteirosPonteirosPonteiros • com vetores • com strings • com funções ExercExercíciosícios dada aula anterioraula anterior 1. Seja o seguinte trecho de programa: int i=3,j=5; int *p, *q; p = &i; q = &j; Qual é o valor das seguintes expressões ? a) p == &i; b) *p - *q c) **&p d) 3* - *p/(*q)+7 2. Qual será a saída deste programa supondo que i ocupa o endereço 4094 na memória? main() { int i=5, *p;, p; p = &i; printf(“%x %d %d %d %d \n”, p,*p+2,**&p,3**p,**&p+4); }} 3. Se i e j são variáveis inteiras e p e q ponteiros para int, quais das seguintes expressões de atribuição são ilegais?expressões de atribuição são ilegais? a) p = &i; b) *q = &j; c) p = &*&i; d) i = (*&)j; e) i = *&j; f) i = *&*&j; g) q = *p; h) i = (*p)++ + *q ExercíciosExercícios dada aula aula anterior anterior RR 1. Seja o seguinte trecho de programa: int i=3,j=5; int *p, *q; p = &i; q = &j; Qual é o valor das seguintes expressões ? a) p == &i; b) *p - *q c) **&p d) 3* - *p/(*q)+7 TRUE -2 3 6 2. Qual será a saída deste programa supondo que i ocupa o endereço 4094 na memória? main() { int i=5, *p;, p; p = &i; printf(“%x %d %d %d %d \n”, p,*p+2,**&p,3**p,**&p+4); }} 3. Se i e j são variáveis inteiras e p e q ponteiros para int, quais das seguintes expressões de atribuição são ilegais? 4094 7 5 15 9 expressões de atribuição são ilegais? a) p = &i; b) *q = &j; c) p = &*&i; d) i = (*&)j; e) i = *&j; f) i = *&*&j; g) q = *p; h) i = (*p)++ + *q Exercício 1Exercício 1Exercício 1Exercício 1 • Modifique o programa abaixo para imprimir o úd d d conteúdo do vetor usando ponteiros. #include <stdio.h> #include <stdlib.h> int main() { float v[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};float v[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; int i; for (i=0; i<9; i++)for (i=0; i<9; i++) printf("%.1f ", v[i]); t (" ")system("pause"); } SoluçãoSoluçãoSoluçãoSolução #include <stdio.h> #include <stdlib.h> int main() { float v[] = {1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0};float v[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; int i; f (i 0 i<9 i++)for (i=0; i<9; i++) printf("%.1f ", *(v+i)); system("pause"); } ExercícioExercício 22 • Modifique o programa de manipulação de • Modifique o programa de manipulação de matrizes para a notação de ponteiros. #define LINHAS 3#define LINHAS 3 #define COLUNAS 4 int main() {{ float v[LINHAS][COLUNAS] = {{1.0, 2.0, 3.0, 4.0} ,{4.0, 5.0, 6.0, 7.0}, {7.0, 8.0, 9.0, 10.0} }; int i, j; float val; ; printf("i="); scanf("%d", &i); // Le o indice da linha printf("\n"); printf("j="); scanf("%d" &j); // Le o indice da colunaprintf( j= ); scanf( %d , &j); // Le o indice da coluna printf("Valor ="); scanf("%f", &val); // Le o valor em float para inserir no arranjo v[i][j] = val; // IMPRIME O ARRANJO for (i=0; i<LINHAS; i++) for (j= 0 ; j< COLUNAS; j++) printf("% 1f " v[i][j]);printf( %.1f , v[i][j]); system("pause"); } SoluçãoSoluçãoSoluçãoSolução #define LINHAS 3 #define COLUNAS 4#define COLUNAS 4 int main() {{ float v[LINHAS][COLUNAS] = {{1.0, 2.0, 3.0, 4.0} ,{4.0, 5.0, 6.0, 7.0}, {7.0, 8.0, 9.0, 100.0} }; int i, j; float val; printf("i="); scanf("%d", &i); // Le o indice da linha printf("\n"); p ( ) printf("j="); scanf("%d", &j); // Le o indice da coluna printf("Valor ="); scanf("%f", &val); // Le o valor em float para inserir no arranjo *(v[0]+ i*COLUNAS +j) = val; // Insere no arranjo(v[0]+ i COLUNAS +j) = val; // Insere no arranjo for (i=0; i<(LINHAS*COLUNAS); i++) // Imprime arranjo printf("i= % 1f " *(v[0]+i));printf( i= %.1f , (v[0]+i)); } Exercício 3Exercício 3Exercício 3Exercício 3 F l i t i • Faça um programa que leia uma string e, utilizando ponteiros, conte quantos caracteres a string possui (sem utilizar caracteres a string possui (sem utilizar strlen). SoluçãoSoluçãoSoluçãoSolução int main() {{ char str[100], *p; int tam=0; O t i ã d d i ãputs("digite a string: "); gets(str); p = str; //p aponta para o primeiro caractere de str O ponteiro não muda de posição p = str; //p aponta para o primeiro caractere de str while (*p != '\0') { ou while (*(p+tam) != '\0')tam++; p++; } ou while ( (p+tam) != \0 ) tam++; } printf ("A string tem %d letras.\n\n", tam); system("pause"); }} ExercícioExercício 4 : 4 : funçãofunção void, void, parapara leituraleitura de de qualquerqualquer stringstring Faça uma função le_string que receba como parâmetro a variável string a ser preenchida e o número máximo de caracteres a serem lidos e armazenados na variável: // função que lê e consiste uma string texto (por referência implícita) de num_char // // (por valor): caracteres a serem lidos e armazenados na variável: void le_string(char texto[ ], int num_char) { char dummy[num_char + 2]; // caracteres + \n + \0 do { printf(“Digite a informacao (ate %d caracteres):\n“, num_char); fflush(stdin); fgets(dummy, sizeof(dummy), stdin); if (dummy[strlen(dummy) - 1] != '\n') printf("\n * Digitar no maximo %d caracteres!\n", num_char); } while (dummy[strlen(dummy) - 1] != '\n'); ( ) \ // \dummy[strlen (dummy) - 1] = '\0'; // substitui \n pelo terminador strcpy(texto,dummy); } ExercícioExercício 5 : 5 : funçãofunção void, com void, com parâmetro inverteparâmetro inverte textotextoparâmetro,inverteparâmetro,inverte textotexto f l // le texto e inverte os caracteres lidos: • Faça uma função le_inverte_texto que receba como parâmetro uma string e ... #include <string.h> #define SIZE_TEXTO 20 void le string(char texto[ ], int num char); //leitura de texto, anteriorq p g o número máximo de caracteres a serem lidos e baseado neste e utilizando a void le_string(char texto[ ], int num_char); //leitura de texto, anterior void le_inverte_texto(char [ ],int); // protótipo: só tipo dos parâmetros int main( ) { lidos e, baseado neste e utilizando a função anterior le_string, leia um texto de no máximo N caracteres e devolva { char texto[SIZE_TEXTO + 1]; le_inverte_texto( texto, SIZE_TEXTO); printf("\nTexto invertido:\n*%s*\n ", texto); system("pause >> null");de no máximo N caracteres e devolva este texto invertido: system( pause >> null ); return 0; } void le inverte texto (char linha inv[ ], int max char) // declaraçãovoid le_inverte_texto (char linha_inv[ ], int max_char) // declaração da função void { …… }} ExercícioExercício 5: 5: funçãofunção void, com void, com parâmetro,inverteparâmetro,inverte textotexto // declaração da função void void le_inverte_texto (char linha_inv[ ], int max_char) { char linha[max char + 1];{ char linha[max_char + 1]; int i; le_string(linha, max_char); // lê, consistindo e protegendo memória for (i=0; i < strlen(linha); i++)for (i=0; i < strlen(linha); i++) linha_inv[i] = linha[strlen(linha) – i - 1]; linha_inv[strlen(linha)]= '\0'; // insere teminador }} void le_string(char texto[ ], int num_char) //leitura de texto, com consistência { char dummy[num_char + 2]; dodo { printf(“Digite a informação (ate %d caracteres):\n“, num_char); fflush(stdin); fgets(dummy, sizeof(dummy), stdin); if (dummy[strlen(dummy) - 1] != '\n')if (dummy[strlen(dummy) 1] ! \n ) printf("\n * Digitar no maximo %d caracteres!\n", num_char); } while (dummy[strlen(dummy) - 1] != '\n'); dummy[strlen (dummy) - 1] = '\0';y[ ( y) ] strcpy(texto,dummy); } ExercíciosExercíciosExercíciosExercícios 1. função que devolve o maior elemento de um vetor de ç q inteiros, e sua posição (nome do vetor passado como parâmetro, respostas devolvidas através de â t )parâmetros); 2. função que multiplica um vetor por um valorinteiro (nome do vetor e o valor passados como parâmetros);(nome do vetor e o valor passados como parâmetros); 3. função que recebe um vetor de 15 elementos e retorna o vetor invertido, isto é, do fim para o início;retorna o vetor invertido, isto é, do fim para o início; 4. função que recebe dois vetores de 20 inteiros e armazene no segundo vetor todos os elementos do primeiro, exceto os negativos e 0. As posições vazias no final do vetor deverão ser preenchidas com 0.
Compartilhar