我在执行程序时遇到问题,无需使用文件即可管理结构。它似乎正确编译。有执行问题 当我多次执行插入功能(saisir)时。当我删除所有结构实例时,打印功能(afficher)打印出一个实例仍然存在,内容奇怪。
这是代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct { char nom[20];
char prenom[20];
int age;
float salaire ;
}emp;
emp * saisir (emp*,int*) ;
void afficher (emp*,int*) ;
int chercher (emp*,int*) ;
void supprimer (emp*,int*) ;
void trier_nom (emp*,int*) ;
void trier_age(emp*,int*);
emp *tab;
int n=0;
int *p=&n;
main()
{
char test;
do {
printf("\n ### Bienvenu dans votre programme ###");
printf("\n # Pour Saisir appuyer sur S #");
printf("\n # Pour Afficher appuyer sur A #");
printf("\n # Pour Chercher appuyer sur C #");
printf("\n # Pour Supprimer appuyer sur D #");
printf("\n # Pour Trier par nom appuyer sur N #");
printf("\n # Pour Trier par age appuyer sur G #");
printf("\n # Pour Quitter appuyer sur Q #");
printf("\n ##############################################\n\n\n");
test=getch();
switch(test)
{
case 'S' : tab=saisir(tab,p) ; break ;
case 'A' : afficher(tab,p) ; break ;
case 'C' : chercher(tab,p) ; break ;
case 'D' : supprimer(tab,p) ; break ;
case 'N' : trier_nom(tab,p) ; break ;
case 'G' : trier_age(tab,p) ; break ;
case 'Q' : printf("\n Merci pour votre visite"); break ;
default : printf("\n\n\n\n\n choix errone ! verifier que les lettres en majuscule !!") ;
}
printf("\n\n\n\n Appuyer sur une touche pour continuer !");
getch();
system("cls"); /* Efface l'écran */
} while (test !='Q');
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de saisie : */
emp *saisir(emp *t, int *m )
{
int i,s;
printf("\n Donner le nombre des employes a ajouter : ");
scanf("%d",&s);
t=(emp*) malloc(sizeof(emp));
for (i=*m;i<*m+s;i++)
{
printf ("\n\n\n donner les info de %d eme employe \n" ,i+1);
printf ("\n le nom : ") ;
scanf("%s",(t+i)->nom);
printf ("\n le prenom : ") ;
scanf("%s",(t+i)->prenom);
printf ("\n l \' age : ") ;
scanf ("%d",&(t+i)->age);
printf ("\n le salaire : ") ;
scanf ("%f",&(t+i)->salaire);
}
*m=*m + s ;
return t;
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction d'affichage : */
void afficher (emp *t, int *m)
{
int i;
if (*m==0)
printf("\n\n\n Liste vide !!");
else
for (i=0;i<*m;i++)
{
printf("\n les information du %d eme employe :",i+1 );
printf("\n \t Nom :%s",(t+i)->nom);
printf("\n \t Prenom :%s",(t+i)->prenom);
printf("\n \t Age :%d",(t+i)->age);
printf("\n \t Salaire :%.2f",(t+i)->salaire);
}
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de recherche : */
int chercher (emp*t,int *m )
{
int i ,posi=-1 ; char cher [20] ;
printf("\n\n\n Donner moi le nom a chercher :\n\n ");
scanf ("%s",cher);
for (i=0;i<*m;i++)
if (strcmp((t+i)->nom,cher) == 0)
{
posi=i; break;
}
if(posi==-1)
printf("\n\n\n le nom n\'existe pas parmi les employes !!!");
else
{
printf("\n \t L\' employe ayant le nom %s existe et voici ces informations : ",cher) ;
printf("\n \t Nom :%s",(t+posi)->nom);
printf("\n \t Prenom :%s",(t+posi)->prenom);
printf("\n \t Age :%d",(t+posi)->age);
printf("\n \t Salaire :%.2f",(t+posi)->salaire);
}
return posi;
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de suppression : */
void supprimer (emp*t,int *m)
{
int i,pos;
pos=chercher (t,m);
if(pos!=-1)
{
for (i=pos;i<*m;i++)
*(t+i)=*(t+(i+1));
*m-- ;
printf("\n\n\n Employe supprime avec succes !!!");
}
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de triage par Nom : */
void trier_nom (emp*t,int *m )
{
int i ,min ,j ;
emp temp ;
for (i=0 ; i<*m-1;i++)
{
min = i ;
for (j=i+1;j<*m;j++)
if (strcmp ((t+i)->nom,(t+j)->nom) >0 )
{
min =j ;
temp = *(t+i);
*(t+i) = *(t+j) ;
*(t+j)=temp ;
}
}
printf("\n\n\n Tri par nom effectue avec succes !!!");
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de triage par Age : */
void trier_age (emp*t,int *m )
{
int i ,min ,j ;
emp temp ;
for (i=0 ; i<*m-1;i++)
{
min = i ;
for (j=i+1;j<*m;j++)
if ((t+i)->age>(t+j)->age )
{
min =j ;
temp = *(t+i);
*(t+i) = *(t+j) ;
*(t+j)=temp ;
}
}
printf("\n\n\n Tri par age effectue avec succes !!!");
}
答案 0 :(得分:1)
- 警告:返回类型默认为int
- 函数getch()仅在Windows系统中可用
suggest using getchar() which returns an int, not a char
so could also check for EOF and certain I/O failures
Note: getch() is prototyped in conio.h,
however, the code is missing the line: $include <conio.h>
- 执行到达非void函数的结尾而没有'return'语句
在函数supprimer()
中- 这一行:'* m--;'计算未使用的值
在函数trier_non()
中- 变量'min'设置但未使用
在函数trier_age()
中- 变量'min'设置但未使用
当程序无法编译时,调试程序非常困难
答案 1 :(得分:0)
更改您的saisir
功能如下,这应该适合您。在这段代码中,我只纠正了你malloc
,以便重新分配数组,并根据先前的大小加上新的大小更正分配大小,并且我没有添加对数组超出范围的错误的检查......所以这段代码不安全。
emp *saisir(emp *t, int *m)
{
int i, s;
printf("\n Donner le nombre des employes a ajouter : ");
scanf("%d", &s);
t = realloc(t, (*m + s) * sizeof(emp));
if (!t) {
exit(1);
}
for (i = *m; i < *m + s; i++)
{
printf("\n\n\n donner les info de %d eme employe \n" , i + 1);
printf("\n le nom : ") ;
scanf("%s", (t + i)->nom);
printf("\n le prenom : ") ;
scanf("%s",(t + i)->prenom);
printf ("\n l \' age : ") ;
scanf ("%d", &(t + i)->age);
printf ("\n le salaire : ") ;
scanf ("%f", &(t + i)->salaire);
}
*m = *m + s ;
return t;
}
如果您想使用m
降低功能trier_non()
中*m--
的值,则必须将其更改为(*m)--
。
答案 2 :(得分:0)
感谢每一个人,最后我找到了插入“SAISIR”功能的主要问题的解决方案,问题是关于分配内存我使用malloc和realloc来解决问题!这是工作代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <conio.h>
typedef struct { char nom[20];
char prenom[20];
int age;
float salaire ;
}emp;
emp * saisir (emp*,int*) ;
void afficher (emp*,int*) ;
int chercher (emp*,int*) ;
void supprimer (emp*,int*) ;
void trier_nom (emp*,int*) ;
void trier_age(emp*,int*);
emp *tab;
int n=0;
int *p=&n;
void main()
{
char test;
do {
printf("\n ### Bienvenu dans votre programme ###");
printf("\n # Pour Saisir appuyer sur S #");
printf("\n # Pour Afficher appuyer sur A #");
printf("\n # Pour Chercher appuyer sur C #");
printf("\n # Pour Supprimer appuyer sur D #");
printf("\n # Pour Trier par nom appuyer sur N #");
printf("\n # Pour Trier par age appuyer sur G #");
printf("\n # Pour Quitter appuyer sur Q #");
printf("\n ##############################################\n\n\n");
test=getchar();
system("cls");
switch(test)
{
case 'S' : tab=saisir(tab,p) ; break ;
case 'A' : afficher(tab,p) ; break ;
case 'C' : chercher(tab,p) ; break ;
case 'D' : supprimer(tab,p) ; break ;
case 'N' : trier_nom(tab,p) ; break ;
case 'G' : trier_age(tab,p) ; break ;
case 'Q' : printf("\n Merci pour votre visite\n\n\n"); break ;
default : printf("\n\n\n\n\n choix errone ! verifier que les lettres en majuscule !!\n\n\n") ;break;
}
system("PAUSE");
system("cls"); /* Efface l'écran */
} while (test !='Q');
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de saisie : */
emp *saisir(emp *t, int *m)
{
int i,j, s;
printf("\n Donner le nombre des employes a ajouter : ");
scanf("%d", &s);
if ((*m)==0) t = malloc (sizeof(emp));
i=*m;
j=0;
do {
printf("\n\n\n donner les info de %d eme employe \n" , i + 1);
printf("\n le nom : ") ;
scanf("%s",(t+i)->nom);
printf("\n le prenom : ") ;
scanf("%s",(t+i)->prenom);
printf ("\n l \' age : ") ;
scanf ("%d",&(t+i)->age);
printf ("\n le salaire : ") ;
scanf ("%f",&(t+i)->salaire);
(*m)++;
t = realloc(t,(*m+1)* sizeof(emp));
i++;
j++;
} while ( j<s);
return t;
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction d'affichage : */
void afficher (emp *t, int *m)
{
int i;
if (*m==0) printf("\n\n\n Liste vide !!\n\n\n"); else
for (i=0;i<*m;i++)
{
printf("\n les information du %d eme employe :",i+1 );
printf("\n \t Nom :%s",(t+i)->nom);
printf("\n \t Prenom :%s",(t+i)->prenom);
printf("\n \t Age :%d",(t+i)->age);
printf("\n \t Salaire :%.2f",(t+i)->salaire);
printf("\n\n\n\n\n");
}
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de recherche : */
int chercher (emp*t,int *m )
{
int i ,posi=-1 ; char cher [20] ;
printf("\n\n\n Donner moi le nom a chercher :\n\n ");
scanf ("%s",cher);
for (i=0;i<*m;i++)
if (strcmp((t+i)->nom,cher) == 0)
{
posi=i;
break;
}
if(posi==-1)
printf("\n\n\n le nom n\'existe pas parmi les employes !!!\n\n\n");
else {
printf("\n \t L\' employe ayant le nom %s existe et voici ces informations : ",cher) ;
printf("\n \t Nom :%s",(t+posi)->nom);
printf("\n \t Prenom :%s",(t+posi)->prenom);
printf("\n \t Age :%d",(t+posi)->age);
printf("\n \t Salaire :%.2f",(t+posi)->salaire);
printf("\n\n\n");
}
return posi;
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de suppression : */
void supprimer (emp*t,int *m)
{int i,pos;
pos=chercher (t,m);
if(pos!=-1)
{
for (i=pos;i<*m;i++)
*(t+i)=*(t+(i+1));
(*m)-- ;
printf("\n\n\n Employe supprime avec succes !!!\n\n\n");
}
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de triage par Nom : */
void trier_nom (emp*t,int *m )
{
int i ,min ,j ;
emp temp ;
for (i=0 ; i<*m-1;i++)
{
min = i ;
for (j=i+1;j<*m;j++)
if (strcmp ((t+i)->nom,(t+j)->nom) >0 )
{
min =j ;
temp = *(t+i);
*(t+i) = *(t+j) ;
*(t+j)=temp ;
}
}
printf("\n\n\n Tri par nom effectue avec succes !!!\n\n\n");
}
/* -------------------------------------------------------------------------------------------------------------------*/
/* Fonction de triage par Age : */
void trier_age (emp*t,int *m )
{
int i ,min ,j ;
emp temp ;
for (i=0 ; i<*m-1;i++)
{
min = i ;
for (j=i+1;j<*m;j++)
if ((t+i)->age>(t+j)->age )
{
min =j ;
temp = *(t+i);
*(t+i) = *(t+j) ;
*(t+j)=temp ;
}
}
printf("\n\n\n Tri par age effectue avec succes !!!\n\n\n");
}