C 检查并在结构的数组(向量)中插入值

C 检查并在结构的数组(向量)中插入值,c,vector,struct,C,Vector,Struct,所以,我试图在结构的向量中添加一个元素。我要求用户添加数据,但在添加数据之前,我需要检查这3个成员中是否有2个在某些值之间。我必须执行此操作,但当我运行程序时,被检查的成员会被“询问”两次。一次是在检查它们时,然后是在将它们添加到向量时。我想要的是,只有当它们通过验证函数时,才会添加它们。这是我的密码: 即: 输入:2160482 20 Nelson(这将通过验证函数,但按照我的代码编写方式,我必须对“Numero”和“notaffinal”执行两次) #包括 #包括 #定义限制31 #定义最大

所以,我试图在结构的向量中添加一个元素。我要求用户添加数据,但在添加数据之前,我需要检查这3个成员中是否有2个在某些值之间。我必须执行此操作,但当我运行程序时,被检查的成员会被“询问”两次。一次是在检查它们时,然后是在将它们添加到向量时。我想要的是,只有当它们通过验证函数时,才会添加它们。这是我的密码:

即: 输入:2160482 20 Nelson(这将通过验证函数,但按照我的代码编写方式,我必须对“Numero”和“notaffinal”执行两次)

#包括
#包括
#定义限制31
#定义最大值为60
//#定义limite_SUPER 2150001
//定义limite_superior 2169999
类型定义结构
{
整数;
国际非终审法院;
charnome[LIMITE];
}tEstudante;
//测试数据(无效);
int validar_插入(int minimo,int maximo);
内部数据(测试数据值[MAX_ALUNOS],内部数据);
void mostrar_dados_estudante(tEstudante vAlunos[MAX_ALUNOS],int numAlunos);
void alterar_dados_aluno(tEstudante vAlunos[MAX_ALUNOS],int numAlunos);
采购商(测试值[最大值]、努马卢诺斯值、数字);
int菜单();
真空总管(真空)
{
测试值[最大值];
努马卢诺斯国际酒店;
int选项;
//整数;
//int nota;
//夏诺姆;
选项=菜单();
开关(选件)
{
案例1:
printf(“插入式护墙板”);
ler_dados_estudante(瓦卢诺斯、努马卢诺斯);
//nome=validar_insert();
打破
案例2:
printf(“Mostrar dados dos estudantes”);
打破
案例3:
printf(“其他财务事项”);
打破
案例4:
printf(“阿瓦利亚科斯地产”);
打破
案例5:
printf(“Gravar dados em ficheiro”);
打破
案例6:
printf(“Ler dados do ficheiro”);
打破
案例0:
printf(“Sair”);
打破
}
}
int菜单()
{
国际组织;
做
{
printf(“1-嵌入式墙裙设计”);
printf(“\n2-Mostrar dados dos destudantes”);
printf(“\n3-其他财务报表”);
printf(“\n4-资产增值税”);
printf(“\n5-Gravar dados em ficheiro”);
printf(“\n6-Ler dados de ficheiro”);
printf(“\n0-职能指令手册\n”);
printf(“Escolha uma opcao:\n”);
scanf(“%i”和&opcao);
如果(opcao!=1&&opcao!=2&&opcao!=3&&opcao!=4&&opcao!=5&&opcao!=6&&opcao!=0)
printf(“Opcao无效!\n\n”);
}
而(opcao!=1&&opcao!=2&&opcao!=3&&opcao!=4&&opcao!=5&&opcao!=6&&opcao!=0);
返回opcao;
}
int validar_插入(int minimo,int maximo)
{
英勇;
做
{
scanf(“%i”、&valor);
如果(valormaximo)
{
printf(“中间价”);
printf(“\n确认护墙板更新:\n”);
}
其他的
回报勇气;
}
而(valormaximo);
}
内部数据(测试数据值[MAX_ALUNOS],内部数据)
{
整数;
int nota;
夏诺姆;
printf(“Insira o numero do aluno:\n”);
数字=有效数据插入(2150001,2169999);
数值[1]。数值=数值;
printf(“Insira a nota final do aluno:\n”);
nota=有效数据插入(0,20);
vAlunos[1].notaFinal=nota;
printf(“Insira o nome do aluno:\n”);
scanf(“%s”,&vAlunos[1].nome);
//scanf(“%i%i%s”,&vAlunos[1]。numero,&vAlunos[1]。notafail,&vAlunos[1]。nome);
printf(“%i%i%s”,数值[1]。数值,数值[1]。非最终值,数值[1]。nome);
}

缺少代码不好。为了不浪费时间澄清代码的确切上下文,我们需要一个简单的解释。此外,请提供输入、预期输出和确切的实际输出。英语代码(函数名、变量名、字符串文字和注释)可能会使大多数用户更容易阅读,从而增加您实际获得答案的机会。您没有进行外部输入的基本检查,这可能不是你所期望的。始终检查
scanf
系列的返回值-转换的参数数。另外,
%s
的参数不需要有
&
。因此,例如
if(scanf(“%s”,vAlunos[1].nome)!=1){/*回避动作*/}
由于代码不是英文的,所以理解起来有点困难。但问题似乎是因为
validar_insert
中有一个
scanf
,它读取并验证值,但不存储该值。当然,您需要在
ler_dados\u estudante
中再次阅读以存储值。现在,您的编辑使问题变得混乱。您所更改的内容是否修复了原始问题?如果没有,那么现在到底是什么问题?
#include <stdio.h>
#include <stdlib.h>

#define LIMITE 31
#define MAX_ALUNOS 60
//#define limite_inferior 2150001
//define limite_superior 2169999

typedef struct
{
    int numero;
    int notaFinal;
    char nome[LIMITE];
} tEstudante;

//tEstudante ler_dados_estudante(void);
int validar_insert (int minimo, int maximo);
int ler_dados_estudante(tEstudante vAlunos[MAX_ALUNOS], int numAlunos);
void mostrar_dados_estudante(tEstudante vAlunos[MAX_ALUNOS], int numAlunos);
void alterar_dados_aluno (tEstudante vAlunos[MAX_ALUNOS], int numAlunos);
int procurar_aluno(tEstudante vAlunos[MAX_ALUNOS], int numAlunos, int numero_aluno);
int menu();

void main(void)
{
    tEstudante vAlunos[MAX_ALUNOS];

    int numAlunos;
    int option;
    // int numero;
    // int nota;
    // char nome;

    option = menu();

    switch(option)
    {
    case 1:
        printf("Inserir dados\n");
        ler_dados_estudante(vAlunos, numAlunos);
        //nome = validar_insert();
        break;

    case 2:
        printf("Mostrar dados dos estudantes");
        break;

    case 3:
        printf("Alterar notas finais dos estudantes");
        break;

    case 4:
        printf("Estatisticas das avaliacoes");
        break;

    case 5:
        printf("Gravar dados em ficheiro");
        break;

    case 6:
        printf("Ler dados do ficheiro");
        break;

    case 0:
        printf("Sair");
        break;
    }
}

int menu ()
{
    int opcao;

    do
    {
        printf("1 - Inserir dados do estudante");
        printf("\n2 - Mostrar dados dos destudantes");
        printf("\n3 - Alterar notas finais do estudantes");
        printf("\n4 - Estatisticas das avaliacoes");
        printf("\n5 - Gravar dados em ficheiro");
        printf("\n6 - Ler dados de ficheiro");
        printf("\n0 - Fim\n");

        printf("Escolha uma opcao:\n");
        scanf("%i", &opcao);

        if (opcao != 1 && opcao != 2 && opcao != 3 && opcao != 4 && opcao != 5 && opcao != 6 && opcao != 0)
            printf("Opcao invalida !\n\n");
    }
    while (opcao != 1 && opcao != 2 && opcao != 3 && opcao != 4 && opcao != 5 && opcao != 6 && opcao != 0);

    return opcao;
}

int validar_insert (int minimo, int maximo)
{
    int valor;

    do
    {
        scanf("%i", &valor);
        if (valor < minimo || valor > maximo)
        {
            printf("Valor fora do intervalo aceitavel");
            printf("\nInserir dados novamente: \n");
        }

        else
            return valor;
    }
    while (valor < minimo || valor > maximo);
}


int ler_dados_estudante(tEstudante vAlunos[MAX_ALUNOS], int numAlunos)
{

    int numero;
    int nota;
    char nome;

    printf("Insira o numero do aluno: \n");
    numero = validar_insert (2150001, 2169999);
    vAlunos[1].numero = numero;

    printf("Insira a nota final do aluno: \n");
    nota = validar_insert (0, 20);
    vAlunos[1].notaFinal = nota;

    printf("Insira o nome do aluno: \n");
    scanf(" %s", &vAlunos[1].nome);
    //scanf("%i %i %s", &vAlunos[1].numero, &vAlunos[1].notaFinal, &vAlunos[1].nome);

    printf("%i %i %s", vAlunos[1].numero, vAlunos[1].notaFinal, vAlunos[1].nome);

}