добавить новый элемент в массив структуры в c - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу написать программу на c, которая будет управлять массивом структуры, банковским счетом с 3 атрибутами: 1 -номер счета, 2 -счет баланса и 3 - владелец учетной записи.

я хочу написать функцию:

  • , которая добавляет новую учетную запись всякий раз, когда пользователь нажимает «a»,
  • пользователь должен ввести баланс и имя владельца, но номер счета должен назначаться автоматически и увеличиваться при создании новой учетной записи.

Это мой код до сих пор:

#include <stdio.h>

struct bancaccount {
  int num;
  double balance;
  char owner;
};

void maintext(); //prototype of the function that print the main text
void addaccount();

void main(void) {
  struct bankaccount account[50];

  maintext();

  char ch;
  ch = getchar();

  if (ch == 'a') {
    addaccount();
    maintext();
  }

  else if (ch == 'b') {
    printf("Result: show");
  }

  else {
    printf("another key was pressed ");
  }

}

void maintext() {
  printf("tap one of this keys : \n"
         " a : to add a new account \n"
         " b : to see all accounts\n");
}

void addaccount(struct comptebanc num) {
  num++; //this seems not possible it gives an error, what should i do insteed 
  num = num; 
  printf("owner name : ");
  scanf("%s", account.owner);
  print("balance : ");
  scanf("%lf", account.balance);

  printf("\n\n");
  printf("Num : %d\n", account.num);
  printf("Prop : %s\n", account.owner);
  printf("Solde : %lf\n", account.balance);
}

Как я могу присвоить номер каждой новой учетной записи?и как я могу сохранить новый элемент в массиве структуры?спасибо за вашу помощь.

Я все еще новичок, поэтому я уверен, что допустил некоторые ошибки в основных принципах.

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Вот еще одно рабочее решение, основанное на вашем коде.Но я использую функцию scanf_s вместо scanf в этом примере.

#include <stdio.h>

struct bancaccount {
    int num;
    double balance;
    char owner[64];
};

struct bancaccount accounts[10];
int account_id = 0;

void maintext(void)
{
    printf("tap one of this keys : \r\n"
        " a : to add a new account \r\n"
        " b : to see all accounts\r\n");
}

void add_account(void)
{
    accounts[account_id].num = account_id + 1;
    printf("owner name : ");
    scanf_s("%63s", &accounts[account_id].owner, 64);
    printf("balance : ");
    scanf_s("%lf", &accounts[account_id].balance);

    printf("\r\n\r\n");
    printf("Num : %d\r\n", accounts[account_id].num);
    printf("Prop : %s\r\n", accounts[account_id].owner);
    printf("Solde : %lf\r\n", accounts[account_id].balance);
    account_id++;
}

void print_accounts(void)
{
    int i;

    for (i = 0; i < account_id; i++) {
        printf("Num : %d\r\n", accounts[i].num);
        printf("Prop : %s\r\n", accounts[i].owner);
        printf("Solde : %lf\r\n", accounts[i].balance);
        printf("\r\n");
    }       
}

int main(int argc, char *argv[])
{
    char c;

    maintext();

    while (1) {
        c = getchar();

        switch (c) {
        case 'a':
            add_account();
            getchar(); /* consume '\n' */
            break;
        case 'b':
            print_accounts();
            getchar(); /* consume '\n' */
            break;
        case 'q':
            return 0;
        default:
            printf("another key was pressed\r\n");
        }
    }

    return 0;
}
0 голосов
/ 30 декабря 2018

Вот как вы можете это сделать.

#include <stdio.h>

typedef struct {
  int num;
  double balance;
  char owner[15];
} bankaccount;

int main() {
  int numAllocated = 0; // Number of accounts allocated
  bankaccount accounts[50];

  int ch;
  printf("\"a\": to add new account\n\"b\": to print all accounts\n");

  void addAccount (bankaccount *, int);
  void printAccounts (bankaccount *, int);
  for ( ;; ) {
    ch = getchar();
    if (ch == '\n' ) continue;
    else if (ch == 'a') {
      addAccount(accounts, numAllocated);
      numAllocated++;
    }
    else if (ch == 'b') printAccounts(accounts, numAllocated);
    else break;
    printf("\"a\": to add new account\n\"b\": to print all accounts\n");
 }
}

void addAccount (bankaccount *account, int num) {
  account[num].num = num + 1;
  printf("Owner's name: ");
  scanf("%s", account[num].owner);
  printf("Balance: ");
  scanf("%lf", &account[num].balance);
}

void printAccounts (bankaccount *accounts, int num) {
  if (num > 0) {
    for (int i = 0; i < num; i++) {
      printf("\n%-10s%d\n", "Acc#:", accounts[i].num);
      printf("%-10s%s\n", "Name:", accounts[i].owner);
      printf("%-10s%.2f\n", "Balance:", accounts[i].balance);
    }
  }
  else printf("No account allocated yet\n");
}

Я прошел ваш пример кода.Хотя вы можете сделать это лучше, читая о динамической памяти, указателях и, возможно, связанном списке, чтобы сделать свой список учетных записей и поле владельца структуры struct dynamic.Но вот начало и надеюсь, что вы можете взять его отсюда!

0 голосов
/ 29 декабря 2018

Тег динамического массива довольно запутанный, поскольку у вас есть только статические.

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

typedef struct {
  int num;
  double balance;
  char *owner;
} bancaccount;

size_t Naccounts = 0;
bancaccount *accounts = NULL;

bancaccount addaccount(int num, double ballance, char *owner)
{
    bancaccount *tmp = realloc(accounts, ++Naccounts * sizeof(*tmp));

    if(tmp)
    {
        accounts = tmp;
        tmp[Naccounts - 1].owner = malloc(strlen(owner) + 1);
        if([Naccounts - 1].owner)
        {
            strcpy(tmp[Naccounts - 1].owner, owner);
            tmp[Naccounts - 1].balance = ballance;
            tmp[Naccounts - 1].num = num;
        }
    }
    return tmp;
}
...