Material de referência: capítulos 20 e 21 da "Introdução a Ciência da Computação em C":
A biblioteca string.h
contém funções de manipulação de strings em C. Para conhecer algumas das funções da string.h
, dê uma olhada na página criada pelo professor Paulo Feofiloff:
Na Wikipédia é possível ver mais detalhes sobre a string.h
:
Dada uma frase terminada por '.'
, determinar quantas letras e quantas palavras aparecem no texto. Por exemplo, no texto "O voo GOL547 saiu com 10 passageiros."
há 25 letras e 7 palavras.
#include <stdio.h>
int main(){
char c;
int cont_letras = 0, cont_palavras = 0;
printf("Digite uma frase terminada por ponto final (.): \n");
scanf("%c", &c); /* Le um caracter */
while(c != '.') {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) /* verifica se eh letra */
cont_letras++;
else
if (c == ' ') /* o espaco sempre separa palavras*/
cont_palavras++;
scanf("%c", &c);
}
cont_palavras++;
printf("A frase contem %d letras e %d palavras.", cont_letras, cont_palavras);
return 0;
}
Escreva um programa que leia um inteiro k (k > 0)
; k
pares de números inteiros que indicam as posicões (ou seja, a linha e a coluna) de k
rainhas em um tabuleiro de xadrez; um inteiro n (n > 0)
; e n
pares de números inteiros indicando posicões no tabuleiro; e para cada uma das n
posições determina se ela está ou não sob ataque de alguma rainha. Suponha que as posiçoes lidas sao sempre posições válidas do tabuleiro.
No jogo de xadrez, uma rainha pode se deslocar no tabuleiro na horizontal, na vertical ou na diagonal, quantas casas quiser. Sendo assim, consideraremos que qualquer posição “alcançável” por uma rainha está sob ataque. A figura a seguir exemplifica as posições alcançáveis por uma dada rainha.
Para resolver este problema:
void inicializa_tabuleiro(char tab[MAX][MAX]);
que inicializa a matriz tab com todas as posições vazias.
void imprima_tabuleiro(char tab[MAX][MAX]);
que imprime o tabuleiro.
int atacada(char tab[MAX][MAX], int linha, int coluna, int *linha_r, int *coluna_r);
que devolve 1 se a posição (linha,coluna)
está sendo atacada por alguma rainha representada pela letra R
no tabuleiro tab
e devolve 0 em caso contrário. Se a posição estiver sendo atacada, então (*linha_r,*coluna_r)
devolve a posição de uma rainha que a ataca.
#include <stdio.h>
#define MAX 8 /* Um tabuleiro de xadrez possui 8x8 posicoes */
void inicializa_tabuleiro(char tab[MAX][MAX]);
void imprima_tabuleiro(char tab[MAX][MAX]);
int atacada(char tab[MAX][MAX], int linha, int coluna, int *linha_r, int *coluna_r);
int main(){
char tab[MAX][MAX];
int k, n, x, y, i, x_r, y_r;
inicializa_tabuleiro(tab);
printf("Digite a quantidade k de rainhas e quantidade n de posicoes a serem verificadas: ");
scanf("%d %d", &k, &n);
i = 1;
while (i <= k) {
printf("Digite a posicao (x, y) da rainha %d: ", i++);
scanf("%d %d", &x, &y);
tab[x][y] = 'R';
}
printf("O tabuleiro esta: \n");
imprima_tabuleiro(tab);
i = 1;
while (i <= n) {
printf("Digite a %d-esima posicao (x, y) a ser verificada: ", i++);
scanf("%d %d", &x, &y);
if (atacada(tab, x, y, &x_r, &y_r))
printf(" - A posicao (%d,%d) esta' ameacada pela rainha em (%d,%d)\n", x, y, x_r, y_r);
else
printf(" - A posicao (%d,%d) nao esta' ameacada.\n", x, y);
}
return 0;
}
void inicializa_tabuleiro(char tab[MAX][MAX]){
int i, j;
for (i = 0; i < MAX; i++){
for (j = 0; j < MAX; j++)
tab[i][j] = ' ';
}
}
void imprima_tabuleiro(char tab[MAX][MAX]){
int i, j;
printf(" 0 1 2 3 4 5 6 7 \n");
for (i = 0; i < MAX; i++){
printf("%d ", i);
for (j = 0; j < MAX; j++)
printf("%c ", tab[i][j]);
printf("\n");
}
}
int atacada(char tab[MAX][MAX], int linha, int coluna, int *linha_r, int *coluna_r){
int i,j;
/* procura uma rainha na mesma linha ou na mesma coluna da posicao indicada */
for (i = 0; i < MAX; i++)
if (tab[linha][i] == 'R') { /* achou na linha */
*linha_r = linha;
*coluna_r = i;
return 1;
}
else
if (tab[i][coluna] == 'R') { /* achou na coluna */
*linha_r = i;
*coluna_r = coluna;
return 1;
}
/* procura uma rainha na diagonal esquerda superior */
i = linha-1;
j = coluna-1;
while (i >= 0 && j >= 0)
if (tab[i][j] == 'R') {
*linha_r = i;
*coluna_r = j;
return 1;
}
else{
i--;
j--;
}
/* procura uma rainha na diagonal direita superior */
i = linha-1;
j = coluna+1;
while (i >= 0 && j < MAX)
if (tab[i][j] == 'R') {
*linha_r = i;
*coluna_r = j;
return 1;
}
else{
i--;
j++;
}
/* procura uma rainha na diagonal esquerda inferior */
i = linha+1;
j = coluna-1;
while (i < MAX && j >= 0)
if (tab[i][j] == 'R') {
*linha_r = i;
*coluna_r = j;
return 1;
}
else{
i++;
j--;
}
/* procura uma rainha na diagonal direita inferior */
i = linha+1;
j = coluna+1;
while (i < MAX && j < MAX)
if (tab[i][j] == 'R') {
*linha_r = i;
*coluna_r = j;
return 1;
}
else{
i++;
j++;
}
return 0;
}
Escreva uma função que, dadas como parêmetro de entrada duas strings -- uma contendo uma frase e outra contendo uma palavra --, devolva o número de vezes que a palavra ocorre na frase.
Exemplo: Para a palavra ANA
e a frase
ANA E MARIANA GOSTAM DE BANANA
a função deve devolver 4 (já que a palavra ocorre 4 vezes na frase).
Escreva um programa para testar a sua função.
Obs.: Esse problema é o exercício 6 da lista sobre vetores.
#include <stdio.h>
#define MAX_STRING 100
int conta_ocorrencias(char str1[MAX_STRING], char str2[MAX_STRING]);
int main(){
char texto[MAX_STRING], palavra[MAX_STRING];
printf("Digite um texto: \n");
scanf(" %[^\n]", texto); /* Le uma string terminada por enter */
printf("Digite uma palavra: \n");
scanf(" %[^\n]", palavra);
printf("O texto contem %d ocorrências da palavra \"%s\".", conta_ocorrencias(texto, palavra), palavra);
return 0;
}
int conta_ocorrencias(char str1[MAX_STRING], char str2[MAX_STRING]){
int cont = 0, i = 0, j = 0;
while (str1[i] != '\0') {
while (str1[i+j] != '\0' && str2[j] != '\0' && str1[i+j] == str2[j])
j++;
if (str2[j] == '\0')
cont++;
j = 0;
i++;
}
return cont;
}
char
'\0'
scanf
e printf