PDA

View Full Version : سوال: ویرایش در آرایه ها



anti2009
جمعه 19 دی 1393, 15:57 عصر
سلام دوستان
من به راهنمایی تون نیاز دارم... قراره برنامه ای بنویسم که مشخصات دانشجویان و نمرات چهار درس آنها رو بگیره و بتونه ویرایش کنه
الان این کدی که موقت نوشتم مشخصات 10 نفر رو میگیره ولی برای ایجاد تغییرات تو نمرات درسی ، هیچ ایده ای ندارم


#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

struct student{
char Fname[15];
char Lname[20];
int sn;
float ave;
};


struct lesson{
float math;
float phisic;
float computer;
float english;

};

int main()
{
student s[5];
lesson l[5];
menu:
cout << "\n**************Student Info*******************";
cout << "\n\n\n **[1] Add & Save Student's Info** " << endl;
cout << " **[2] Edit Student's Info** " << endl;
cout << " **[3] Print"<< endl;
cout << " **[4] Print with Ave"<< endl;
cout << " **[5] Exit"<< endl;
cout << " \n \nSelect what to do?: " << endl;
int choice;
cin>>choice;
cout<<"-----------------------------------"<<endl<<endl<<endl<<endl;
if(choice==1) goto level_a;
if(choice==2) goto level_b;

level_a: {
for(int i=0; i<10; i++){
cout<<"F Name["<<i<<"] :"; cin>>s[i].Fname;
cout<<"L Name["<<i<<"] :"; cin>>s[i].Lname;
cout<<"Student number["<<i<<"] :"; cin>>s[i].sn;
cout<<"Student number["<<i<<"] Math:"; cin>>l[i].math;
cout<<"Student number["<<i<<"] Phisic:"; cin>>l[i].phisic;
cout<<"Student number["<<i<<"] Computer:"; cin>>l[i].computer;
cout<<"Student number["<<i<<"] English:"; cin>>l[i].english;
s[i].ave=(l[i].math + l[i].phisic + l[i].computer + l[i].english)/4;
cout<<"Student number["<<i<<"] Avenu : "<<s[i].ave<<endl;
cout<<"*************************************"<<endl;
}


goto menu;
}
level_b:
{







}



return 0;
}

erfan2023
سه شنبه 23 دی 1393, 13:40 عصر
با سلام
اولا به جای اینکه از دستور goto استفاده کنید سعی کنید با اجرای یک حلقه بی نهایت به Menu برگردید . حلقه بی نهاید میتونه به صورت
for(;;){} یا به صورت

while(true){} . که شما باید تمامی خط کد های داخل تابع main رو در یکی از این دو حلقه قرار بدید.
برای level_a و level_b از دستور switch به شکل زیر استفاده کنید :


int choice ;

cin>>choice;

cout<<"-----------------------------------"<<endl<<endl<<endl<<endl;

switch(choice){
case 1:
{
//do codes belong to level_a
}
case 2 :
{
//do codes belong to level_b


این کار برای خوانا تر شدنه برنامه بهتره و از طرفی حجم کد که زیاد میشه دستور goto مشکلات زیادی در برنامه به وجود میاره
برای ویرایش نمره ها هم . یک ایده مناسب میتونه طراحی یک تابع باشه ، به صورتی که شماره دانشجویی یا نام و نام خانوادگی و اسم درس رو از کاربر بگیره و در یک تابع به عنوان آرگومان های تابع کپی کنه.
بعد تابع شما باید قادر به جستجو میان اطلاعات داده شده باشه . پس به یک الگوریتم search هم نیاز دارید .
کد رو خودتون بنویسید تا ذهنتون پویا تر بشه ولی اگر نتونستید پیام بدید تا براتون بنیویسم.
موفق باشید.

anti2009
سه شنبه 23 دی 1393, 17:24 عصر
با سلام
خیلی ممنون از پاسخ تان
کد ها رو درست کردم برای پروژه ام و ویرایش هم حل شد
الان فقط به یک مشکل بر خوردم
می خوام لیست دانشجوها رو بر اساس نمراه میانگین مرتب کنم (مرتب سازی حبابی)
الان من یک استراکت دارم مثل این :


struct student{
char Fname[20];
char Lname[35];
float course1; float course2; float course3; float course4; float ave;
int stn; int id;
};


و یک تابع swap هم برای جابه جایی خونه ای تعریف کردم مثل این :


void swap(float &x, float &y){
int tmp;
tmp = x;
x=y;
y=tmp;
}


چون ave از نوع float هست تو تابع swap برای ورودی ها float گرفتم

و یک تابع sort معرفی کردم برای متب کردن مثل :

void Sort(float a[], int n){
for(i=1; i<number; i++)
for(int j=0; j<number-1; j++)
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}


الان که میخوام تابع s که قبلا گفته بودم s[5] ( توی کد جدید به جای 5 زدم متغیر number که کاربر وارد می کنه) رو مرتب کنم به مشکل می خورم


Sort(s[number].ave,number);


اررورش معمولا این رو می نویسه تو codeblock :

error: cannot convert 'float' to 'float*' for argument '1' to 'void Sort(float*, int)'|

erfan2023
جمعه 26 دی 1393, 15:20 عصر
با درودی دیگر
من الگوریتم مرتب سازی حبابی یا همون Bubble Sort رو براتون مینویسم و هیچ نیازی به استفاده از تابع swap ندارید
** نکته خیلی مهم : شما وقتی نمرات دانشجویان رو مرتب میکنید باید بر اساس نمره ، نام و نام خانوادگی و هر اطلاعات دیگه راجع به انها رو هم مرتب کنید . مثال :
اگر خانه پنجم آرایه حاوی بزرگترین مقداره و شما قصد دارید نزولی اعداد رو مرتب کنید ، بنابر این محتوای خانه پنجم آرایه باید در خانه اول ارایه قرار بگیره ، گیریم این کار انجام شد . ولی اسم اون دانشجو ( شاگرد اول ) هنوز در خانه پنجم آرایه مرتبط به خودش قرار گرفته که اون هم باید بیاد در خانه اولیه آرایه خودش قرار بگیره . پس اسامی هم باید بر اساس نمرات مرتب بشن تا اسامی و نمرات قاطی پاتی نشن
این هم از الگوریتم bubble sort :


for (int i = 0; i < n; i++)
for (int k = 0; k < n - i - 1;k++)
if (a[k + 1]>a[k])
{
int temp = a[k];
a[k] = a[k + 1];
a[k + 1] = temp;
}

حالا در برنامه شما وقتی شرط برقرار است باید علاوع بر نمره ، اسم دانشجو رو هم تغییر بدید . مثلا :


for (int i = 0; i < n; i++)
for (int k = 0; k < n - i - 1;k++)
if (a[k + 1]>a[k])
{
//******* moratab sazie nomre *******
int Temp_Grade = a[k];
a[k] = a[k + 1];
a[k + 1] = Temp_Grade;
//******* moratab sazie first name ****
string Temp_FirstName;
Temp_FirstName = f[k];
f[k] = f[k + 1];
f[k + 1] = Temp_FirstName;
//******* moratab sazie last name *****
string Temp_LastName;
Temp_LastName = l[k];
l[k] = l[k + 1];
l[k+1]=Temp_LastName
}


به صورت عامیانه کد بالا یعنی : اسم دانشجو هم باید بره کنار نمرش بشینه ، نه اینکه نمرش مرتب بشه ولی اسامی به همون ترتیبی که تو خانه های ارایه بودن باقی بمونن
امیدوارم تونسته باشم کمکی کرده باشم. بازم اگر سوالی بود بپرس . اگر بلد باشم جواب میدم .
موفق باشی

anti2009
جمعه 03 بهمن 1393, 20:50 عصر
عرفان عزیز
خیلی ممنون از کمکت... این ایام من درگیر پروژه بودم ... انقدر فکرم درگیر پروژه بود که یادم رفته بود اینجا پست گذاشتم
من برای اینکه ادیت کنم آرایه رو... برای هر دانش آموز یک ID در نظر گرفته بودم... این ID از 0 شروع می شد تا n-1
پس برای ادیت اومدم به کاربر گفتم ID دانش آموز را وارد کنه و درس ها رو هم نمرات جدید بزنه و معدل جدید هم تنظیم بشه
خیلی آسون بوده که من چون اولین پروژه برنامه نویسی ام برای دانشگاه بوده ، خیلی فکرم مشغولش بوده
واقعا باز ازت مچکرم... خیلی آقایی


int fake_id;
cout<<"Please Enter Student ID that you want to Edit :";
cin>>fake_id;
cout<<endl;
cout<<"Edit Information for : "<<s[fake_id-1].Fname<<" "<<s[fake_id-1].Lname<<endl;
cout<<"Please Enter New Course 1: ";
cin>>s[fake_id-1].course1;
cout<<"Please Enter New Course 2: ";
cin>>s[fake_id-1].course2;
cout<<"Please Enter New Course 3: ";
cin>>s[fake_id-1].course3;
cout<<"Please Enter New Course 4: ";
cin>>s[fake_id-1].course4;
s[fake_id-1].ave=(s[fake_id-1].course1+s[fake_id-1].course2+s[fake_id-1].course3+s[fake_id-1].course4)/4;
cout<<"New Average is : "<<s[fake_id-1].ave<<endl;

erfan2023
یک شنبه 05 بهمن 1393, 21:28 عصر
خواهش میکنم
موفق و سلامت باشید :لبخندساده: