Você está aqui: C ::: Dicas & Truques ::: Struct (Estruturas, Registros)

Passando uma estrutura (struct) para uma função (com e sem o uso de ponteiros)

Quantidade de visualizações: 14955 vezes
Muitas vezes precisamos fornecer uma estrutura para uma função. Isso pode ser feito de várias formas, cada uma possuindo características particulares.

No trecho de código abaixo nós temos uma função exibir_dados() que recebe uma estrutura e exibe os valores de seus membros. Veja:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// define a estrutura Livro
struct Livro{
  char *titulo;
  int codigo;
  int paginas;
};

// método que exibe os dados da estrutura Livro
void exibir_dados(struct Livro livro){
  // exibe os dados do livro
  printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n",
    livro.titulo, livro.codigo, livro.paginas);
}

int main(int argc, char *argv[]){
  // cria uma instância da estrutura Livro
  Livro a;

  // preenche os dados do Livro
  a.titulo = "Programando em Java";
  a.codigo = 342;
  a.paginas = 230;

  // passa a estrutura Livro para um método exibir_dados
  exibir_dados(a);

  puts("\n\n");
  system("PAUSE");
  return 0;
}

Este código, embora funcional, possui duas desvantagens. A primeira é que a estrutura inteira está sendo passada para a função, e isso pode prejudicar o desempenho do programa, devido ao uso desnecessário de recursos. A segunda é que qualquer modificação que fizermos, dentro da função, nos valores dos membros da estrutura não terão qualquer efeito na estrutura original. E isso é compreensível, visto que estamos passando uma cópia da estrutura. Qual a solução? Uso de ponteiros. Veja uma nova versão do código:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdlib.h>
#include <string.h>

// define a estrutura Livro
struct Livro{
  char *titulo;
  int codigo;
  int paginas;
};

// método que exibe os dados da estrutura Livro
void exibir_dados(struct Livro *livro){
  // exibe os dados do livro
  printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n",
    livro->titulo, livro->codigo, livro->paginas);
}

int main(int argc, char *argv[]){
  // cria uma instância da estrutura Livro
  Livro a;

  // preenche os dados do Livro
  a.titulo = "Programando em Java";
  a.codigo = 342;
  a.paginas = 230;

  // passa a estrutura Livro para um método exibir_dados
  exibir_dados(&a);

  puts("\n\n");
  system("PAUSE");
  return 0;
}

Agora sim. Em vez de passarmos uma cópia da estrutura nós estamos passando apenas seu endereço de memória para a função que exibe os dados. E o melhor, se qualquer alteração nos valores do membros da estrutura for efetuada dentro da função, o resultado será imediatamente visto na estrutura original. Mas, existe uma forma de passar o endereço da estrutura mas evitar que os valores de seus membros sejam alterados dentro da função? Claro que sim! Basta usarmos o modificador const na assinatura da função (antes do nome da variável ponteiro). Veja:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// método que exibe os dados da estrutura Livro
void exibir_dados(struct Livro const *livro){
  // exibe os dados do livro
  printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n",
    livro->titulo, livro->codigo, livro->paginas);
}

Se tentarmos alterar o valor de alguns dos membros da estrutura dentro da função teremos uma mensagem de erro de compilação. No Dev-C++ (usando MingW) esta mensagem é:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

assignment of data-member `Livro::titulo` in 
read-only structure 

Lembre-se que aqui nós temos um PONTEIRO PARA UMA CONSTANTE:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

Livro const *livro

Isso quer dizer que o ponteiro pode apontar para outro local mas o objeto para o qual ele aponta no momento não poderá sofrer modificações.

Link para compartilhar na Internet ou com seus amigos:

C ::: Dicas & Truques ::: Strings e Caracteres

Como criar sua própria função substring() para obter uma substring a partir de uma string em C

Quantidade de visualizações: 16846 vezes
Em algumas situações precisamos obter uma substring a partir de uma string. A linguagem C já fornece algumas funções que tornam isso possível. No entanto, nenhuma destas funções permite especificar o índice inicial da substring. Sendo assim, o trecho de código abaixo mostra como escrever uma função substring() que permite informar a string de origem, o índice inicial e a quantidade de caracteres que serão obtidos. O retorno da função será um ponteiro para a substring obtida:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *substring(char *origem, int inicio, int quant){
  char *res = origem;
  int i = 0;

  // posição inicial menor que 0 ou
  // posição inicial muito exagerada?
  if((inicio < 0) || (inicio > strlen(origem)))
    inicio = 0;

  // quantidade de caracteres muito exagerada?
  if(quant > inicio + strlen(origem))
    quant = strlen(origem) - inicio;

  // obtem os caracteres desejados
  for(i = 0; i <= quant - 1; i++){
    res[i] = origem[inicio + i];
  }

  // marca o fim da string
  res[i] = '\0';

  return res;
}

int main(int argc, char *argv[])
{
  char texto[] = "Gosto muito de C e C++";
  
  // não podemos bagunçar a string original
  char sub_temp[128];
  strcpy(sub_temp, texto);
  // 10 caracteres começando
  // no índice 6
  char *res = substring(sub_temp, 6, 10);

  // exibe o resultado
  puts(res);

  // exibe a string original
  puts(texto);

  system("pause");
  return 0;
}

Ao executar este código nós teremos o seguinte resultado:

muito de C
Gosto muito de C e C++


C ::: Dicas & Truques ::: Matemática e Estatística

Como calcular porcentagem em C - Como efetuar cálculos de porcentagem em C

Quantidade de visualizações: 28476 vezes
Cálculos de porcentagens estão presentes em boa parte das aplicações que desenvolvemos. Porém, há momentos em que a mente trava e não conseguimos lembrar com clareza como estes cálculos são feitos, principalmente em C.

Esta anotação tem o objetivo de ser uma fonte de pesquisa para os momentos em que suas habilidades matemáticas insistirem em continuar ocultas.

Ex: 1 - Suponhamos que um produto que custe R$ 178,00 sofra um acréscimo de 15%. Qual o valor final do produto? Veja o código em C:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// Algoritmo que calcula porcentagem em C
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  // variáveis usadas na resolução do problema
  float valor, percentual, valor_final;

  valor = 178.00; // valor original
  percentual = 15.0 / 100.0; // 15%
  valor_final = valor + (percentual * valor);

  // mostra o resultado
  printf("O valor final do produto é: %f", valor_final);

  // O resultado será 204,70
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ex: 2 - Um produto, cujo valor original era de R$ 250,00, teve um desconto de 8%. Qual foi seu valor final? Veja o código em C:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// Algoritmo que calcula porcentagem em C
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  // variáveis usadas na resolução do problema
  float valor, percentual, valor_final;

  valor = 250.00; // valor original
  percentual = 8.0 / 100.0; // 8%
  valor_final = valor - (percentual * valor);

  // mostra o resultado
  printf("O valor final do produto é: %f", valor_final);
  
  // O resultado será 230,00
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ex: 3 - Em um concurso de perguntas e respostas, um jovem acertou 72 das 90 perguntas apresentadas. Qual foi a porcentagem de acertos? E a porcentagem de erros? Veja o código em C:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// Algoritmo que calcula porcentagem em C
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  // variáveis usadas na resolução do problema
  float perguntas, acertos;

  perguntas = 90.0;
  acertos = 72.0;

  // mostra a porcentagem de acertos
  printf("Porcentagem de acertos: %f%%", ((acertos / perguntas) * 100));

  // mostra a porcentagem de erros
  printf("\nPorcentagem de erros: %f%%", ((perguntas - acertos) / perguntas) * 100);

  // Os resultados serão 80% e 20%

  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ex: 4 - Um aparelho de CD foi adquirido por R$ 300,00 e revendido por R$ 340,00. Qual foi a porcentagem de lucro na transação? Veja o código em C:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// Algoritmo que calcula porcentagem em C
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  // variáveis usadas na resolução do problema
  float valor_anterior, novo_valor, porcentagem_lucro;

  valor_anterior = 300.0; // valor anterior
  novo_valor = 340.0; // valor novo

  // calcula a porcentagem de lucro
  // efetua o cálculo
  porcentagem_lucro = ((novo_valor * 100) / valor_anterior) - 100;

  printf("A porcentagem de lucro foi de: %f%%", porcentagem_lucro);

  // O resultado será 13,33

  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ex: 5 - Uma loja repassa 5% do lucro a seus vendedores. Se um produto custa R$ 70,00, qual o valor em reais repassado a um determinado vendedor? Veja o código em C:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// Algoritmo que calcula porcentagem em C
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  // variáveis usadas na resolução do problema
  float valor, percentual, comissao;

  valor = 70.0; // valor do produto
  percentual = 5.0 / 100.0; // 5%

  // calcula a comissão
  comissao = percentual * valor;

  // mostra o resultado
  printf("O valor repassado ao vendedor é: %f", comissao);

  // O resultado será 3,5

  printf("\n\n");
  system("PAUSE");
  return 0;
}



C ::: Dicas & Truques ::: Arquivos e Diretórios

Como excluir arquivos em C usando a função remove()

Quantidade de visualizações: 19177 vezes
A função remove(), disponível no header stdio.h, pode ser usada para excluir arquivos. Veja sua assinatura:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

int remove(const char *filename);

Veja que esta função recebe o caminho e nome do arquivo a ser excluído e retorna um valor inteiro. Se o arquivo for excluído com sucesso, o valor 0 será retornado. Veja um exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  // nome do arquivo a ser excluído
  char *arquivo = "c:\\testes.txt";

  // vamos excluir
  if(remove(arquivo) == 0)
    printf("Arquivo foi excluido com sucesso.");
  else
    printf("Nao foi possivel excluir o arquivo.");

  printf("\n\n");
  system("PAUSE");
  return 0;
}



Desafios, Exercícios e Algoritmos Resolvidos de C

Veja mais Dicas e truques de C

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 24 usuários muito felizes estudando em nosso site.