PDA

View Full Version : سوال: پیدا کردن structure ای در فایل



hafez1
چهارشنبه 06 اردیبهشت 1391, 23:00 عصر
:متفکر:
من قبلا این سوال رو با عنوان کلاس پرسیدم ولی کسی جوابمو نداد.سوال این جوریه:
یه دانشکده داریم شامل گرده های ITو برق و میکانیک و....که هر یک از این گروه ها شامل اساتیدی هستند.
اطلاعات مربوط به این اساتید درون یک فایل در اختیار برنامه قرار می گیرد.
برنامه باید قابلیت جست وجوی اساتید بر اساس نام وفامیل یا کد پرسنلی وقابلیت حذف و افزودن استاد و حذف و افزودن گروه را داشته باشد.
من اول سه تا استراکچر تعریف کردم.1-برای استاد2-برای گروه ها 3- برای برای دانشکده.
بعد اومدم فایل رو که شامل نام ونام خانوادگی و کد پرسنلی و نام گروه مربوطه و کد گروه و سمت استاد هست رو خوندم.با توجه به این که نوعشون فرق می کرد توی شش تا آرایه جدا ریختم.نمی دونم درست این کارو کردم یا نه؟
در ضمن من توی نوشتن توابعش خیلی مشکل دارم.اصلا بلد نستم که چی جوری باید استادو پیداکنم یا حذف کنم یا اضافه کنم و....لطفا کدمو بخونی و اشکالامو بهم بگید.
include<iostream>-1
include <fstream>-2
include<stdio.h>-3
include<string.h>-4
using namespace std;-5
int main()-6
7-{
struct prof-8
9-{
char firstname[34];-10
char lastname[20];-11
char position;-12
int personalCod;-13
int groupdepartmentNumber;-14
prof *next;-15
prof *privew; -16
17-};
struct group-18
19-{
char groupname[34];-20
int groupNumber;-21
group *next;-22
group *privew;-23
prof *first;-24
25-};
struct colleg-26
27 {
char name[34];-28
int collegNumber;-29
group *first;-30
31-};
char firstname , lastname , group , position;-32
int personalcode , groupnumber;-33
int nRow=0;-34
ifstream inputFile;-35
inputFile.open("route.txt");-36
if(!inputFile){-37
cerr << "Input file route.txt could not be opened\n";-38
exit(1);-39
40-}
while(!inputFile.eof())-41
42-{
nRow++;-43
inputfile >> firstname >> lastname >> personalcode >> group >> groupnumber >> position;-44
45-}
firstname= char array[1]-46
lastname= char array[2]-47
personalcode= int array[3]-48
group= char array[4]-49
groupnumber= int array[5]-50
position= char array [6]-51
int k;-52
cout<<" please chose the number of your order=k\n\n"-53
54-<<"1-add a group\n\n"
55-<<"2-delete a group\n\n"
56-<<"3-add a prof\n\n"
57-<<"4-delete a prof\n\n"
58-<<"5-search a prof with name\n\n"
59-<<"6-search a prof with personalcode\n\n"
60-<<"7-count the groups\n\n"
61-<<"8-count the prof\n\n;";
cin>>k;-62
در ضمن اونی که با کلاسا نوشتمش با عنوان class ذخیره شده.به هر روشی که بلد هستید بهم جواب بدید.ممنون می شم.:لبخندساده:

Hossenbor
پنج شنبه 07 اردیبهشت 1391, 09:37 صبح
دسته من باید یک مقدار هم داشته باشید که نوع اونا رو مشخص کنه که برای مثال استاده یا گروهه و ... بعد شما این مقدار رو بررسی می کنی که میفهمی استاده بعد میتونی اقدام به حذفش کنی یک نوع مثل ENUM باشه به نظرم بهتره درسته همینطوره؟

hafez1
پنج شنبه 07 اردیبهشت 1391, 09:50 صبح
ببخشید من متوجه جوابتون نشدم می شه یکم بیشتر توضیح بدید.ممنون می شم

hafez1
پنج شنبه 07 اردیبهشت 1391, 10:03 صبح
در ضمن من این برنامه رو باclass هم نوشتم .توی پست هام کداش هست. ولی تو هر دوتاش گیر می کنم.
برای اینی که با استراکچر نوشتم یه سری کد دیگه بش اضافه کردم که تعداد کل اساتید رو می شمره و نامشونو چاپ می کنه و تعداد گروها رو می شمره و نام اساتید هر گروهو چاپ می کنه.کداش پایین هست. نمی دونم درسه یا نه. من برای پیدا کردن استادا وحذف و اضافه کردنشون و... خیلی مشکل دارم. لطفا راهنمایی کنید.
if(norder=7)-1
2-{
int nprof=0;-3
int ngroup=1;-4
for(int k=0 ; k<tedadradif ; k++)-5
6-{
if(array[5]=ngroup)-7
8-{
nprof++;-9
10-}
else-11
12-{
cout<<"tedad asatide gorohe"<<ngroup<<"="<<nprof;-13
for(int i=0;i<nprof;i++)-14
15-{
cout<<array[1][i]<<array[2][i];-16
nprof=0;-17
ngroup++;-18
19-}
20-}
21-}
22-}
if(norder=8)-23
24-{
cout<<tedadradif;-25
for(int j=0;j<tedadradif;j++)-26
cout<<array[1][j]<<array[2][j];-27

Hossenbor
پنج شنبه 07 اردیبهشت 1391, 10:34 صبح
ببخشین یک سوال چرا تو خط 32 متغییرا رو از نوع کارکتر تعریف کردین؟

Hossenbor
پنج شنبه 07 اردیبهشت 1391, 10:42 صبح
دوسته من شما از اینه که شما به روش الگوریتمیک عمل نکردید ان شاالله که فردا برنامه نویس بشی رعایت نکردن این نکته میتونه برات مشکل ایجاد الگوریتم هم چیزه سختی نیست و کاره زیادی هم نمیخواد برای مثال در مورد تابع حذف اینجور میشه
1-برو تو لیست دنبال ارایه مورد نظرم بگرد
2-اگر پیدا شد ان را حذف کن
3-اگر پیدا نشد پیام نشان بده که پیدا نشده
میبینی چقد ساده است

hafez1
پنج شنبه 07 اردیبهشت 1391, 14:46 عصر
چون نام و فامیل و نام گروه و سمت استاد از نوع کاراکترند من این جوری تعریف کردم .مگه اشتباس؟؟؟؟؟؟؟؟؟؟؟؟
اینی که شما می گید گفتنش آسونه ولی کد کردنش سخته.
اینی که گفتید آرایه رو پیدا کنه تازه بعد باید بره توی آرایه اون استادو پیدا کنه و حذفش کنه. در ضمن جای پینترا هم عوض می شه.
ببخشید فکر کنم اینو نگفته بودم که هر گروهی به اساتیدش اشاره می کنه و اساتید هر گروه به هم اشاره می کنن.و گروهها هم به یک دیگر اشاره می کنن.
اگه برنامه رو این جوری در نطر بگیریم یکم سخت می شه چون با حذف یک استاد جای پینتراش عوض می شن. مثلا پینتر استاد قبلی که به پیش از حذف این استاد بهش اشاره می کرده باید به استاد بعد از استاد حذف شده اشاره کنه.همچنین در صورت حذف یک گروه با ید کل اساتیدش هم حذف بشن و دوباره جای پینترا عوض بشه. نمی دونم منظورمو تونسم برسونم یا نه.
درضمن ممنونم که برای دوستتون ارزش قایل شدید و جوابمو دادید.

Hossenbor
پنج شنبه 07 اردیبهشت 1391, 15:22 عصر
مگه از چه نوع آرایه ای استفده کردین؟

hafez1
پنج شنبه 07 اردیبهشت 1391, 15:55 عصر
آرایه ها باید داینامیک باشن چون تعدا اساتید مشخص نیست

BeginnerProgrammer
پنج شنبه 07 اردیبهشت 1391, 19:18 عصر
قبل از هر چیز کدتون بین تگ کد قرار بدین (مُردم از بس عدد پاک کردم تا یه ران بگیرم :عصبانی:)

بعد اومدم فایل رو که شامل نام ونام خانوادگی و کد پرسنلی و نام گروه مربوطه و کد گروه و سمت استاد هست رو خوندم.با توجه به این که نوعشون فرق می کرد توی شش تا آرایه جدا ریختم
اینکارو کجای کد انجام دادید؟؟!!!
برای اینکه همچین کدی بنویسی اولا استراکچرا رو خارج از مین برنامه تعریف کن . تا اگه تابعی خارج از مین نوشتی بتونی از این استراکچرا استفاده کنی.
به نظرم اگه اطلاعات مربوط به دانشجو و استاد و کالجو تویه فایلهای جدا ذخیره کنی بهتره چون فیلدهاشون مشترک نیست قطعا سایز کلاس هاشونم مشترک نیست اینجوری موقع خوندن از فایل دچار مشکل میشی.
معنی این کدا چیه؟؟؟!!!


firstname= char array[1];
lastname= char array[2];
personalcode= int array[3];
group= char array[4];
groupnumber= int array[5];
position= char array [6];

نام و نام خانودگیم استرینگ بگیرو فایلتم باینری باشه خیلی راحت تر میشه مثلا برای اضافه کردن یک استاد یا دانشجو کدش اینجوری میشه( اگه باینری باشه)


void addProf(){
ofstream fileOut;
fileOut.open("prof.txt");
prof prof1;
cin>>prof1.firstname>>prof1.lastname>>prof1.position>>prof1.personalCod>>prof1.groupdepartmentNumber;
fileOut.write((char*)&prof1,sizeof(prof));
}

ادامه کدو بنویس (قسمتهای حذف و ...) اینجوری نمیشه حلش کرد !!!!!!

hafez1
جمعه 08 اردیبهشت 1391, 15:50 عصر
ببخشیداگه اذیت شدید.
این که گفتید منظورم از این کدا چیه در واقع اومدم نام ونام خانوادگی و کد پرسنلی و نام وکد گروه و سمت استاد رو توی 6 تا آرایه جدا ریختم. کارم اشتباهه؟؟؟؟
ما توی این برنامه یه فایل بیشتر نداریم که اونم مربوط به اطلاعات استاده. وشامل نام و نام خانوادگی و کد پرسنلی و سمت استاد وگروه مربوط به استاد وکد این گروه است.
منظورتون از این که فایلم باینری باشه چیه؟؟
می شه یکم بیشتر کمکم کنید.

hafez1
جمعه 08 اردیبهشت 1391, 16:09 عصر
ببخشیداگه اذیت شدید.
این که گفتید منظورم از این کدا چیه در واقع اومدم نام ونام خانوادگی و کد پرسنلی و نام وکد گروه و سمت استاد رو توی 6 تا آرایه جدا ریختم. کارم اشتباهه؟؟؟؟
ما توی این برنامه یه فایل بیشتر نداریم که اونم مربوط به اطلاعات استاده. وشامل نام و نام خانوادگی و کد پرسنلی و سمت استاد وگروه مربوط به استاد وکد این گروه است.
منظورتون از این که فایلم باینری باشه چیه؟؟
می شه یکم بیشتر کمکم کنید.

BeginnerProgrammer
جمعه 08 اردیبهشت 1391, 18:39 عصر
طبق پست اولتون اصلا نیازی به تعریف 3 کلاس یا استراکت نیست میتونید یه کلاس تعریف کنید شامل همه ی اون موارد(کد پرسنلی ، نام نام خانوادگی و ...). ادامه ی کدم به نظرم اینجوری باشه بهتره:
اولا اینکه شما باید یه تابع داشته باشی که بیاد اطلاعات مربوط به استادو بگیره (مثل نام و نام خانوادگی و .. یعنی در واقع فایلتو درست کنی،درسته؟؟)
مثلاً تابع زیر:



Void insert(){
Prof tempProf;
cin>>tempProf.name>>…
ofstream outFile;
outFile.open("a.txt");
outFile.seekp(ios::end);
outFile.write(char*(&tempProf),sizeof(Prof));
}



افزودن استادهم که کاره سختی نیست همین تابع بالاست درواقع فقط تستش کن ببین چه تغییراتی لازمه،و سرچشم که کاره سختی نیست، فقط قسمت حذفش یکم مشکله(:متفکر:). باید وقتی که اطلاعات استادی که میخوای از فایل حذف کنی تا وقتی که به اون استاد نرسیدی باید تویه فایل دیگه بنویسی و بعد اطلاعات اون استادو رد کنی (یعنی از فایل بخون و هیچ کاری روی انجام نده) اطلاعات بعد از اونم دوباره در ادامه ی فایل جدیدت بنویسی .( اصلا هم به اون شش آرایه نیازی نیست )
به نظرم توضیحاتم خوب بود ، بنویس ببین کجا به مشکل برمیخوری :بامزه:

hafez1
جمعه 08 اردیبهشت 1391, 21:54 عصر
اینا که شما می گید درسته ولی اگه بخوام با اشاره گرا کار کنم باید اشاره گری که به استاد اشاره می کنه رو پاک کنم حالا دیگه نمی دونم چی جوری:متعجب:

BeginnerProgrammer
جمعه 08 اردیبهشت 1391, 22:38 عصر
میخواین لیست پیوندی بنویسین یا تو فایلم اشاره گر استفاده کنید؟؟؟؟
البته فرقیم نمیکنه، وقتی یه نودو میخواین حذف کنین باید نود قبلیشم بخونید فرضا نودی که میخواین حذف کنید (temp) و اونو پیدا کردید برای اینکه مشکل اشاره گرهاتون رفع بشه وقتی میخواین فایلو update کنید اشاره گر قبلیه اونو set کنید

temp.privew->next=temp.next;
temp.next->privew=temp.privew;
البته در اینصورت باید یک نود قبل از این نود مورد نظر نوشتن تو فایل جدیدو متوقف کنید ( خیلی مهمه) و بعد از اعمال تغییرات بالا این نودها رو توی فایل بنویسید.

موفق باشید