Ir ao conteúdo
  • Cadastre-se

Plástico Bolha

Membro Pleno
  • Posts

    407
  • Cadastrado em

  • Última visita

  1. Acho que as alterações que fiz resolvem, cuidado com o INFINITY, ele estava arredondando os resultados de forma que tirava a exatidão do float durante as somas entre os custos. #include <stdio.h> #define INFINITY 9999 #define MAX 10 const float INF = 9999; void Dijkstra(float Graph[MAX][MAX], int n, int start) { float cost[MAX][MAX], distance[MAX], pred[MAX]; int visited[MAX], count, nextnode, i, j; // Creating cost matrix for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (Graph[i][j] == 0) cost[i][j] = INF; else cost[i][j] = Graph[i][j]; for (i = 0; i < n; i++) { distance[i] = cost[start][i]; pred[i] = start; visited[i] = 0; } distance[start] = 0; visited[start] = 1; count = 1; while (count < n - 1) { float mindistance = INF; for (i = 0; i < n; i++) if (distance[i] < mindistance && !visited[i]) { mindistance = distance[i]; nextnode = i; } visited[nextnode] = 1; for (i = 0; i < n; i++) if (!visited[i]) if (mindistance + cost[nextnode][i] < distance[i]) { distance[i] = mindistance + cost[nextnode][i]; pred[i] = nextnode; } count++; } // Printing the distance for (i = 0; i < n; i++) if (i != start) { printf("\nDistance from source to %d: %f", i, distance[i]); } } int main() { float Graph[MAX][MAX], i, j, n, u; n = 5; Graph[0][0] = 0; Graph[0][1] = 13.192; Graph[0][2] = 0; Graph[0][3] = 0; Graph[0][4] = 0; Graph[1][0] = 1; Graph[1][1] = 0; Graph[1][2] = 0; Graph[1][3] = 0; Graph[1][4] = 46.172; Graph[2][0] = 0; Graph[2][1] = 6.596; Graph[2][2] = 0; Graph[2][3] = 0; Graph[2][4] = 32.98; Graph[3][0] = 0; Graph[3][1] = 0; Graph[3][2] = 0; Graph[3][3] = 0; Graph[3][4] = 0; Graph[4][0] = 0; Graph[4][1] = 0; Graph[4][2] = 0; Graph[4][3] = 0; Graph[4][4] = 0; u = 0; Dijkstra(Graph, n, u); return 0; }
  2. E ai, aqui tem um exemplo de como rodar C/C++ no linux usando vs code ... As vezes pode te ajudar
  3. Eu não entendi muito bem, aparentemente, a lista deveria começar simplesmente encadeada e depois virar circular, eu iniciei a sua ideia. #include <stdio.h> #include <stdlib.h> typedef struct NO { NO * next; int data; } NO; typedef struct L { NO * node; NO * last; int idx; int limit; } L; void add(L * list, int data) { if (list->idx == list->limit) { list->last->next = list->node; // aponta o final para o inicio, criando um loop de referencias } if (list->node == NULL) { list->node = (NO * ) malloc(sizeof(NO)); list->node->data = data; list->node->next = NULL; list->last = list->node; } else if (list->idx < list->limit) { NO * aux; NO * l = list->node; while (l != NULL) { aux = l; l = l->next; } aux->next = (NO * ) malloc(sizeof(NO)); aux->next->data = data; list->last = aux->next; // manter atualizada a referencia pro ultimo elemento } else { NO * l = list->node; int offset = 0; while (offset < list->idx) { l = l->next; offset++; } l->data = data; } list->idx++; } // caso queira testar se existe de fato um looping infinito void show(L * list) { NO * aux; aux = list->node; int max = 20; int i = 0; int j = 1; while (aux != NULL && max > i) { printf("%d\n", aux->data); aux = aux->next; if (list->limit == j) { printf("volta pro inicio---\n\n"); j = 0; } i++; j++; } } int main() { // criar a lista L * list = (L * ) malloc(sizeof(L)); list->limit = 5; list->idx = 0; add(list, 1); add(list, 2); add(list, 3); add(list, 4); add(list, 5); // caso especial->quando a lista chega no limite e cria um loop add(list, -1); add(list, -2); show(list); } Se você estava travado em "transformar a encadeada em circular" essa seria uma ideia
  4. Inicie criando funções genéricas de criação e leitura de matrizes dinamicamente ... Inicie do básico com inteiros ou floats, depois altere para lidar com strings, essa seria minha dica ... /* leitura de valores para a matriz */ void le_mat(float **mat, int N, int M) { int i, j; printf("\n\nInforme os dados para a matriz %dx%d\n", N, M); for(i=0; i<N; i++) for(j=0; j<M; j++) scanf("%f", &mat[i][j]); } /* inicializa a matriz com um valor dado */ void init_mat(float **mat, int N, int M, float val) { int i, j; for(i=0; i<N; i++) for(j=0; j<M; j++) mat[i][j]=val; } /* mostra matriz */ void mostra(float **mat, int N, int M) { int i, j; printf("\n\nMatriz:\n"); for(i=0; i<N; i++){ for(j=0; j<M; j++) printf("%.1f ", mat[i][j]); printf("\n"); } } /* libera espaço utilizado pela matriz - apaga a matriz */ void libera(float **mat, int N) { int i; for(i=0; i<N; i++) if (mat[i]!=NULL) free(mat[i]); if (mat!=NULL) free(mat); } /* cria uma matriz dinamicamente */ int **criamat(int N, int M) { int **mat; int i; mat = (int **) malloc(N*sizeof(int *)); if (!mat) { printf("Erro alocação primeira dimensão\n"); system("pause"); return NULL; } for(i=0; i<N; i++) { mat[i] = (int *) malloc(M*sizeof(int)); if (!mat[i]) { printf("Erro alocação segunda dimensão\n"); system("pause"); return NULL; } } return mat; } /*Criando vetor Dinâmico */ char *criav(int M){ char *vet; vet = (char *) malloc(M*sizeof(char )); return vet; } Cuidado com caracteres especiais ... Isso faz um BUG no printf ... Veja como este problema pode ser resolvido: E seria interessante você ler isso para compreender porque o printf têm esse "BUG": https://www.ime.usp.br/~pf/algoritmos/apend/unicode.html Preste atenção nesse ponto também Diferença entre %c e %s em C %c –> Se refere a um único caractere, assim como as aspas simples; %s –> Serve para denominar uma sequência de caracteres que tem seu fim marcado por um espaço.(imagine o que acontece se você colocar isso em um for ... Além disso, espaço também conta como um caractere 32, o que pode fazer com que você ultrapasse o limite do seu vetor e cause esses erros estranhos de estouro do vetor) getchar() é uma função da biblioteca padrão stdio. Cada vez que é chamada, esta função lê um caractere (%c) do teclado; getchar começa a ler depois que a tecla é digitada no final de uma sequência de caracteres (dizemos que a entrada para a função getchar() está no fluxo de entrada). A função getchar() retorna um valor, o caractere lido (mais precisamente, o código inteiro ASCII correspondente ao caractere). Você deve saber que o caractere de nova linha, \n, que tem o código ASCII 10, é automaticamente adicionado na sequência de caracteres de entrada quando com getchar(). Isso não tem importância quando a função getchar() é chamada uma única vez, mas isto pode causar problemas quando ele é usado dentro de um laço.
  5. Cara, como o @arfneto disse, falta infomações para te darmos o melhor caminho, existem N soluções mais qual seria a mais viável e simples dado o seu problema ... Enfim ... Se você quer criar algum socket que fique rodando estilo client/server etc ... Apenas altere esse código para os seus propósitos @Yoda TI Socket server TCP/IP // SERVER.C ### #include <stdio.h> #include <conio.h> #include <winsock.h> // Inclui o header do winsock. #include <windows.h> // Repara que este header é para utilizarmos a função Sleep(); #pragma comment(lib, "wsock32.lib") // -l wsock32 -l Ws2_32 DLL ... #pragma comment(lib, "Ws2_32.lib") // -l wsock32 -l Ws2_32 DLL ... // Variíveis que recebem o valor da inicialização e criação do socket. WSADATA data; SOCKET winsock; // Socket NÃO inicializado apenas criado ... SOCKADDR_IN sock; // É um Struct e dentro dele contém a configuração do socket a ser usado o ip, a porta e a família do socket. char buffer[1024]; char buffer2[1024]; int bytes; int main() { //WSAStartup - Inicializa o uso do winsock. Isso e pra definir a versao do socket if(WSAStartup(MAKEWORD(1,1),&data) == SOCKET_ERROR){ // A sintaxe é : WSAStartup(VERSAO_DO_WINSOCK,ENDEREÇO DA VARIÁVEL) printf("Erro ao inicializar o winsock"); // A função retorna o valor 0 (zero) quando é finalizada com sucesso ou -1, quando um erro ocorre. return 0; } //socket - Inicializa o socket. if((winsock = socket(AF_INET,SOCK_STREAM, 0)) == SOCKET_ERROR){ // A sintaxe é: socket(FAMILIA,TIPO_DE_PROTOCOLO,0) printf("Erro ao criar socket!!!"); return 0; } /* utilizo o AF_INET, Tipo de protocolo: SOCK_STREAM -> protocolo TCP // Utilizaremos o SOCK_STREAM SOCK_DGRAM -> protocolo UDP SOCK_RAW -> protocolo para RAW SOCKETS. OBS: Assim como a função WSAStartup, esta retorna os valores: 0 (Socket inicializado) ou 1 (não inicializado). */ sock.sin_family = AF_INET; sock.sin_port = htons(1234); if(bind(winsock,(SOCKADDR*)&sock,sizeof(sock)) == SOCKET_ERROR){ // Assim como a função WSAStartup e socket, a função BIND também retorna um valor, printf("Erro ao abrir a porta no sistema (Erro em bind)!!!"); // que por sinal, são os mesmos. Esta função é responsível por colocar o socket no modo BIND(configura-lo na porta local). return 0; // int bind (socket, estrutura de conexao (local), tamanho da estrutura); } // A função bind() faz o papel de abrir a porta no sistema. listen(winsock, 1); // listen(winsock,1) -> Coloca o socket em modo de espera, aceitando 1 conexão. printf("Aguardando conexao!!!\n\n"); while((winsock = accept(winsock, NULL ,NULL)) == SOCKET_ERROR) // listen(winsock,1) -> Coloca o socket em modo de espera, aceitando 1 conexão. { // Criamos um loop para verificarmos se houve um pedido de conexão, como a função ACCEPT retorna -1 quando não há pedidos, Sleep(1); // o loop será feito até que o retorno seja diferente de -1, que indica um pedido de conexão. } // Ao sair do loop, é mostrada na tela uma mensagem dizendo que houve uma conexão e em seguida o programa encerra. // novo socket = accept (socket, estrutura de conexao, tamanho); printf("Cliente conectado!!!\n"); // APÓS TER ESTABELICIDO A CONEXÃO É POSSIVEL ENVIAR E RECEBER DADOS OU QUALQUER OUTRA COISA DO TIPO ... while(1){ Sleep(1); memset(buffer2, 0, 1024); bytes = recv(winsock, buffer2, 1024, 0); if(bytes == -1){ printf("Conexão perdida!!!\n"); closesocket(winsock); // Fecha o Socket WSACleanup(); // Essa função termina uso a ws2.dll. Para evitar acesso desnecessário a dll ws2.dll getch(); return 0; } printf(buffer2); // Aqui é pra printa o que voce recebeu do cliente printf("To: "); // Esse To e pra voce digitar o que quer enviar pro cliente ... Mesmo voce como servidor tem como enviar coisas ao cliente sem problemas ... gets(buffer); // Pega o que voce digitou printf("\n"); strcat(buffer,"\r\n"); // Da uma formatacao fulera no que voce digitou ... =P send(winsock, buffer, strlen(buffer), 0); // Envia pro cliente o que você digitou. Como voce (servidor) "aceitou" (e recebeu dados) o winsock possui os dados do cliente ... // Por isso mesmo sem voce configurar o ip e porta do cliente e porcarias do tipo ... voce ainda consegue se comunicar com o cliente por causa disso } getch(); closesocket(winsock); // Fecha o Socket WSACleanup(); // Essa função termina uso a ws2.dll. Para evitar acesso desnecessário a dll ws2.dll return 0; } // Pra rodar isso no DevC++ 4.9.9.2 vai em "Compiler Options" e digita la : -l wsock32 -l Ws2_32 e marca a opção "add the following commands when calling compiler" Socket client TCP/IP //CLIENTE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #include <stdio.h> // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib #pragma comment (lib, "Ws2_32.lib") #pragma comment (lib, "Mswsock.lib") #pragma comment (lib, "AdvApi32.lib") #define DEFAULT_BUFLEN 128 #define DEFAULT_PORT "27015" int __cdecl main(int argc, char **argv) { char texto[128]; WSADATA wsaData; SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo *result = NULL, *ptr = NULL, hints; // Carregar buffer; char recvbuf[DEFAULT_BUFLEN]; int iResult; int recvbuflen = DEFAULT_BUFLEN; argv[1] = "localhost"; argc = 2; // Validar os parâmetros if (argc != 2) { printf("usage: %s server-name\n", argv[0]); return 1; } // Inicializar o Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; } ZeroMemory( &hints, sizeof(hints) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // Resolve o endereço do servidor e a porta iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // Tentar se conectar a um endereço, até que um bem-sucedido for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { // Criar um Socket para se conectar ao servidor ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); WSACleanup(); return 1; } // Conectar ao servidor. iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; continue; } break; } freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); return 1; } else { printf("Conexao estabelecida... \n"); } do { printf("digite a mensagem..: "); scanf("%s", texto); iResult = send( ConnectSocket, texto, (int)128, 0 ); //enviar para o servidor if (iResult == SOCKET_ERROR) printf("send failed with error: %d\n", WSAGetLastError()); else { /* espera ack do servidor */ iResult=recv(ConnectSocket, recvbuf, iResult, 0 ); //recebe do servidor if ( iResult < 0 ) printf("erro recebendo no socket"); else { recvbuf[iResult]='\0'; printf("Cliente recebeu: %s\n",recvbuf); } } } while (strcmp(texto,"fim")); //Limpeza; closesocket(ConnectSocket); WSACleanup(); printf("Conexão finalizada... \n"); system("pause"); return 0; } Mais assim @Yoda TI, parece meio estranho isso que você está tentando fazer, não parece digamos "usual", é meio sei lá, já têm um monte de coisas prontas pra lidar com VPN como o @arfneto disse acima ... Eu te passei esse código que é extremamente básico para fazer um client/server com C/C++ bem simples, te dei uma espécie de hello world, apenas um ponto de partida client/server C/C++, mais você vai ter que fazer conversão de XML, vai ter que brincar com SSL no meio disso aí, se o seu servidor tiver certificado SSL você vai ter que utilizar o certificado pra abrir conexão com o server etc etc etc ... Se você modificar esse código para os seus propósitos Ok, funciona ... Mais analisando o que você escreveu me parece uma abordagem "estranha" para este problema. Eu trabalho com microserviços já têm 2 anos, lido com servidor etc etc etc ... E sei lá ... Tá meio estranho essa abordagem ... Mais segue o código. E se você está disponibilizando algo como uma API no seu servidor, eu não recomendaria você fazer isso com C/C++, porque você vai ter que fazer o server na unha rsrs, apenas se você precisa-se de performance extrema na sua API recomendaria C/C++, que não me parece exatamente o caso ... Os caras utilizam outras linguagens que são mais voltadas para este nicho como Node.js, Python, GO, Ruby ... Mercado livre usa GO, Uber usa Node.js e GO, Sentry usa Python e Node.js enfim ... A galera faz API em C/C++ geralmente para aplicação de redes neurais em IA por exemplo, ou coisas dessa natureza, que necessitem realmente de performance e controle extremo em cima do hardware ... Pense nisso rsrs att ... Não é que vai ficar ruim fazer com C/C++, muito pelo contrário, C/C++ é maravilhoso, linguagem top para aplicações de alta performance, no entanto, você vai ter que fazer muita coisa na mão rsrs ...
  6. O que você quer dizer exatamente quando fala: A VPN têm mais haver com infra do que com programação pura e simplesmente. Eu tenho microservices que rodam em servidores que possuem VPN, mais fica implicito pro programador a VPN, isso é algo criado pela infra do datacenter ... Por isso não compreendi as entrelinhas da sua pergunta.
  7. Caso você queira fazer isso com sizeof faça: sizeof(arr)/sizeof(arr[0]) Pesquisa porque funciona assim . . . E não do outro jeito OBS1: OBS2:
  8. package main import ( "fmt" "strconv" "strings" ) func main() { var term string = "2x+5x" var expression []string = strings.Split(term, "+") var tmpExp int var counter int = 0 var err error var idx int = 0 var _length int = len(expression) for idx < _length { if strings.Index(expression[idx], "x") != -1 { tmpExp, err = strconv.Atoi(strings.Split(expression[idx], "x")[0]) if err == nil { counter += tmpExp } } idx++ } fmt.Println("Soma de", term, ":", counter) } Veja que fiz exatamente o que pediu (alguma forma de pega o termo 2 e soma com o termo 5), a soma de 2 + 5 ... Mas esta solução é extremamente frágil . . . Para criar algo robusto, que funcione para qualquer entrada, para qualquer equação, um Parser será necessário, mais está aí a "lógica" (não em C) que faz exatamente o que foi pedido rsrs . . . https://play.golang.org/p/aHZXd_5zVYT
  9. Você precisa fazer um Parser! Não é algo trivial, mas se quer fazer algo robusto, para receber qualquer entrada e processá-la, o Parser será necessário. https://pt.wikipedia.org/wiki/Análise_sintática_(computação)
  10. Pode-se fazer por exemplo uma DLL feita em C ANSI (ou em outra linguagem), e importar ela com C#, ou alguma outra linguagem, sendo que dentro dessa DLL pode conter N funções feitas em C. Pegando como exemplo o Golang, ele é compatível com C ANSI, se você criar uma função em C pode chamar ela com GO sem precisar fazer nada de especial, é possível dar #include em alguma lib feita em C ANSI dentro do GO e chamar as funções de C dentro do GO normalmente. É possível dentro do C chamar código Assembly. É possível usar o JNI (DO JAVA) para imbutir um Wrapper de C/C++ dentro do JAVA Usar Sockets/Webserver/Endpoint/Rest API etc... + JSON é outra alternativa, geralmente utilizada na WEB para criar vários serviços/micro serviços feitos em diferentes linguagens para diferentes dominios.
  11. Sim, de fato existe um custo computacional para realizar esta operação, no entanto ... Geralmente na análise de complexidade de algoritmos é pego somente o termo de maior relevância dentro do algoritmo, e é desprezado os termos de menor relevância, se pro seu algoritmo contabilizar tal declaração se torna algo essêncial para montar a equação e fazer a análise assintótica, então sim, deve-se contabilizar, caso este termo (declaração) seja desprezível dado o resto do algoritmo, então não há porque contabilizá lo, isso depende muito do objetivo da sua análise, por exemplo: // Imagine que está função faz a soma dos elementos de uma matriz quadrada function sumMatrix(matrix: number[][]) { // Faz sentido contabilizar o custo da declaração de sum ? var sum = 0; for (var i = 0; i < matrix.length; i++) { // N - 1 for (var j = 0; j < matrix.length; j++) { // (N - 1)*(N - 1) sum += matrix[i][j]; // (N - 1)*(N - 1) } } // Faz sentido contabilizar o custo deste retorno ? return sum; } // Faz sentido contabilizar o custo desta declara + retorno ? var totalSum = sumMatrix(matrix) console.log(totalSum) //Faz sentido contabilizar o custo desta impressao deste numero no console ? Você teria algo desse tipo no final, por exemplo (Não sei fiz a análise deste algoritmo 100% correta, no entanto, nem é essa a ideia deste post) Desta forma esta equação deveria ser simplificada para que fosse possível fazer a análise assintótica do seu algoritmo, de qualquer forma, fica claro que seria uma equação de ordem 2, obivamente porque se trata de uma matriz quadrada. Então teriamos algo como no pior caso O(n²). Perceba algo interessante sobre a sua análise! Iria fazer alguma diferença se adicionar aquelas declarações ali em cima? Como por exemplo: Nâo ! Isto não mudaria a ordem 2 da equação, e a complexidade do seu Big O não deixaria de ser O(n²), portante, para este algoritmo em questão tais declarações se tornam despreziveis. Na análise assintótica de um algoritmo, cada caso é um caso, e deve-se ter total compreensão do que o seu algoritmo faz, e qual o objetivo dá análise ou qual é exatamente a métrica que se está buscando na análise. Por exemplo, se este algoritmo fosse analisado: function sumNumbers(x,y) { var result = x + y // Vale a pena contabilizar esta atribuição + operação matemática ? Sim ! return result // vale a pena contabilizar este retorno ? Sim ! } Neste caso valeria a pena contabilizar a declaração e o retorno das 2 linhas, pois a equação simplificada deste algoritmo não iria ser de ordem maior que 2 . . . Acredito que o melhor a se fazer para analisar o algoritmo seria antes de analisar o algoritmo de forma mecânica/matemática, seria compreender o contexto do algoritmo.
  12. Faz bastante tempo desde a ultima vez que usei openGL e webGL, tinha guardado este trecho de código, pode te ajudar a iniciar algo. A glut.h é legal para aprender a programar com openGL, mas se for fazer um projeto mais complexo, vai precisar usar outras coisas. OBS: para rodar este código será necessário a DLL glut32.dll e as libs glut.h e GL/gl.h. Este código gera uma animação de um cilindro 3D, esta animação termina quando a tecla "esc" for apertada. #include <stdlib.h> #include <glut.h> #include <GL/gl.h> #include <stdio.h> #include <math.h> #define ESCAPE_KEY 27 float janela; float t = 0.0f; void renderCylinder(float x1, float y1, float z1, float x2,float y2, float z2, float radius,int sub_divisao,GLUquadricObj *quadric) { float vx = x2-x1; float vy = y2-y1; float vz = z2-z1; if(vz == 0) vz = .00000001; float v = sqrt( vx*vx + vy*vy + vz*vz ); float ax = 57.2957795*acos( vz/v ); if ( vz < 0.0 ) ax = -ax; float rx = -vy*vz; float ry = vx*vz; glPushMatrix(); //CORPO CILINDRO glTranslatef( x1,y1,z1 ); glRotatef(ax, rx, ry, 0.0); gluQuadricOrientation(quadric,GLU_OUTSIDE); gluCylinder(quadric, radius, radius, v, sub_divisao, 1); //Primeiro Cap gluQuadricOrientation(quadric,GLU_INSIDE); gluDisk( quadric, 0.0, radius, sub_divisao, 1); glTranslatef( 0,0,v ); //Segundo Cap gluQuadricOrientation(quadric,GLU_OUTSIDE); gluDisk(quadric, 0.0, radius, sub_divisao, 1); glPopMatrix(); } void CILINDRO(float x1, float y1, float z1, float x2,float y2, float z2, float radius,int sub_divisao) { GLUquadricObj *quadric=gluNewQuadric(); gluQuadricNormals(quadric, GLU_SMOOTH); renderCylinder(x1,y1,z1,x2,y2,z2,radius,sub_divisao,quadric); gluDeleteQuadric(quadric); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0,-7); //Definindo o cilindro float x1 = sin(t); float y1 = sin(t/2); float z1 = cos(t*1.1); float x2 = -sin(t*1.3); float y2 = 0; float z2 = -cos(t); float radius = 0.03+(sin(t)/2+0.5)/3; CILINDRO(x1,y1,z1,x2,y2,z2,radius,32); t+=0.010; glutSwapBuffers(); } void InitGL(int Width, int Height) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glEnable(GL_LIGHTING); GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f }; glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); glEnable(GL_LIGHT1); } void keyPressed(unsigned char key, int x, int y) { if(key == ESCAPE_KEY) { glutDestroyWindow(janela); exit(1); } } int main( int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640, 480); janela = glutCreateWindow(""); glutDisplayFunc(&display); glutKeyboardFunc(&keyPressed); glutFullScreen(); glutIdleFunc(&display); InitGL(640, 480); glutMainLoop(); return 1; }
  13. O que fiz, foi algo com pouca performance, no entanto, atende aos requisitos, está é apenas a ideia de como você poderia fazer: package main import ( "fmt" ) const MAX = 12 func main() { var vetA = [MAX]int{7, 2, 3, 2, 5, 2, 3, 7, 1, 2, 45, 1} var idx int = 0 var vetB [MAX]int for i := 0; i < MAX; i++ { for j := i + 1; j < MAX; j++ { if vetA[j] == vetA[i] { var flag bool = true for k := 0; k < MAX; k++ { if vetB[k] == vetA[j] { flag = false break } } if flag { vetB[idx] = vetA[j] idx++ } } } } fmt.Println("Valores repetidos: ", vetB) // Output: Valores repetidos: [7 2 3 1 0 0 0 0 0 0 0 0] }
  14. Acho que a ideia seria essa: package main import "fmt" func main() { var b float32 = -1; var h float32 = -1; var maxTry int = 3; var try int = 0; for(((b < 0) || (h < 0)) && (try < maxTry)) { fmt.Print("Digite o valor da base: "); fmt.Scanln(&b); fmt.Print("Digite o valor da altura: "); fmt.Scanln(&h); try++; if(((b < 0) || (h < 0)) && (try < maxTry)) { fmt.Print("Dados invalidos - "); fmt.Println(try); } } if(try < maxTry) { try = 0; b = (b*h) / 2; fmt.Println("Area: ", b); } else { fmt.Println("Erro !"); } } Se for proibido usar for ... teria como fazer com recursividade: package main import "fmt" func calcArea(try int, maxTry int) bool { var b float32 = -1; var h float32 = -1; var rsp bool = false; try++; if(try <= maxTry) { fmt.Print("Digite o valor da base: "); fmt.Scanln(&b); fmt.Print("Digite o valor da altura: "); fmt.Scanln(&h); if((b < 0) || (h < 0)) { fmt.Print("Dados invalidos - "); fmt.Println(try); rsp = calcArea(try, maxTry); } else { b = (b*h) / 2; fmt.Println("Area: ", b); rsp = true; } } return rsp; } func main() { var maxTry int = 3; var try int = 0; var rsp bool = calcArea(try, maxTry); if(rsp) { fmt.Println("Ok"); } else { fmt.Println("Erro"); } }
  15. Entendi! Pense em uma "label" como uma espécie de "componente" dentro do seu windows.forms ! Veja este vídeo, ele é básico e objetivo. OBS: Depois que você ver o vídeo e criar a label, basta fazer algo como

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

×
×
  • Criar novo...