اطلاعات دانشچو

v.b.f1

Active Member
دوستان عزیز یه برنامه میخوام که اطلاعات دانشجویی رو دریافت کنه

مثلا تعداد دانشجو بعدش میانگین نمرات محاسبه و چاپ کنه

فکر کنم اینجا باید از سوئچ استفاده کنم
به فرض اگه نمرات 18 19 20 باشه این پیغامو بده verygood
اگه 17 16 15 باشه good

و در غیر این صورت week



اطلاعات دانشجویی هم اینجوری باشه
شماره دانشجویی شرط اتمام برنامه هم صفر 0 باشه
3 نمره دانشجو


فکر کنم چهارتا متغییر میخواد d f g s
a = میانگین
b= شماره دانشجویی
g= نمره دانشجو
S= مجموع

اگه ممکنه نمونه ای راهنمایی یا اصلا از چه چیزایی باید استفاده کنم
 

saalek110

Well-Known Member
برنامه شما دو قسمت دارد:
قسمت ورودی گرفتن.(توابع ورودی گرفتن را استفاده کنید)
قسمت محاسبات و نمایش.

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

می توانید از استراکت هم استفاده کنید تا اطلاعات ناهمجنس دانشجو (رشته - عدد و ..) در آن نظم پیدا کند.

بقیه اش سلیقه ای است.
مثلا می توانید منویی اضافه کنید تا وارد قسمتهای مختلف مثل ورودی و محاسبه و نمایش شوید.

سوئیچ هم برای کاری که گفتید مناسب است.
با نگاه به یک آموزش می توانید با کمی فکر بسازید.
ولی می توانید در سایتهای سورس این گونه برنامه را بیابید و از آنها ایده بگیرید.
در فرومهایی مثل اینجا این سئوال بارها مطرح شده و سورس در جواب گذاشته شده. اگر خوب سرچ کنید در فرومهای فارسی این تاپیکها را هم می توانید پیدا کنید.
در هر قسمتی سئوال داشتید همین جا مطرح کنید تا من یا دوستان دیگر جواب دهیم.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
دوستان عزیز یه برنامه میخوام که اطلاعات دانشجویی رو دریافت کنه

مثلا تعداد دانشجو بعدش میانگین نمرات محاسبه و چاپ کنه

فکر کنم اینجا باید از سوئچ استفاده کنم
به فرض اگه نمرات 18 19 20 باشه این پیغامو بده verygood
اگه 17 16 15 باشه good

و در غیر این صورت week



اطلاعات دانشجویی هم اینجوری باشه
شماره دانشجویی شرط اتمام برنامه هم صفر 0 باشه
3 نمره دانشجو


فکر کنم چهارتا متغییر میخواد d f g s
a = میانگین
b= شماره دانشجویی
g= نمره دانشجو
S= مجموع

اگه ممکنه نمونه ای راهنمایی یا اصلا از چه چیزایی باید استفاده کنم

اگه فرضا بخواهید مشخصات 5 دانشجو رو دریافت کنید میشه دو نوع پیاده سازی متفاوت داشته باشید :

پیاده سازی بدون آرایه :
می توانید برای همه دانشجو ها از همان چند متغیر a و b و g و s استفاده کنید اما ناچار هستید که
بعد از دریافت مشخصات هر دانشجو بلافاصله میانگین و پیغام مورد نظر رو برای اون دانشجو نشون بدید چون
اگه سراغ دانشجوی بعدی بروید دیگه مشخصات دانشجو قبلی در متغیر های شما جایگزین میشه و دیگه
بهشون دسترسی ندارید.

پیاده سازی با آرایه :
می توانید هر کدام از متغیر های a و b و g و s رو بصورت یک آرایه تک بعدی تعریف کنید تا مشخصات هر دانشجو
یک خونه از این آرایه ها را اشغال کنند، اندیس 0 برای دانشجوی اول، اندیس 1 برای دانشجوی دوم و ...
اینطوری می توانید ابتدا مشخصات همه دانشجو ها رو دریافت کنید و سپس میانگین و نمراتشان را نمایش دهید.

اگر می خواهید تعداد دانشجو ها را همان ابتدا از کاربر بپرسید که نیازی به شرط اتمام برنامه نیست، اما
اگر تعداد دانشجو ها با مقدار 0 مشخص می شود بهتر است از یک حلقه for مثلا با متغیر i استفاده کنید :
کد:
	int i;
	int b[100];
	for (i = 0;i < 100;i++)
	{
		printf("Please enter student ID :");
		scanf("%d", &b[i])
		if (b[i]==0)
			break;
		.
		.
		.
	}
حلقه بالا حلقه ای خواهد بود که مشخصات دانشجو ها را دریافت کرده و میانگین نمرات را محاسبه می کند.
برای نمایش نمره و پیغام ها بهتر است در ادامه این کد از یک حلقه دیگر استفاده کنید، n متغیری است که
تعداد دانشجو ها را مشخص می کند :
کد:
	int n = i;
	for (i = 0;i < n;i++)
	{
		.
		.
		.
	}
 

v.b.f1

Active Member
میبخشین دوستان میشه else if

در برنامه استفاده کنم یا اصلا اگه میشه چطوریه
 

saalek110

Well-Known Member
if یعنی اگر و else یعنی در غیر این صورت.

مثلا اگر متغیر a برابر 4 بود فلان کار را بکن در غیر این صورت فلان کار را بکن.

بله شما هر جایی و در هر برنامه ای می توانید از if و else استفاده کنید. بنا به ضرورتی که حس می کنید.

-----------
ولی بحث دیگر اینه که متغیرها چطوری تعریف بشوند. اگر آرایه تعریف می کنید چطوری کار کنید.

---------
با این if و else مثل بقیه ابزارها می توانید روی این متغیرها کار کنید.
شرط (if ) یک ابزار است . حلقه یک ابزار است و چیزهای دیگر.

----------
کلا شما برای نوشتن برنامه خود از مجموعه ای از ابزارها مثل متغیر - شرط و حلقه استفاده می کنید
و جوری اینها را ترکیب می کنید که به منظور خود برسید.
معماری برنامه پست قبل از دوستمان را نگاه کنید.
در یکی از برنامه ها هم متغیر دارد هم حلقه و هم شرط.
اینها (متغیر-شرط-حلقه) از ابزارهای رایج برنامه نویس است.
 

v.b.f1

Active Member
:-?:-?:-?:-?:-?:-?:-?:-?:-?:-?:-?:-?:-?:-?:-?:-?

نششششششششششششد اگه ممکنه خودتون بزارید و خط به خط توضیح بدیدن البته شرمندتونم این مخه زنگ زده طعتیله
سنی ازش گذشته


منتظررررررررررررم

باتشکر از دوستانی که همیشه مایه دردسرم براشون
 

the_king

مدیرکل انجمن
کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    int studentID[100], i, j, n;
    float studentAvg[100], score, sum;
    for (i = 0; i < 100; i++)
	{
		printf("\nPlease enter student ID (0 for finish) :");
		scanf("%d", &studentID[i]);
		if (studentID[i] == 0)
			break;
        sum = 0;
        for (j = 1; j <= 3; j++)
        {
            printf("    Please enter score #%d :", j);
            scanf("%f", &score);
            sum += score;
        }
        studentAvg[i] = sum / 3;
	}
	n = i;
    for (i = 0; i < n; i++)
    {
        printf("\nStudent ID = %-10d    Average = %-10g   Rating = ", studentID[i], studentAvg[i]);
        switch ((int)studentAvg[i])
        {
            case 18:
            case 19:
            case 20:
                printf("Very good");
                break;
            case 15:
            case 16:
            case 17:
                printf("Good");
                break;
            default:
                printf("Weak");
        }
    }
    printf("\nPress any key to continue.\n");
    getch();
    return 0;
}

در تعریف متغیر ها studentID آرایه ای است که شماره های دانشجویی را نگهداری می کند، البته دقت کنید
که int برای اعداد خیلی بزرگ و طولانی که در شماره های دانشجویی مرسوم است مناسب نیست.
نوع داده ای long int برای اعداد خیلی بزرگ مناسب تر است.
متغیر i برای حلقه دریافت مشخصات هر دانشجو، اندیس دانشجو در آرایه را مشخص می کند، مثلا دانشجوی
شماره 0 و 1 و 2 و ...
متغیر j برای حلقه ای است که 3 نمره دانشجو را دریافت می کند، چون دریافت نمره ها مشابه هم اند برای
دریافت سه نمره از یک حلقه استفاده شده است.
متغیر n تعداد دانشجو هایی است که مشخصاتشان را دریافت می کنیم.
کد:
    int studentID[100], i, j, n;

آرایه studentAvg میانگین نمرات دانشجو ها را ذخیره می کند، از نوع float است چون نمرات و میانگین آنها
اعداد اعشاری هستند با نوع داده int فقط می توانستیم اعداد صحیح بدون اعشار را ذخیره کنیم.
متغیر score یک نمره دانشجو را دریافت می کند، یک متغیر کافی است، چون بعد از جمع زدن نمرات دیگر
نیازی به اطلاعات نمره ها نداریم.
در متغیر sum نمرات یک دانشجو را جمع خواهیم کرد تا بتوانیم میانگین شان را حساب کنیم.
کد:
    float studentAvg[100], score, sum;

حلقه اول مشخصات حداکثر 100 دانشجو را دریافت می کند :
کد:
    for (i = 0; i < 100; i++)
	{

شماره دانشجویی هر دانشجو در اندیس i آرایه studentID ذخیره می شود :
کد:
		printf("\nPlease enter student ID (0 for finish) :");
		scanf("%d", &studentID[i]);

اگر شماره دانشجویی وارد شده 0 باشد، از حلقه دریافت مشخصات خارج می شویم :
کد:
		if (studentID[i] == 0)
			break;

پیش از آنکه نمرات یک دانشجو را دریافت کنیم مقدار متغیر sum را صفر می کنیم تا پیش از جمع کردن
نمرات مقداری در آن نباشد. برای دریافت کردن سه نمره از یک حلقه که سه بار اجرا می شود استفاده می کنیم :
کد:
        sum = 0;
        for (j = 1; j <= 3; j++)
        {

داخل حلقه یک نمره را دریافت می کنیم، از متغیر j که شماره نمره است استفاده شده تا پیغام ها متناسب
با شماره نمره باشد، یعنی با هر بار اجرا کردن حلقه در پیغام ها شماره متفاوتی نمایش داده شوند :
کد:
    Please enter score #1 :
    Please enter score #2 :
    Please enter score #3 :
نمره در متغیر score ذخیره می شود :
کد:
            printf("    Please enter score #%d :", j);
            scanf("%f", &score);

نمره دریافت شده را در متغیر sum با سایر نمرات جمع می کنیم :
کد:
            sum += score;
        }

زمانی که 3 نمره دریافت شدند، میانگین شان را در آرایه studentAvg برای دانشجوی اندیس i ثبت می کنیم :
کد:
        studentAvg[i] = sum / 3;
	}

تا پیش از اجرا کردن حلقه اول، مشخص نبود که کاربر مشخصات چند دانشجو را ثبت می کند، اما بعد پایان یافتن آن
تعداد دانشجو ها توسط متغیر i مشخص شده که برای استفاده در متغیر n ذخیره می کنیم (خود متغیر i را برای
حلقه بعدی لازم داریم) :
کد:
	n = i;

حلقه بعدی را برای نمایش میانگین نمرات n دانشجو ایجاد می کنیم :
کد:
    for (i = 0; i < n; i++)
    {

در یک سطر شماره دانشجویی و میانگین نمرات دانشجوی اندیس i را نمایش می دهیم.
قالب های d% یا g% برای نمایش یک مقدار مناسب اند، اما طول مقادیر ثابت نیست، مثلا
میانگین نمره یک دانشجوی 9 است (یک رقمی) و میانگین نمره یک دانشجوی دیگر 18.25 (پنج رقمی)
متغیر بودن طول مقادیر موجب می شود که مقادیر در سطر های متفاوت دقیقا زیر هم و مرتب قرار نگیرند.
با اضافه کردن عبارت 10- در قالب های d% و g% از کامپایلر می خواهیم که با اضافه کردن کاراکتر فاصله
طول همه مقادیر بصورت ثابت 10 کاراکتر باشند.
کد:
        printf("\nStudent ID = %-10d    Average = %-10g   Rating = ", studentID[i], studentAvg[i]);

میانگین نمرات اعداد اعشاری اند (مثلا 14.5) و مجموعه مقادیر قابل قبول به اعداد صحیح 0 الی 20 محدود نیست.
به همین دلیل با switch نمی توانیم همه اعداد اعشاری ممکن را مشخص کنیم. به همین جهت با اضافه کردن
عبارت (int) از کامپایلر می خواهیم که مقدار اعشاری ما را موقتا (داده داخل متغیر اعشاری تغییری نخواهد کرد)
با حذف اعشار به یک عدد صحیح تبدیل کند تا به مجموعه اعداد صحیح محدود شود :
کد:
        switch ((int)studentAvg[i])
        {

برای اعداد صحیح 18 و 19 و 20 و هر میانگین دیگری که با حذف اعشارشان همین مقادیر باشند پیغام Very good
را نمایش می دهیم :
کد:
            case 18:
            case 19:
            case 20:
                printf("Very good");
                break;

برای اعداد صحیح 15 و 16 و 17 و هر میانگین دیگری که با حذف اعشارشان همین مقادیر باشند پیغام Good
را نمایش می دهیم :
کد:
            case 15:
            case 16:
            case 17:
                printf("Good");
                break;

و برای هر مقدار میانگین دیگری بجز مقادیر قبلی پیغام Weak را نمایش می دهیم :
کد:
            default:
                printf("Weak");
        }

پیش از خاتمه دادن به اجرا برنامه با یک پیغام مناسب منتظر فشار دادن یک کلید از سوی کاربر می شویم :
کد:
    printf("\nPress any key to continue.\n");
    getch();
    return 0;
}
 

v.b.f1

Active Member
سلام دوست عزیز اگه بخوام اطلاعات دریافتی رو بیشتر از 100 یعنی نامحدود کنم چیکار باید بکنم
من به این شکل تغییرش دادم اما ایراد میگیره یعنی
کد:
 int studentID[m], i, j, n;
    float studentAvg[m], score, sum;
    for (i = 0; i < m; i++)


استاد اگه ممکنه بگید مشکل از کجاست
 

the_king

مدیرکل انجمن
سلام دوست عزیز اگه بخوام اطلاعات دریافتی رو بیشتر از 100 یعنی نامحدود کنم چیکار باید بکنم
من به این شکل تغییرش دادم اما ایراد میگیره یعنی
کد:
 int studentID[m], i, j, n;
    float studentAvg[m], score, sum;
    for (i = 0; i < m; i++)


استاد اگه ممکنه بگید مشکل از کجاست

نمی توانید یک آرایه با طول نامشخص را آنگونه تعریف کنید، m بایستی یک عدد ثابت باشد، نمی تواند یک متغیر باشد.
آرایه هایی که طولشان قبل از اجرای برنامه بصورت ثابت مشخص نیست بایستی با تخصیص حافظه بصورت
پویا (Dynamic) تعریف شوند، در c برای اینکار از تابع ()malloc استفاده میشه، فقط فراموش نکنید که قبل از اتمام برنامه
حافظه تخصیص داده شده را با ()free آزاد کنید. برای استفاده از دو تابع ()malloc و ()free بایستی stdlib.h را در برنامه
include کنید.

البته در ++C برای ایجاد کردن آرایه پویا نیازی به تابع نیست چون در خود زبان برای این منظور قابلیت های لازم ارائه شده،
بجای ()malloc از new و بجای ()free از delete استفاده میشه. البته فرقی از لحاظ سادگی دشواری ندارند.

مثلا :
کد:
#include <iostream.h>
#include <stdlib.h>

int main()
{
    int m, *studentID;
    scanf("%d", &m);
    studentID = (int*) malloc(m * sizeof(int));
    .
    .
    .
    free(studentID);
    return 0;
}

توجه کنید که آرایه studentID فقط بصورت یک اشاره گر تعریف شده و برای اینکه طول حافظه تخصیص داده شده
بر حسب بایت میشه از ()sizeof استفاده شده تا طول نوع داده int بدست بیاید.
همچین دقت کنید که در انتهای برنامه با ()free حافظه تخصیص داده شده را آزاد می کنیم.

اگر بخواهید یک آرایه پویا از نوع float تعریف کنید :
کد:
    float *studentAvg;
    studentAvg = (float*) malloc(m * sizeof(float));
    .
    .
    .
    free(studentAvg);
 

v.b.f1

Active Member
علی جان اگه نخوام از آرایه استفاده کنم کجا ها رو باید تغییر بدم
اخه من یکم یادگرفتم هنوز به این چیزا نرسیدم که سر در بیارم
راستی علی یادم رفت بگم

اصلا لازم نیست یه جا پیغام وضعیت دانشجو رو بده

یعنی همون دانشجوی اول که شماره دانشجوییش و سه نمراتشو دریافت کرد
بگه وضعیتش چطوره
بعد دانشجوی دوم مشکلیم نیست اطلاعات دانشجوی قبلی حذف شه

ولی میخوام نامحدوودددد باشه تا زمانی که از صفر استفاده کنم برای خروج
 
آخرین ویرایش:

the_king

مدیرکل انجمن
علی جان اگه نخوام از آرایه استفاده کنم کجا ها رو باید تغییر بدم
اخه من یکم یادگرفتم هنوز به این چیزا نرسیدم که سر در بیارم
راستی علی یادم رفت بگم

اصلا لازم نیست یه جا پیغام وضعیت دانشجو رو بده

یعنی همون دانشجوی اول که شماره دانشجوییش و سه نمراتشو دریافت کرد
بگه وضعیتش چطوره
بعد دانشجوی دوم مشکلیم نیست اطلاعات دانشجوی قبلی حذف شه

ولی میخوام نامحدوودددد باشه تا زمانی که از صفر استفاده کنم برای خروج

اندیس های [] و رو از متغیر ها حذف کنید، محتویات حلقه دوم رو به حلقه اول منتقل کنید.
چون حلقه دوم که با متغیر n کار می کرد حذف میشه، نیازی به متغیر n نداریم.

کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    int studentID, i, j;
    float studentAvg, score, sum;
    for (i = 0; ; i++)
	{
		printf("\nPlease enter student ID (0 for finish) :");
		scanf("%d", &studentID);
		if (studentID == 0)
			break;
        sum = 0;
        for (j = 1; j <= 3; j++)
        {
            printf("    Please enter score #%d :", j);
            scanf("%f", &score);
            sum += score;
        }
        studentAvg = sum / 3;
        printf("\nStudent ID = %-10d    Average = %-10g   Rating = ", studentID, studentAvg);
        switch ((int)studentAvg)
        {
            case 18:
            case 19:
            case 20:
                printf("Very good\n");
                break;
            case 15:
            case 16:
            case 17:
                printf("Good\n");
                break;
            default:
                printf("Weak\n");
        }
	}
    printf("\nPress any key to continue.\n");
    getch();
    return 0;
}
 

جدیدترین ارسال ها

بالا