PDA

View Full Version : ایراد در ساختار



kitten
دوشنبه 02 دی 1387, 17:45 عصر
سلام دوستان
فرض کنید دم در تالار 1 آقای نگهبان دارای کامپیوتری است. ابتدا استاد وارد
می شود و تعداد دانشجویان را به او می گوید. هر دانشجو که وارد می شود شماره
دانشجویی او را با حرف i و هر که خارج می شود را با حرف o وارد می کند.( به
عنوان مثال i8610463 به معنای ورود دانشجویی با شماره 8610463 است و
o8610463به معنای خروج دانشجویی با شماره 8610463 است )
هرگاه نگهبان بخواهد لیست دانشجویان حاضر در تالار را داشته باشد d را تایپ می
کند. در این صورت *ابتدا اطلاعات **sort** می شود* و سپس در هر خط یک شماره
دانشجویی چاپ می گردد. هرگاه نگهبان بخواهد وضعیت دانشجویی را ببیند شماره
دانشجویی را با f وارد می کند (یعنی f8610463) که اگر دانشجو در تالار باشد i و
اگر بیرون تالار باشد o در یک خط چاپ می شود. اگر e را وارد کند برنامه تمام می
شود.
من این برنامه را نوشتم اما یه مشکل دارم با این که متغیر i بعد از هر حلقه افزایش می دهم اما دوباره عدد در ساختار قبلی جایگذاری می شه و برنامه ایراد داره

#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include <math.h>
int i=0;
struct Student
{
char *number;
int status;
};Student *s;
int StrToInt(char* input)
{
int num=0;
for(int i=0;i<strlen(input);i++)
{
if(input[i]>=48 || input[i]<=57) // if is number
num=num*10+input[i]-48;
}
return num;
}
char *IntToStr(int stdno)
{char *x;
int count=1;
while(stdno>9)
{
stdno=stdno/10;
count ++;
}int p=count;
for(int i=0;i<count;i++,p--)
x[i]=stdno/pow(10,p-1);
return x;
}
int FindStd(struct Student *s,int len,int stdno)
{
char x[20];
int count=1;
int n=stdno;
while(stdno>9)
{
stdno=stdno/10;
count ++;
}int p=count;
for(int h=0;h<count;h++,p--)
{x[h]=n/pow(10,p-1);
n=n % (int)pow(10,p-1);
}x[h]='/0';
int index=-1;
for(int i=0;i<len;i++)
{
if(s[i].number=="")
break;
if(s[i].number==x)
{
index=i;
break;
}
}
return index;
}
void ShowList(struct Student *s,int len)
{

struct Student temp;
for(int i=0;i<len;i++)
{
char * minStNumber;

minStNumber=s[i].number;
int minindex=-1;
for(int j=i;j<len;j++)
{
if(strcmp(minStNumber,s[j].number)<0)
{
minStNumber=s[j].number;
minindex=j;

}
}
if(minindex!=-1)
{
temp.number=s[minindex].number;
temp.status=s[minindex].status;
s[minindex].number=s[i].number;
s[minindex].status=s[i].status;

s[i].number=temp.number;
s[i].status=temp.status;
}
}

for(int k=0;k<len;k++)
{
cout<<s[k].number<<" Status:";
if(s[k].status==1) cout<<"In";
else cout<<"Out";
cout<<endl;
}

}
readData()
{
ifstream fin;
char temp[9];
char n[7];

fin.open("c:\\in.txt");
int num;

fin>>num;
s = new Student[num+1];
while(!fin.eof())
{
fin>>temp;

if(temp[0]!='d') //if was not d
{
strcpy(n,temp+1);



}
if(temp[0]=='i')
{
s[i].status =1;
s[i].number=n;
i++;
}
else if(temp[0]=='o')
{
int y=StrToInt(n);
int index=FindStd(s,num,y);
if(index==-1)
{
cout<<"Error: a student number that not input call to output";
}
s[index].number=n;
}
else if(temp[0]=='f')
{
int z=StrToInt(n);
int index=FindStd(s,num,z);
if(index==-1)
cout<<"o"<<endl;
else
cout<<"i"<<endl;

}

else if(temp[0]=='d')
{
ShowList(s,num);
}






}
fin.close();
}



int main()
{
readData();
return 0;
}
اگه سوالم نامفهومه تابیشتر توضیح بدهم
اینم فایل in.txt

Saeed_m_Farid
جمعه 06 دی 1387, 02:49 صبح
سلام

اگه سوالم نامفهومه تابیشتر توضیح بدهمدوست عزيز، سوالتون مفهومه ولي شما كه دارين با Struct ها كار ميكنين ديگه نبايد از اين اشتباه ها بكنيد!
متغيرهاي global‌ اي كه تعريف كردين (با خيال راحت!) مثل i يا s (كه اينطور نامگذاري درست نيست) بدون رعايت با همون اسامي درون توابعتون هم دارين با همون اسم و ورودي از اين ميغيرها استفاده ميكنيد و خوب بالطبع مشكلات محدوده متغيراتون پيش مياد، بادتون باشه يكي از يزرگترين مشكلات تو پرو‍ژه ها؛ مديريت همين محدوده هاي متغيرهاست، اگه حوصله اصلاح برنامتون رو دارين به اين يه نگاهي بندازيد :


http://www.barnamenevis.org/forum/showpost.php?p=654983&postcount=3
والا حداقل اسامي متغبراتون رو مثلا i_globIndex‌ و g_student بزاريد و واسه اينكه همه جا


struct Student *
نياريد struct رو اينجوري تعريف كنيد و هر جا لازم شد TSTUDENT,(اشاره گر ساختار) PSTUDENT رو استفاده كنيد:


typedef struct _STUDENT{
char *number;
int status;
}TSTUDENT, *PSTUDENT;

متغير سراسري رو هم مثلا اينطوري تعريف كنيد :


PSTUDENT g_student;
ضمنا
1-توابع StrToInt و IntToStr واسه چي؟ ++C كه خودش تابع داره وسشون (مگه اينكه قسمتي از پروژه باشه).
2- منابع سيستم كه مي گيريد رو بايد آزاد كنيد، چون مسئوليتش با شماست و شما از سيستم گرفتينشون و اگه num بزرگ باشه (يا حتي نباشه) به مشكل ميخورين‌: مثلا


delete[] s يا free(s[i].number)
3- نميدونم كد شما چطوري كار ميكنه؟ چون مثلا اينا بنظر اشتباه ميان و شما نميتونين مستقيم = استفاده كنيد و اشاره گر رو به temp اختصاص ميديد و خيلي از اين كارا ...




temp.number=s[minindex].number;
temp.status=s[minindex].status;
s[minindex].number=s[i].number;
s[minindex].status=s[i].status;

s[i].number=temp.number;
s[i].status=temp.status;

emad_67
جمعه 06 دی 1387, 11:08 صبح
اینم فایل in.txtآقا فایل رو نزاشتی که.

متغيرهاي global‌ اي كه تعريف كردين (با خيال راحت!) مثل i يا s (كه اينطور نامگذاري درست نيست) بدون رعايت با همون اسامي درون توابعتون هم دارين با همون اسم و ورودي از اين ميغيرها استفاده ميكنيد و خوب بالطبع مشكلات محدوده متغيراتون پيش مياداین نوع تعریف مشکلی نداره، وقتی متغیری فرضا با نام i به صورت global تعریف میشه و بعد متغیری دیگه ای با نام i و با کلاس حافظه auto در درون بلاکی تعریف کنیم، متغیر دوم در همون بلاک فعال هست و دیگه شما به صورت مستقیم به متغیر global دسترسی نداری مگر با عملگر دسترسی به عضو(::). بنابراین تعریف مشکلی نداره. اما جهت وضوح برنامه بهتره به همون شکلی که شما گفتی نام متغیر ها تعریف بشه.