C语言 编译文件main()函数第17行时出现“标签只能是语句的一部分”错误[重复]

k5ifujac  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(144)
    • 此问题在此处已有答案**:

Why can we not declare a variable after a switch case colon without using curly braces?(3个答案)
昨天关门了。
我在编译主文件第17行的代码时遇到了问题。错误是"a label can only be part of a statement and a declaration is not a statement"。

#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
#define TAILLE_MAX_NOM 50

// Définition du type Compte
typedef struct {
  int RIB;
  float solde;
  char etat[TAILLE_MAX_NOM];
  float plafond_credit;
  int nb_operations;
  float operations[100];
} Compte;
Compte T_Compte[100];

int menu();
void CreerCompte(Compte *C);
int ChercherCompte(Compte T_Compte[],int NC,int RIB );
void AjouterCompte (Compte T_Compte[], int *NC, Compte C);
float Ajouter_Retirer (Compte T_Compte[], int NC, float M,int RIB);
void ListeComptes(Compte T_Compte[], int NC);
void StatCompte (Compte T_Compte[], int NC, int *PNBA,int *PNBR ,int RIB);
void Prime (Compte T_Compte[], int NC);


#endif // HEADER_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "header.h"

int menu() {
  int choix;

  printf("\n\n                        ->  Menu  <- \n\n");

  printf("         1 - Ajouter un Nouveau Compte \n");
  printf("         2 - Afficher  les comptes de la banque \n");
  printf("         3 - Ajouter une operation a un compte\n");
  printf("         4 - Attribuer une prime aux meilleurs comptes bancaires \n");
  printf("         0 - Quitte\n");
  printf("\n         --------------------------------------\n");
  do {
    printf("            -> Tapez votre choix :   ");
    scanf("%d",&choix);
    printf("\n\n");
  } while (choix>4 || choix<0);
  return choix;
}
void CreerCompte(Compte *C) {
  printf("RIB du compte : ");
  scanf("%d", &C->RIB);
  printf("Solde initial du compte (supérieur ou égal à 50) : ");
  scanf("%f", &C->solde);
  while (C->solde < 50) {
    printf("Le solde initial doit être supérieur ou égal à 50 !\n");
    printf("Solde initial du compte (supérieur ou égal à 50) : ");
    scanf("%f", &C->solde);
  }
  strcpy(C->etat, "debiteur");
  printf("Plafond de crédit du compte (strictement négatif supérieur à -500) : ");
  scanf("%f", &C->plafond_credit);
  while (C->plafond_credit >= 0 || C->plafond_credit <= -500) {
    printf("Le plafond de crédit doit être un montant strictement négatif supérieur à -500 !\n");
    printf("Plafond de crédit du compte (strictement négatif supérieur à -500) : ");
    scanf("%f", &C->plafond_credit);
  }
  C->nb_operations = 0;
}

int ChercherCompte(Compte T_Compte[], int NC, int RIB) {
  for (int i = 0; i < NC; i++) {
    if (T_Compte[i].RIB == RIB) {
      return i;
    }
  }
  return -1;
}
void AjouterCompte(Compte T_Compte[], int *NC, Compte C) {
  if (ChercherCompte(T_Compte, *NC, C.RIB) != -1) {
    printf("Un compte avec ce RIB existe déjà !\n");
    return;
  }
  T_Compte[*NC] = C;
  (*NC)++;
}

float Ajouter_Retirer(Compte T_Compte[], int NC, float M, int RIB) {
  // Vérifie que la somme à ajouter ou retirer est non nulle
  if (M == 0) {
    printf("La somme à ajouter ou retirer ne peut pas être nulle !\n");
    return -1;
  }
  // Cherche le compte dans le tableau
  int pos = ChercherCompte(T_Compte, NC, RIB);
  // Vérifie que le compte existe
  if (pos == -1) {
    printf("Le compte avec le RIB spécifié n'existe pas !\n");
    return -1;
  }
  Compte C = T_Compte[pos];
  // Vérifie que l'opération de retrait peut être effectuée
  if (M < 0 && (C.solde + M < -C.plafond_credit)) {
    printf("Opération de retrait impossible !\n");
    return -1;
  }
  // Effectue l'opération
  C.solde += M;
  C.nb_operations++;
  T_Compte[pos] = C;
  return C.solde;
}

void ListeComptes(Compte T_Compte[], int NC) {
  printf("Liste des comptes de la banque :\n");
  for (int i = 0; i < NC; i++) {
    Compte C = T_Compte[i];
    printf("RIB : %d, Solde : %.2f, Etat : %s, Plafond de crédit : %.2f, Nombre d'opérations : %d\n",
           C.RIB, C.solde, C.etat, C.plafond_credit, C.nb_operations);
  }
}void StatCompte(Compte T_Compte[], int NC, int *PNBA, int *PNBR, int RIB) {
  // Initialise les compteurs à 0
  *PNBA = 0;
  *PNBR = 0;
  // Cherche le compte dans le tableau
  int pos = ChercherCompte(T_Compte, NC, RIB);
  if (pos == -1) {
    printf("Le compte avec ce RIB n'existe pas !\n");
    return;
  }
  // Parcours les opérations du compte
  Compte C = T_Compte[pos];
  for (int i = 0; i < C.nb_operations; i++) {
    if (C.operations[i] > 0) {
      (*PNBA)++;
    } else if (C.operations[i] < 0) {
      (*PNBR)++;
    }
  }
}

void Prime(Compte T_Compte[], int NC) {
  printf("Attribution de la prime aux meilleurs comptes de la banque :\n");
  for (int i = 0; i < NC; i++) {
    Compte C = T_Compte[i];
    // Vérifie que le compte est débiteur
    if (strcmp(C.etat, "debiteur") == 0) {
      int nb_ajout = 0;
      int nb_retrait = 0;
      // Parcours les opérations du compte pour compter le nombre d'opérations d'ajout et de retrait
      for (int j = 0; j < C.nb_operations; j++) {
        if (C.operations[j] > 0) {
          nb_ajout++;
        } else if (C.operations[j] < 0) {
          nb_retrait++;
        }
      }
      // Vérifie que le nombre d'opérations d'ajout est supérieur aux nombres d'opérations de retrait
      if (nb_ajout > nb_retrait) {
        float prime = (C.solde / C.nb_operations) * 0.5;
        printf("RIB : %d - Prime : %.2f\n", C.RIB, prime);
      }
    }
  }
}
//source file/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "header.h"

int main() {
  // Initialize the array of accounts
  int NC = 0;

  // Display the menu and get the user's choice
  int choix = menu();

  while (choix != 0) {
    switch (choix) {
      case 1:

        Compte C;
        getchar();
        CreerCompte(&C);
        AjouterCompte(T_Compte, &NC, C);
        break;
      case 2:
        // Display the accounts
        ListeComptes(T_Compte, NC);
        break;
      case 3:
        // Add or remove money from an account
        printf("RIB du compte : ");
        int RIB;
        scanf("%d", &RIB);
        printf("Somme à ajouter ou retirer : ");
        float M;
        scanf("%f", &M);
        float solde = Ajouter_Retirer(T_Compte, NC, M, RIB);
        if (solde != -1) {
          printf("Nouveau solde : %.2f\n", solde);
        }
        break;
      case 4:
        // Attribute a prize to the best accounts
        Prime(T_Compte, NC);
        break;
    }

    // Display the menu and get the user's choice again
    choix = menu();
  }

  printf("Au revoir !\n");
  return 0;
}

以下是使用4个开关执行以下功能的主要功能:

  • 添加新帐户
  • 显示银行的帐户
  • 向帐户添加操作
  • 给最好的帐目颁奖
6gpjuf90

6gpjuf901#

这是17号线吗?

Compte C;

如果是这样,你需要定义变量C的作用域,将case 1:处理程序修改为:

case 1:
{
    Compte C;
    getchar();
    CreerCompte(&C);
    AjouterCompte(T_Compte, &NC, C);
    break;
}

相关问题