-
Posts
1.558 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que isrnick postou
-
Aqui eu fiz uma solução e comentei para explicar o que faz: #include <stdlib.h> #include <stdio.h> int main(){ int contador[26] = {0}, //Contadores para as 26 letras do alfabeto incializados em 0 i, j; char frase[1000], c; frase[0] = '\0'; fgets(frase, 1000, stdin); for(i=0; frase[i] != '\0' && i<1000; i++){ // Se o caractere for uma letra: if ( tolower(frase[i])>='a' && tolower(frase[i])<='z' ){ //Transforma a letra num número j de 0 a 25: j = (int) (tolower(frase[i]) - 'a'); //Incrementa o contador da j-ésima letra do alfabeto: contador[j]++; } } for(i=0; i<26; i++){ //Se a letra foi encontrada 1 ou mais vezes na frase: if(contador[i] != 0){ //Obtém o caractere da i-ésima letra do alfabeto: c = 'a' + (char)i; //Imprime a letra e o número de vezes em que foi encontrada na frase: printf("%c: %d\n", c, contador[i]); } } return 0; } Observe o uso da função tolower() que serve para transformar um caractere de letra maiúscula em letra minúscula, assim só é preciso checar letras minúsculas. Seria possível fazer o oposto usando a função toupper() para transformar em letras maiúsculas.
-
Para obter os dígitos do número você pode usar o operador % para calcular o resto da divisão inteira por 10 para obter o último digito, e depois fazer a divisão inteira por 10 pra eliminar o último dígito, e repetir o processo, ex: 753 % 10 = 3 753 / 10 = 75 75 % 10 = 5 75 / 10 = 7 7 % 10 = 7 7 / 10 = 0
-
Exercicio Telhado em C. Ques passos seguir.
isrnick respondeu ao tópico de Pedro Henrique Faria Teixe em C/C#/C++
Essa seria minha solução para a função: void telhado(int n, int matriz[n][n]){ int linha, coluna, coldiag1 = 0, coldiag2 = n-1; for (linha=0; linha < n; linha++){ for(coluna=0; coluna < n; coluna++) { if (abs(coluna - coldiag1) <= abs(coluna - coldiag2)) matriz[linha][coluna] = abs(coluna - coldiag1); else matriz[linha][coluna] = abs(coluna - coldiag2); } coldiag1++; coldiag2--; } } -
Teste incluindo isto: char c; . . . case 1: while((c = getchar()) != '\n' && c != EOF); //limpa a stdin printf("Digite a string :\n"); fgets( calc, 100, stdin ); tam=strlen(calc); printf("A string tem %d caracteres", tam); break; Se isto funcionar significa que provavelmente houve um scanf anterior que deixou algum "lixo" no stdin, e seu fgets está pegando o isto como entrada, se quiser entender melhor veja esse post abaixo onde postei uma explicação mais detalhada:
-
Exercicio Telhado em C. Ques passos seguir.
isrnick respondeu ao tópico de Pedro Henrique Faria Teixe em C/C#/C++
Se entendi direito o padrão segue o desenho de um telhado, onde as 2 diagonais principais recebem 0, e as posições imediatamente próximas as diagonais recebem 1, e as posições próximas as estas recebem 2, e assim por diante aumentando o número conforme se afasta das diagonais principais: 0 1 2 3 2 1 0 1 0 1 2 1 0 1 2 1 0 1 0 1 2 3 2 1 0 1 2 3 2 1 0 1 0 1 2 1 0 1 2 1 0 1 0 1 2 3 2 1 0 O valor armazenado na casa da matriz é igual a distância desta casa até a casa que pertence a diagonal principal mais próxima. Não importa se na vertical ou na horizontal isso é válido, então vamos considerar apenas a direção horizontal. Do exemplo acima podemos observar que na primeira linha as casas que pertencem a diagonal principal estão na coluna 0 e na coluna N-1, vamos então chamar coldiag1 = 0 e coldiag2 = N-1 na primeira linha, mas na linha seguinte coldiag1 = 1 e coldiag2 = N-2, e esse padrão segue a cada linha... Daí podemos tirar que a cada linha a posição da coluna que pertence a primeira diagonal principal (coldiag1) é incrementada de 1, e o oposto acontece na segunda diagonal, coldiag2 é subtraído de 1 a cada linha. Ok, agora sabemos as posições das colunas na respectiva linha que pertencem as diagonais principais, então para obter o valor a ser armazenado na casa basta calcular as distâncias da coluna atual até estas colunas, e armazenar o menor dos 2 valores. Ou seja, o mínimo entre |coluna - coldiag1| e |coluna - coldiag2| (onde | | indica o módulo ou valor absoluto). Agora tente implementar a lógica/código... -
Se numerarmos as linhas, temos que o número de espaços em branco em cada linha é igual a altura h menos o número da linha, e os números na linha vão contando de 1 até o número da linha, e depois vai conta regressivamente de volta até 1. Então a lógica fica algo desse tipo: para linhas indo de 1 até h: para conta_espaços indo de 1 até (h - linha): imprime espaço em branco fim_do_para para números indo de 1 até linha: imprime número fim_do_para para números indo de (linha-1) até 1: imprime número fim_do_para fim_do_para
-
Cadê a figura? E sempre use o a tag CODE para postar códigos, apertando o botão <> no topo do campo de resposta do fórum, pois assim você mantém a formatação e evita que o autocorretor do fórum faça alterações no texto do seu código.
-
Pra colocar os 2 valores fica assim: cout << "$" << count[i] << str[i];
-
Visual C# é uma implementação feita pela Microsoft da linguagem C#, ou seja se refere a implementação do compilador que é usado no Visual Studio. Tecnicamente você pode usar outro compilador de C#, como o compilador Mono do MonoDevelop, e não estaria usando Visual C#. Entretanto, a linguagem é chamada apenas C#. Quanto a porque existem livros de Visual C#, imagino que eles ensinem C# dando ênfase ao ambiente Windows, usando bibliotecas que podem depender do SO usado, e que faça referências especificamente ao Visual Studio e suas ferramentas...
-
Você está certo, eu errei, para descartar um caractere deve-se usar %*c no scanf (onde o * é usado para indicar que o valor lido não é armazenado em nenhuma variável, ou seja, é lido e descartado). Ficando assim: scanf("%i%*c", &i); (Editei e corrigi meu post original para colocar a forma correta.) E no fim do seu programa o valor a ser impresso é o valor da variável s, que é onde está armazenada a soma, não da variável i.
-
Sempre use a tag CODE, apertando o botão <> no topo do campo de resposta, para postar códigos, pois assim você mantém a formatação do código, e evita que o autocorretor do fórum faça alterações no texto do seu código... Quanto a sua pergunta, o problema está na entrada dos dados, quando você digita por exemplo o número 123 e aperta ENTER, o que está sendo passado para a entrada padrão (stdin) é a string "123\n", onde '\n' representa o caractere nova linha em C, e esse caractere foi inserido quando você apertou o botão ENTER. O scanf por sua vez que obter dessa entrada um número inteiro inteiro (scanf("%i", &i);), então ele pega da entrada a parte relevante "123" e deixa na entrada o que sobrou, nesse caso o caractere '\n'. Por sua vez, o próximo scanf no seu programa que obter um caractere (scanf("%c", &l);), mas já existe um caractere digitado na entrada padrão, o caractere '\n', então esse caractere é armazenado na variável l, e como l agora é diferente de 's' o programa sai do ciclo while e o programa é concluído. Uma maneira de tratar isto seria fazer o primeiro scanf descartar o '\n', modificando-o para esperar um número inteiro seguido de um caractere nova linha, como: scanf("%i%*c", &i); Isso excluiria o caractere nova linha da entrada padrão, e resolve o problema, mas observe que isso apenas trata a hipótese do usuário entrar um valor adequado, ou seja o usuário é bem comportado, mas se ao invés disto forem digitados o número e outros caracteres na entrada e só então for dado ENTER (ex: "123 blablabla\n"), ou for digitado algo que não seja um número, o programa se comportará de forma inesperada, pois o programa não lida com estas hipóteses. Um programa mais avançado precisaria analisar a validar a entrada antes de usá-la, e tratar os possíveis erros, mas isso ainda não é algo com que você precisa lidar. Outra solução seria excluir qualquer coisa que reste na entrada padrão depois que você obteve o dado relevante, com algo desse tipo: scanf("%i", &i); /*Lê e descarta todos os caracteres que ainda estiverem na entrada padrão até encontrar '\n' ou encontrar o fim do arquivo/stream/fila: */ while((c = getchar()) != '\n' && c != EOF); (Isso resolve o problema do usuário digitar algo além do esperado, mas ainda não trata a hipótese do usuário digitar algo completamente inválido. Para mais informações sobre isso pesquise sobre validação de entrada (input validation) em C.) EDIT: Correção no scanf para descartar o caractere '\n'.
-
Desculpe mas não sei C#, e não faço ideia de como fazer isso de bloquear até acesso ao gerenciador de tarefas ou impedir que a tarefa seja finalizada, mesmo nas linguagens que conheço, então isso está fora do meu alcance... Usar o próprio bloqueio do Windows seria simples, e até tem códigos de como ativá-lo postados na internet, o que você quer entretanto é algo bem mais complicado... Obs.: Sugiro não divulgar número de celular no fórum...
-
Não bastaria fazer bloquear o Windows? Aí a pessoa só consegue entrar novamente se digitar a senha do Windows...
-
Pra converter de graus pra radianos basta multiplicar por PI (3,14159...) e dividir por 180... Essa série de taylor quando expandida para k termos fica: cos(x) = 1 - (x^2)/2! + (x^4)/4! - (x^6)/6! + ... + { [(-1)^k] * (x^2k) } / (2k)! Mas note que: (x^2k) / (2k)! = [x * x^(2k-1)] / [2k * (2k-1)!] = (x / 2k) * [x^(2k-1) / (2k-1)!] => (eq. 1) E segue igualmente que: x^(2k-1) / (2k-1)! = [x / (2k-1)] * [x^(2k-2) / (2k-2)!] = [x / (2k-1)] * { x^[2(k-1)] / [2(k-1)]! } => (eq. 2) Substituindo eq.2 em eq.1 temos que: (x^2k) / (2k)! = (x / 2k) * [x / (2k-1)] * { x^[2(k-1)] / [2(k-1)]! } (x^2k) / (2k)! = {x^2 / [2k * (2k-1)] } * { x^[2(k-1)] / [2(k-1)]! } (x^2k) / (2k)! = [ x^2 / (4k^2 -2k) ] * { x^[2(k-1)] / [2(k-1)]! } Logo se chamarmos (x^2k) / (2k)! = f(x, k), temos que: f(x, k) = [ x^2 / (4k^2 -2k) ] * f(x, k-1) Então para obter o próximo termo da série basta multiplicar o último termo obtido por [ x^2 / (4k^2 -2k) ]. E a série de taylor fica: cos(x) = 1 - f(x, 1) + f(x, 2) - f(x, 3) + ... + [(-1)^k] * f(x, k) Agora tente implementar o algoritmo para calcular cos(x) sabendo disto.
-
Quando você coloca o número entre aspas simples, como '1', '2', '3', etc, está indicando o caractere (char) que representa o número em questão, não o número inteiro (int) em si... Logo nos cases do switch do seu programa deve-se usar o número sem as aspas, pois a e b são números inteiros, não chars... Ex: int numero; //Lógica para atribuir valores a variavel numero switch (numero){ case 1: //Lógica se numero == 1 break; case 2: //Lógica se numero == 2 break; default: //Lógica se numero não for igual a nenhum dos valores }
-
fflush(stdin) tem comportamento indefinido, ou seja pode não se comportar como o esperado, isso porque fflush() é para ser usado com streams de saída, não de entrada. Dependendo de como foi implementado no seu compilador/biblioteca ele pode até funcionar para limpar a stream, mas se usar um compilador diferente pode não funcionar, então não se deve usá-lo para esta função. flush_in() é uma função que o @vangodp postou/criou para fazer o que você pretendia ao usar fflush(stdin) no seu código, ou seja limpar os caracteres que ainda estiverem na entrada padrão stdin, para que não sejam interpretados como dados digitados pelo próximo comando de captura de entrada...
-
print('Velocidade média: {0:.2f} m/s'.format(v))
-
Sim, essa não é a questão, eu me referia a discussão sobre usar formato TXT ou CSV, e sobre como o caractere nova linha é representado na memória, não se aplicam no caso sendo discutido nesse tópico.
-
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <locale.h> typedef struct contato CONTATO; struct contato { int ativo; char nome[50]; char cpf[30]; }; void flush_in(); void cadastrar(); void listar(); void editar(); //VARIAVEL UNIVERSAL FILE *arquivo; CONTATO ctt; int op; int main(void) { setlocale(LC_ALL, "Portuguese"); do { system("cls"); printf("\n1 - Cadastrar"); printf("\n2 - Listar"); printf("\n3 - Editar"); printf("\n0 - Sair\n\n"); printf("Digite uma opção: "); scanf("%d", &op); //flush_in(); switch(op) { case 1: cadastrar(); break; case 2: listar(); break; case 3: editar(); break; case 0: break; default: printf("\nOpção Inválida!\n"); getch(); break; } }while(op!=0); } void flush_in() { int ch; while ( ( ch = fgetc ( stdin ) ) != '\n' && ch != EOF) {} } void cadastrar() { flush_in(); do { arquivo = fopen("base.txt","a+b"); system("cls"); printf("Nome: "); gets(ctt.nome); printf("CPF: "); gets(ctt.cpf); ctt.ativo = 1; fwrite(&ctt, sizeof(CONTATO),1,arquivo); fclose(arquivo); printf("Deseja realizar novo Cadastro (s/n)?"); }while(getche()=='s'); } void listar() { system("cls"); arquivo = fopen("base.txt","rb"); while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1) { printf("Status: %d\n", ctt.ativo); printf("Nome: %s\n",ctt.nome); printf("CPF: %s\n",ctt.cpf); printf("--------------------\n\n"); } fclose(arquivo); getch(); } void editar() { int posicao = 0; // Inicio do Arquivo; int achou = 0; char AltCpf[30]; char AltNome[50]; flush_in(); printf("Digite o CPF: "); gets(AltCpf); arquivo = fopen("base.txt","r+b"); system("cls"); op = -1; while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1 && op!=0) { if(strcmp(AltCpf,ctt.cpf)==0) { printf("\n1 - Nome: %s",ctt.nome); printf("\n2 - CPF: %s",ctt.cpf); printf("\n0 - Voltar"); printf("\n-------------\n\n"); printf("\n\nEscolha uma opção: "); scanf("%d", &op); flush_in(); switch(op) { case 1: printf("Digite o Novo nome: "); gets(ctt.nome); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); break; case 2: printf("Digite o novo CPF: "); gets(ctt.cpf); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); break; case 0: /*Não se deve chamar main() de dentro da função, isso criar uma recursividade com comportamento imprevisivel*/ //main(); break; default: printf("\nOpção Inválida!\n"); getch(); break; } } /*É aqui que a posição deve ser atualizada, no final do ciclo WHILE, sendo descolocado de +sizeof(CONTATO) a cada iteração do ciclo*/ posicao = posicao + sizeof(CONTATO); /*Move posição de leitura/escrita de volta para a posição original*/ fseek(arquivo, posicao, SEEK_SET); } op=-1; fclose(arquivo); } Só faltavam alguns detalhes, adicionei um fseek() no final pra voltar a posição original após fazer a edição, e aproveitei pra retirar os fflush(stdin) e substituir pela função flush_in() conforme sugerido pelo @vangodp . Mas o problema maior era que o tinha um "case" no "switch" da função onde a função main() era chamada, e isso gerava uma recursividade sem comportamento previsto, retirei isso e ao invés fiz o ciclo while checar o valor da variável "op" e acabar quanto igual a 0... (Outra opção seria dentro do "case" usar "fclose()" pra fechar o arquivo, e "return;" pra sair da função)
-
@vangodp @Gustavo.Loggin Os exemplos usados aqui lidam com arquivos armazenando informações em modo binário, não modo texto, logo nada disso se aplica. @Intruder18 Fiz algumas alterações no código, e comentários do motivo, mas não testei já que compiladores online não aceitam a biblioteca <conio.h>, e não estou em casa... Testa e veja se funcionou. #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <locale.h> typedef struct contato CONTATO; struct contato { int ativo; char nome[50]; char cpf[30] }; void cadastrar(); void listar(); void editar(); //VARIAVEL UNIVERSAL FILE *arquivo; CONTATO ctt; int op; int main(void) { setlocale(LC_ALL, "Portuguese"); do { system("cls"); printf("\n1 - Cadastrar"); printf("\n2 - Listar"); printf("\n3 - Editar"); printf("\n0 - Sair\n\n"); printf("Digite uma opção: "); scanf("%d", &op); switch(op) { case 1: cadastrar(); break; case 2: listar(); break; case 3: editar(); break; case 0: break; default: printf("Opção Inválida!"); break; } }while(op!=0); } void cadastrar() { do { arquivo = fopen("base.txt","a+b"); system("cls"); fflush(stdin); printf("Nome: "); gets(ctt.nome); fflush(stdin); printf("CPF: "); gets(ctt.cpf); ctt.ativo = 1; fwrite(&ctt, sizeof(CONTATO),1,arquivo); fclose(arquivo); printf("Deseja realizar novo Cadastro (s/n)?"); }while(getche()=='s'); } void listar() { system("cls"); arquivo = fopen("base.txt","rb"); while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1) { printf("Status: %d\n", ctt.ativo); printf("Nome: %s\n",ctt.nome); printf("CPF: %s\n",ctt.cpf); printf("--------------------\n\n"); } fclose(arquivo); getch(); } void editar() { int posicao = 0; // Inicio do Arquivo; int achou = 0; char AltCpf[30]; char AltNome[50]; fflush(stdin); printf("Digite o CPF"); gets(AltCpf); arquivo = fopen("base.txt","r+b"); /*Não sei porque você está reposicionando a leitura aqui, visto que já está no começo do arquivo, afinal você acabou de abri-lo*/ // fseek(arquivo, posicao, SEEK_SET); system("cls"); while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1) { if(strcmp(AltCpf,ctt.cpf)==0) { printf("\n1 - Nome: %s",ctt.nome); printf("\n2 - CPF: %s",ctt.cpf); printf("\n0 - Voltar"); printf("\n-------------\n\n"); printf("\n\nEscolha uma opção: "); scanf("%d", &op); switch(op) { case 1: fflush(stdin); printf("Digite o Novo nome: "); gets(ctt.nome); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); /*Esse ajuste da posição é desnecessário*/ // ajustar posicao em relação ao inicio do arquivo //posicao = posicao + sizeof(CONTATO); break; case 2: fflush(stdin); printf("Digite o novo CPF: "); gets(ctt.cpf); fseek(arquivo, posicao, SEEK_SET); achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO); /*Novamente, esse ajuste da posição é desnecessário*/ // ajustar posicao em relação ao inicio do arquivo //posicao = posicao + sizeof(CONTATO); break; case 0: main(); break; default: printf("\nOpção Inválida!"); break; } } /*É aqui que a posição deve ser atualizada, no final do ciclo WHILE, sendo descolocado de +sizeof(CONTATO) a cada iteração do ciclo*/ posicao = posicao + sizeof(CONTATO); } fclose(arquivo); } A variável "posicao" está armazenando a posição de leitura/escrita no arquivo antes do próximo fread() ser executado (que logicamente desloca a posição a cada leitura).
-
Supondo que você já tenha localizado a matrícula a ser excluída, e tenha sua posição no arquivo, os dados do aluno em questão em estarão em ctt, e podemos fazer algo do tipo: ctt.ativo=0; //Inativo fseek(arq, (posicao - 1)*sizeof(Aluno), SEEK_SET); fwrite(&ctt, sizeof(Aluno), 1, arq); Pra entender o fseek(): - O primeiro parâmetro indica a stream sendo processada, no caso o nosso arquivo. - O segundo parâmetro indica o offset/deslocamento para posicionar o leitura/escrita no arquivo imediatamente anterior a entrada do aluno a ser "excluído". - E o terceiro parâmetro indica a partir de onde o deslocamento deve ser feito, nesse caso usamos SEEK_SET que indica que o deslocamento deve ser a partir do início do arquivo (poderiam serem usados SEEK_CUR para começar a partir da posição atual, ou SEEK_END para começar a partir do fim do arquivo).
-
A ideia é pesquisar a matrícula a ser excluída no arquivo até encontrá-la, contando o número de alunos até ele, ou seja encontra a posição dele no arquivo, então usa fseek pra mover a posição de leitura/escrita no arquivo até o local imediatamente anterior a esta entrada, e escreve o registro do aluno novamente no mesmo local do arquivo apenas mudando o valor de "ativo" para "inativo". Aí a informação estará "excluída" (e é aí que os sites de rede social mentem pra você quando você pede para excluírem sua conta e dados, eles ainda tem todas as informações lá)...
-
Sim, desculpe se postei demais da solução, foi o melhor jeito que consegui pensar pra explicar melhor, fazendo o código propriamente e colocar comentários.
-
Sempre use o tag CODE, apertando o botão <> no topo do campo de resposta, para postar códigos. Assim você mantém a formatação dele e evita que o autocorretor do fórum faça alterações no texto do seu código. Aqui eu fiz o código: #include <stdio.h> #include <stdlib.h> int main(){ int m[3][4]; int i,j,count = 0,l=3,c=4; //Atribui os valores para a matriz: for(i=0;i<l;i++){ //linhas de 0 até L-1 if(i%2 == 0){ //se for par for(j=0;j<c;j++){ //colunas de 0 até C-1 count++; m[i][j] = count; } } else { //se for ímpar for(j=c-1;j>=0;j--){ //colunas de C-1 até 0 count++; m[i][j] = count; } } } //Imprime os valores da matriz: for (i=0;i<l;i++){ for (j=0;j<c;j++){ printf("%d ", m[i][j]); } printf("\n"); } return 0; } Note que ainda falta adaptar o código para aceitar matrizes de dimensões diferentes de 3 x 4, com as dimensões sendo digitadas pelo usuário, e fazer o programa acabar quando a dimensão digitada for 0 x 0.
-
Pra te ajudar eu vou reutilizar a resposta que eu postei nesse tópico que envolvia um problema parecido: Vamos usar por exemplo de uma matriz 5 x 6 (então L = 5 e C = 6). Nesse caso as coordenadas da matriz serão: 00 01 02 03 04 05 10 11 12 13 14 15 20 21 22 23 24 25 30 31 32 33 34 35 40 41 42 43 44 45 E a matriz deverá ser percorrida primeiro de 00 até 05, aí desce para 15 e percorre o caminho inverso na linha até 10, depois desce para 20 e assim por diante... Podemos analisar esse comportamento em zigzag separando linhas e colunas... Considerando apenas as linhas o caso é simples pois a matriz sempre é percorrida num único sentido, de cima para baixo, logo o valor é sempre incrementado, indo de 0 a 4 (ou no caso geral de 0 até L-1). Quando consideramos as colunas vemos que o sentido percorrido é invertido a cada linha, ou seja, as coordenadas das colunas vão de 0 a 5 inicialmente, mas de 5 a 0 na linha seguinte, e de 0 a 5 novamente na linha seguinte, e assim por diante. Podemos então observar que nas linhas 0, 2 e 4 as coordenadas irão de 0 a 5, enquanto nas linhas 1 e 3 elas irão de 5 a 0, e daí fica fácil observar um padrão: ou seja, se a linha é par deseja-se percorrer as colunas de 0 até 5 (generalizando: 0 até C-1), e se a linha for ímpar (= não for par) deseja-se percorrer as colunas de 5 até 0 (generalizando: C-1 até 0). Logo, a lógica do caminho percorrido em zigzag na matriz será algo do tipo: para linhas indo de 0 até L-1: se a linha atual for par: para colunas indo de 0 até C-1: <lógica> fim do para senão: para colunas indo de C-1 até 0: <lógica> fim do para fim do se fim do para
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais