Ótima aula professor... assisto sempre direto no seu site, venho de lá só pra poder deixar o meu like e comentário, pois sei que isso o ajuda bastante... Além disso sempre deixo rodar todas as propragandas até o fim, e também visito-as, pois sei também que fazendo além lhe ajudo mais ainda... Já que estás me ajudando muitoooo... Obrigado...
Professor preciso criar um programa para a VA da minha faculdade sobre programação e o não estou entendendo mt bem funções e nem como vou processeguir,acredito que meu programa vá ocupar no mínimo umas 400 linhas. 1. Você deverá codificar, usando a Linguagem C, um simulador assembly; 2. O seu programa deverá, ao final de cada instrução digitada, imprimir o conteúdo dos registradores de propósito geral e da memória de dados; 3. Seu programa deverá simular as seguintes instruções: a. MOV registrador, constante b. MOV endereço de memória, constante c. MOV registrador, registrador d. MOV registrador, endereço de memória e. ADD registrador, registrador f. ADD registrador, constante g. HLT fim da simulação 4. Você deve implementar a mesma sintaxe (e arquitetura) do simulador visto em sala de aula, isso quer dizer que: a. a sintaxe [45] refere-se ao conteúdo armazenado no endereço de memória 45; b. o primeiro parâmetro da instrução MOV é o destino e o segundo a fonte do dado; c. Os registradores de propósito geral são nomeados como A, B, C e D; Se o senhor puder me ajudar me indicando video aulas ou me guiando eu ficaria muito agradecido pois não tenho uma base boa de programação e eu nunca programei antes,o professor da minha turma está ''passando por cima'' do assunto e eu não estou absorvendo muito bem. Abraços.
Olá BrutalHero. O conteúdo de funções e procedimentos é bem extenso e é difícil indicar uma aula específica que resolva o que você precisa. Nesse ponto é necessário que você tenha entendido bem as etapas anteriores, principalmente as estruturas de repetição e, no seu caso, como trabalhar com strings em C. Outro ponto, que antecede a escrita de código é, o problema que você precisa resolver está bem claro em sua cabeça? Dizendo em outras palavras, você consegue resolver o problema com papel e lápis? Analisando de forma bem superficial o que você me disse, os registradores seriam variáveis com os nomes A, B, C e D. Você precisa ler uma instrução digitada pelo usuário, aqui entra o texto. Imagine que o usuário digitou: ADD B, 10 Significa que o usuário deseja adicionar 10 ao registrador B. Perceba que você precisa dividir o texto em partes (ou ler cada parte individualmente se as regras do trabalho permitir) para descobrir qual a instrução, neste caso é ADD, qual o registrador, neste caso B, e qual o valor, neste caso 10 (poderia ser outro registrador). Tem diversas formas de fazer isso. Não pense no problema como um todo, senão você não vai sair do lugar. Divida o problema em partes, por exemplo, tente resolver para um única instrução. Depois que estiver funcionando para 1 instrução, você começa fazer uma segunda instrução.
Olá Thiago. Fiquei meio confuso com sua pergunta. Ao criar um vetor de inteiros você já precisa saber o tamanho dele, então não é necessário calcular ou descobrir. Uma string é diferente, uma vez que pode ser um vetor de caracteres de tamanho 500, por exemplo, mas apenas com uma palavra, então o tamanho da string é diferente do tamanho do vetor.
Professor, eu estou com uma dúvida. No português temos muitas palavras com acentos, e a função strlen identifica o acento como um caracter. Eu tentei fazer uma função para ignorar os caracter de acento agudo utilizando uma condição, mas a linguagem aponta um erro warning: multi-character character constant [-Wmultichar] Pelo que eu entendi o erro é como se estivesse usando o apóstrofo que é para caracter em uma string e por isso causa o erro, é isso mesmo? Tem alguma forma de criarmos uma função para retornar o tamanho da string ignorando os acentos? A função criada como teste: 5 int minhaStrLen(char str[]) { 6 int i = 0; 7 8 while(str[i] != '\0') { 9 if(str[i] == '´') { 10 i--; 11 } else { 12 i++; 13 } 14 } 15 return i; 16 }
Olá Jefferson. Na verdade não é que a função strlen identifique acentos como um caracter. Se você pesquisar pela tabela ASCII você vai perceber que existem algumas versões diferentes. A tabela ASCII simplificada vai de 0 até 127 e possui os caracteres mais utilizados, incluindo o alfabeto maiúsculo e minusculo sem qualquer acento. Agora, por que de 0 até 127? Porque este é o maior valor que pode ser armazenado em um byte (8 bits) e um caracter possui um byte (8 bits). E os caracteres acentuados? Bem, estes caracteres estão em uma versão estendida da tabela que vai até 255. Contudo, a partir de 128 precisamos de dois bytes de memória ou um unsigned char, que é um byte sem sinal ( de 0 a 255). É por isso que a função strlen apresenta um valor diferente em palavras acentuadas, ela conta a quantidade de bytes ( 1 byte = 1 caracter) mas caracteres acentuados ocupam dois bytes. Essa mensagem que você recebeu não é de erro, é apenas um "aviso" (warning) para lembrar que o caracter usado sempre ocorre junto com outros. Se fosse um erro o compilador abortaria e não compilaria seu código. Quanto a lógica que você pensou acho que não vai funcionar. Imagine a palavra "olá", não tem como pegar apenas o acento da letra a. O tamanho é 4 justamente porque o a acentuado ocupa dois bytes. Mas isso pode ser facilmente resolvido se você trabalhar com os códigos numéricos no lugar do caracter. Todo letra não acentuada terá seu código entre 0 e 127 (intervalo de 1 byte) enquanto que as letras acentuadas terão códigos negativos, pois ocupam dois bytes (ou entre 128 e 255 se forem unsigned). Assim, basta contar a quantidade acentuada e não acentuada. Ao final, o tamanho correto da string é a quantidade de letras não acentuadas mais a quantidade acentuada dividido por dois. int minhaStrLen(char str[]) { int i = 0, acentuadas = 0, naoAcentuadas = 0; while(str[i] != '\0') { if(str[i] >= 0 && str[i]
Bom dia, professor! Muito obrigado pelos esclarecimentos, não tinha pensado que poderia ser por conta do tamanho de cada caractere. Eu fiz alguns teste com a função que o senhor descreveu e fiquei com algumas dúvidas ainda no funcionamento dela: Pegando como exemplo "olá", as letras 'o' e 'l' vão entrar na contagem das naoAcentuadas totalizando 2 na variável, e o caractere 'á' deveria entrar apenas uma vez na variável acentuada, mas ele está ficando com um total de 2 assim como as não acentuadas. Eu coloquei para imprimir os códigos e ele realmente me retorna 2 números negativos, mas eu não entendi esse retorno, achei que iria retornar apenas um único número negativo referente ao caractere que não está entre 0 - 127, ou esses dois números são os dois bytes referentes ao caractere 'á'? E no return naoAcentuadas + acentuadas / 2, pela regra está sendo feito primeiro: acentuadas/2 e depois o resultado + naoAcentuadas, está funcionando perfeitamente, so gostaria de saber se a expressão é essa mesmo, pois o senhor descreveu como a soma das duas variáveis divididas por 2.
Isso realmente confunde a cabeça do ser humano Jefferson rsrsrs. Vamos lá: "... e o caractere 'á' deveria entrar apenas uma vez na variável acentuada, mas ele está ficando com um total de 2 assim como as não acentuadas." A variável acentuadas fica com o valor 2 porque, como disse, um caracter acentuado ocupa 2 bytes e como é uma string, a iteração ocorre de byte em byte. Se você printar na tela o valor da variável i na repetição da função que postei no comentário anterior você verá que serão printados valores de 0 a 3. O caracter a acentuado corresponde aos índices 2 e 3 enquanto o fim da string ( \0 ) está no índice 4. "Eu coloquei para imprimir os códigos e ele realmente me retorna 2 números negativos, mas eu não entendi esse retorno, achei que iria retornar apenas um único número negativo referente ao caractere que não está entre 0 - 127, ou esses dois números são os dois bytes referentes ao caractere 'á'?" Sim, esses dois números negativos são referentes ao caracter a acentuado. Esse retorno negativo ocorre devido a forma como os números são armazenados pelo computador. O maior número possível em um byte (8 bits) é o 127 representado assim: 01111111. Observe que o bit mais a esquerda é um zero. Esse bit, chamado de bit mais significativo é o bit de sinal dizendo se o número é positivo (bit 0) ou negativo (bit 1). Contudo, como o código dos caracteres acentuados são maiores que 127, nós temos aí um número inteiro representado com dois bytes (16 bits). Isso faz com que o bit zero mude para 1 produzindo um valor negativo ao tentar imprimi-lo. Sim, a expressão é essa mesma. Primeiro divide as acentuadas para depois somar. No comentário anterior eu disse: "o tamanho correto da string é a quantidade de letras não acentuadas mais a quantidade acentuada dividido por dois". Não há nenhuma preposição ou pontuação no trecho "quantidade acentuada dividido por dois" então eu achei que estaria claro que a soma será feita depois da divisão. Mas, é a nossa língua portuguesa né! rsrsrs
Talvez esse link ( wagnergaspar.com/somei-dois-numeros-inteiros-positivos-e-o-resultado-ficou-negativo-por-que/ ) ajude a esclarecer a parte do negativo.
@@programeseufuturo Mais uma vez, muito obrigado professor! Agora eu entedi plenamente haha Suas aulas , paciência e atenção em responder todos os comentários estão me ajudando demais! Espero que possa continuar com os vídeos e que tenha o reconhecimento merecido na plataforma.
Ótima aula professor... assisto sempre direto no seu site, venho de lá só pra poder deixar o meu like e comentário, pois sei que isso o ajuda bastante... Além disso sempre deixo rodar todas as propragandas até o fim, e também visito-as, pois sei também que fazendo além lhe ajudo mais ainda...
Já que estás me ajudando muitoooo...
Obrigado...
Obrigado.
Aula boa dms, to começando a entender função e a notar os meus erros passados quando tentei.
rsrsrs faz parte Mario.
Que bom que as aulas estão ajudando.
Parabéns!! Excelente aula.
Grande aula.
Valeu Rodrigo 😃
Professor preciso criar um programa para a VA da minha faculdade sobre programação e o não estou entendendo mt bem funções e nem como vou processeguir,acredito que meu programa vá ocupar no mínimo umas 400 linhas.
1. Você deverá codificar, usando a Linguagem C, um simulador assembly;
2. O seu programa deverá, ao final de cada instrução digitada, imprimir o conteúdo dos
registradores de propósito geral e da memória de dados;
3. Seu programa deverá simular as seguintes instruções:
a. MOV registrador, constante
b. MOV endereço de memória, constante
c. MOV registrador, registrador
d. MOV registrador, endereço de memória
e. ADD registrador, registrador
f. ADD registrador, constante
g. HLT fim da simulação
4. Você deve implementar a mesma sintaxe (e arquitetura) do simulador visto em sala
de aula, isso quer dizer que:
a. a sintaxe [45] refere-se ao conteúdo armazenado no endereço de memória
45;
b. o primeiro parâmetro da instrução MOV é o destino e o segundo a fonte do
dado;
c. Os registradores de propósito geral são nomeados como A, B, C e D;
Se o senhor puder me ajudar me indicando video aulas ou me guiando eu ficaria muito agradecido pois não tenho uma base boa de programação e eu nunca programei antes,o professor da minha turma está ''passando por cima'' do assunto e eu não estou absorvendo muito bem.
Abraços.
Olá BrutalHero.
O conteúdo de funções e procedimentos é bem extenso e é difícil indicar uma aula específica que resolva o que você precisa. Nesse ponto é necessário que você tenha entendido bem as etapas anteriores, principalmente as estruturas de repetição e, no seu caso, como trabalhar com strings em C.
Outro ponto, que antecede a escrita de código é, o problema que você precisa resolver está bem claro em sua cabeça? Dizendo em outras palavras, você consegue resolver o problema com papel e lápis?
Analisando de forma bem superficial o que você me disse, os registradores seriam variáveis com os nomes A, B, C e D. Você precisa ler uma instrução digitada pelo usuário, aqui entra o texto. Imagine que o usuário digitou:
ADD B, 10
Significa que o usuário deseja adicionar 10 ao registrador B. Perceba que você precisa dividir o texto em partes (ou ler cada parte individualmente se as regras do trabalho permitir) para descobrir qual a instrução, neste caso é ADD, qual o registrador, neste caso B, e qual o valor, neste caso 10 (poderia ser outro registrador). Tem diversas formas de fazer isso.
Não pense no problema como um todo, senão você não vai sair do lugar. Divida o problema em partes, por exemplo, tente resolver para um única instrução. Depois que estiver funcionando para 1 instrução, você começa fazer uma segunda instrução.
Pra q serve o " return tam;" da função??
A resposta está no título da aula rsrsrs
Retorna o tamanho da string salva na variável tam.
E se fosse um vetor de inteiros?
Olá Thiago.
Fiquei meio confuso com sua pergunta.
Ao criar um vetor de inteiros você já precisa saber o tamanho dele, então não é necessário calcular ou descobrir. Uma string é diferente, uma vez que pode ser um vetor de caracteres de tamanho 500, por exemplo, mas apenas com uma palavra, então o tamanho da string é diferente do tamanho do vetor.
Professor, eu estou com uma dúvida.
No português temos muitas palavras com acentos, e a função strlen identifica o acento como um caracter. Eu tentei fazer uma função para ignorar os caracter de acento agudo utilizando uma condição, mas a linguagem aponta um erro warning: multi-character character constant [-Wmultichar]
Pelo que eu entendi o erro é como se estivesse usando o apóstrofo que é para caracter em uma string e por isso causa o erro, é isso mesmo?
Tem alguma forma de criarmos uma função para retornar o tamanho da string ignorando os acentos?
A função criada como teste:
5 int minhaStrLen(char str[]) {
6 int i = 0;
7
8 while(str[i] != '\0') {
9 if(str[i] == '´') {
10 i--;
11 } else {
12 i++;
13 }
14 }
15 return i;
16 }
Olá Jefferson.
Na verdade não é que a função strlen identifique acentos como um caracter. Se você pesquisar pela tabela ASCII você vai perceber que existem algumas versões diferentes. A tabela ASCII simplificada vai de 0 até 127 e possui os caracteres mais utilizados, incluindo o alfabeto maiúsculo e minusculo sem qualquer acento. Agora, por que de 0 até 127? Porque este é o maior valor que pode ser armazenado em um byte (8 bits) e um caracter possui um byte (8 bits).
E os caracteres acentuados? Bem, estes caracteres estão em uma versão estendida da tabela que vai até 255. Contudo, a partir de 128 precisamos de dois bytes de memória ou um unsigned char, que é um byte sem sinal ( de 0 a 255). É por isso que a função strlen apresenta um valor diferente em palavras acentuadas, ela conta a quantidade de bytes ( 1 byte = 1 caracter) mas caracteres acentuados ocupam dois bytes.
Essa mensagem que você recebeu não é de erro, é apenas um "aviso" (warning) para lembrar que o caracter usado sempre ocorre junto com outros. Se fosse um erro o compilador abortaria e não compilaria seu código.
Quanto a lógica que você pensou acho que não vai funcionar. Imagine a palavra "olá", não tem como pegar apenas o acento da letra a. O tamanho é 4 justamente porque o a acentuado ocupa dois bytes. Mas isso pode ser facilmente resolvido se você trabalhar com os códigos numéricos no lugar do caracter. Todo letra não acentuada terá seu código entre 0 e 127 (intervalo de 1 byte) enquanto que as letras acentuadas terão códigos negativos, pois ocupam dois bytes (ou entre 128 e 255 se forem unsigned). Assim, basta contar a quantidade acentuada e não acentuada. Ao final, o tamanho correto da string é a quantidade de letras não acentuadas mais a quantidade acentuada dividido por dois.
int minhaStrLen(char str[]) {
int i = 0, acentuadas = 0, naoAcentuadas = 0;
while(str[i] != '\0') {
if(str[i] >= 0 && str[i]
Bom dia, professor! Muito obrigado pelos esclarecimentos, não tinha pensado que poderia ser por conta do tamanho de cada caractere.
Eu fiz alguns teste com a função que o senhor descreveu e fiquei com algumas dúvidas ainda no funcionamento dela:
Pegando como exemplo "olá", as letras 'o' e 'l' vão entrar na contagem das naoAcentuadas totalizando 2 na variável, e o caractere 'á' deveria entrar apenas uma vez na variável acentuada, mas ele está ficando com um total de 2 assim como as não acentuadas.
Eu coloquei para imprimir os códigos e ele realmente me retorna 2 números negativos, mas eu não entendi esse retorno, achei que iria retornar apenas um único número negativo referente ao caractere que não está entre 0 - 127, ou esses dois números são os dois bytes referentes ao caractere 'á'?
E no return naoAcentuadas + acentuadas / 2, pela regra está sendo feito primeiro: acentuadas/2 e depois o resultado + naoAcentuadas, está funcionando perfeitamente, so gostaria de saber se a expressão é essa mesmo, pois o senhor descreveu como a soma das duas variáveis divididas por 2.
Isso realmente confunde a cabeça do ser humano Jefferson rsrsrs. Vamos lá:
"... e o caractere 'á' deveria entrar apenas uma vez na variável acentuada, mas ele está ficando com um total de 2 assim como as não acentuadas." A variável acentuadas fica com o valor 2 porque, como disse, um caracter acentuado ocupa 2 bytes e como é uma string, a iteração ocorre de byte em byte. Se você printar na tela o valor da variável i na repetição da função que postei no comentário anterior você verá que serão printados valores de 0 a 3. O caracter a acentuado corresponde aos índices 2 e 3 enquanto o fim da string ( \0 ) está no índice 4.
"Eu coloquei para imprimir os códigos e ele realmente me retorna 2 números negativos, mas eu não entendi esse retorno, achei que iria retornar apenas um único número negativo referente ao caractere que não está entre 0 - 127, ou esses dois números são os dois bytes referentes ao caractere 'á'?"
Sim, esses dois números negativos são referentes ao caracter a acentuado. Esse retorno negativo ocorre devido a forma como os números são armazenados pelo computador. O maior número possível em um byte (8 bits) é o 127 representado assim: 01111111. Observe que o bit mais a esquerda é um zero. Esse bit, chamado de bit mais significativo é o bit de sinal dizendo se o número é positivo (bit 0) ou negativo (bit 1). Contudo, como o código dos caracteres acentuados são maiores que 127, nós temos aí um número inteiro representado com dois bytes (16 bits). Isso faz com que o bit zero mude para 1 produzindo um valor negativo ao tentar imprimi-lo.
Sim, a expressão é essa mesma. Primeiro divide as acentuadas para depois somar.
No comentário anterior eu disse: "o tamanho correto da string é a quantidade de letras não acentuadas mais a quantidade acentuada dividido por dois". Não há nenhuma preposição ou pontuação no trecho "quantidade acentuada dividido por dois" então eu achei que estaria claro que a soma será feita depois da divisão. Mas, é a nossa língua portuguesa né! rsrsrs
Talvez esse link ( wagnergaspar.com/somei-dois-numeros-inteiros-positivos-e-o-resultado-ficou-negativo-por-que/ ) ajude a esclarecer a parte do negativo.
@@programeseufuturo
Mais uma vez, muito obrigado professor! Agora eu entedi plenamente haha
Suas aulas , paciência e atenção em responder todos os comentários estão me ajudando demais!
Espero que possa continuar com os vídeos e que tenha o reconhecimento merecido na plataforma.
int _strlen(char *psz) {
int tam = 0;
while((*psz++))
tam++;
return tam;
}
Perfeito Vilmar.