Implemente em C as seguintes funções:

2.1int strcounta(char*s)

Devolve o nº de caracteres alfabéticos em s.

strcounta(“15 abacates”)→ 8

strcounta(“quinze (15) abacates”)→ 14

2.2char *init_str(char *s)

Torna a string s vazia.

2.3int ult_ind_chr(char *s, char c)

Devolve o último índice em que encontrou o caractere c em s. Caso não exista, devolve -1.

ult_ind_chr(“alface”, ‘a’)→ 3

ult_ind_chr(“alface”, ‘g’)→ -1

2.4char * strlwr(char * str)

Coloca todos os caracteres de str em minúsculas.

2.5char *strnset(char *s, char ch, int n)

Coloca o caractere ch apenas nas n posições da string s.

Se n > strlen(s) então n toma o valor de strlen(s).

strcpy(s, “alfabeto”);

strnset(s, ‘y’, 3)→ “yyyabeto

strcpy(s, “alfabeto”);

strnset(s, ‘y’, 23)→ “yyyyyyyy

2.6int stricmp(char *s1, char *s2)

Faz o mesmo que a função strcmp, mas realiza a comparação ignorando se os caracteres estão em maiúsculas ou minúsculas (ignore case).

Passo 1

Fala aí! Essa aqui vai dar certo trabalhinho, mas não se preocupa que as funções são bem básicas. Dá só uma olhada em como vai ficar a primeira:

Nós começamos declarando nossas variáveis, i será utilizado como índice da string s e cont vai funcionar como um contador, para contarmos os caracteres alfabéticos. Em seguida, abrimos um laço for para percorrer pela string e, dentro dele, iniciamos uma condição if que vai dizer o seguinte:

Se o caractere s[i] estiver entre ‘A’ e ‘Z’ OU entre ‘a’ e ‘z’

Adicione 1 a cont.

Assim, atualizamos a variável cont a cada vez que encontramos um caractere alfabético. Para finalizar, retornamos essa variável para obter seu valor quando chamarmos a função strcounta lá no main.

Passo 2

A próxima é bem tranquila. Olha só, tá lembrado que uma string acaba quando o caractere delimitador \0 é encontrado? Então, para tornarmos uma string vazia, basta definirmos este caractere como o inicial.

Passo 3

Agora, para encontrarmos o último índice em que um caractere aparece, vamos pensar uma coisa: se começarmos pelo primeiro caractere, vamos ter que criar uma variável que salva o índice em que se encontra o caractere e dar um jeito de atualizar este índice sempre que o caractere aparece novamente, concorda? Então, um jeito mais simples e intuitivo é começarmos pelo último caractere! Dessa forma, assim que o caractere desejado aparecer já sabemos que aquela é a última posição.

Ficamos assim, então:

Utilizamos nosso for para percorrer a string, mas dessa vez ele fica um pouquinho diferente. A primeira instrução, a de inicialização do for, diz pra começar pelo último caractere da string, e fazemos isso por meio da função strlen, que retorna o comprimento da string s. A segunda instrução, a de parada, simplesmente manda sair do for quando o índice ficar menor que zero. Por último, o incremento se torna um decremento, de modo que se possa analisar os caracteres um a um de trás para a frente.

Depois disso, iniciamos uma condição if dentro do for, para comparar os caracteres s[i] e c. Caso a comparação seja verdadeira, retornamos o índice em questão, caso contrário, retornamos -1, como o enunciado nos pediu.

Passo 4

Para essa aqui, vamos utilizar um macete: a função tolower. Esse cara faz justamente o que queremos, que é passar um caractere para minúsculo. A sintaxe fica mais ou menos assim:

Uma alternativa a usar essa função seria usarmos a tabela ASCII. Assim, bastaria adicionar 32 a cada caractere, pois essa é a diferença entre um caractere maiúsculo e o seu minúsculo. No entanto, teríamos que usar outros artifícios, como uma condição if, para identificar se os caracteres são letras ou qualquer outro símbolo ou número, beleza?

Passo 5

Estamos quase acabando, aguenta firme aí! Essa aqui segue o mesmo padrão das anteriores, se liga:

Novamente utilizamos o for para percorrer pela string. Dessa vez, usaremos duas instruções lá no meio: i , para substituirmos o caractere ch somente até o n-ésimo caractere da string, e s[i] != ‘\0’, que é o que já estamos acostumados, para substituirmos somente até o último caractere.

Passo 6

Enfim, chegamos na última! Essa aqui vai ser um pouquinho diferente, olha só:

Aqui, em vez de usarmos um for vamos usar um while. Na verdade, daria pra fazer com qualquer um, mas com o while fica um pouco mais intuitivo. Basicamente, precisamos dizer para que, enquanto os caracteres das duas strings forem iguais e enquanto elas não chegarem no caractere delimitador, continue passando pelos caracteres. Ao compararmos os caracteres com a função toupper, passamos todos para maiúsculo, assim não interessa se são maiúsculos ou minúsculos pra começar, pois antes da comparação tudo vai estar do mesmo jeito.

Para finalizar, vamos entender aquele valor que queremos retornar no final. O que acontece é que, normalmente, essa função stricmp retorna os seguintes valores:

Menor que zero, se s1 for menor que s2

Zero, se s1 for igual a s2

Maior que zero, se s1 for maior que s2

Pra não precisarmos escrever 3 ifs diferentes pra cada situação, resumimos tudo em uma expressão só 😊

Resposta

2.1

2.2

2.3

2.4

2.5

2.6