PDA

View Full Version : سوال: خطای کدنویسی من کجاست؟



DELTANG_Programmer
پنج شنبه 02 آذر 1391, 14:17 عصر
سلام بر دوستان عزیز
من می خوام یه برنامه بنویسم که معدل دانشجوهای کلاس رو که دارای تعداد دوروس متفاوت هستند را حساب کند، نمی ودنم چرا ارور می ده مشکل کجاست؟ اینم کدها :


#include "stdafx.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int d; t;
float n; sum; avg;
cout<<"Enter Tedad Daneshjou:";
cin>> d;
for(int i=1; i<=d; i++)
cout<<"Enter Tedad Dars Nafar <<i<<om :";
cin>> t;
for(int j=1; j<=t; j++)
{
cout<<"Enter Nomarate Dars <<j<<om :";
cin>>n;
}
avg=sum n/(float)n;
cout<<"\n Moadel Danehsjou<<i<<om :"<<avg;
getchar();
return 0;
}

مسعود اقدسی فام
پنج شنبه 02 آذر 1391, 14:23 عصر
کدها رو داخل تگ CPP بنویسید که خواناتر شه.




#include "stdafx.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int d; t;
float n; sum; avg;
cout<<"Enter Tedad Daneshjou:";
cin>> d;
for(int i=1; i<=d; i++)
cout<<"Enter Tedad Dars Nafar <<i<<om :";
cin>> t;
for(int j=1; j<=t; j++)
{
cout<<"Enter Nomarate Dars <<j<<om :";
cin>>n;
}
avg=sum n/(float)n;
cout<<"\n Moadel Danehsjou<<i<<om :"<<avg;
getchar();
return 0;
}

مسعود اقدسی فام
پنج شنبه 02 آذر 1391, 14:28 عصر
فرض کنیم داخل حلقه‌ی وسط طرف نمره‌ی اول رو وارد می‌کنه که n نگه می‌داره. حلقه تکرار می‌شه و دوباره نمره‌ی دوم وارد n می‌شه و در نتیجه نمره‌ی اولی که وارد شده بود پاک می‌شه.

sum n یعنی چی؟ شما باید sum رو خودتون داخل همون حلقه که n رو دریافت می‌کنید مقداردهی کنید.

یه sum که اولش صفره و داخل حلقه هر بار که n مقدار می‌گیره همون مقدار به sum هم اضافه می‌شه. وقتی حلقه تموم شد sum تقسیم بر t (و نه n) معدل رو نشون می‌ده.

DELTANG_Programmer
پنج شنبه 02 آذر 1391, 15:37 عصر
فرض کنیم داخل حلقه‌ی وسط طرف نمره‌ی اول رو وارد می‌کنه که n نگه می‌داره. حلقه تکرار می‌شه و دوباره نمره‌ی دوم وارد n می‌شه و در نتیجه نمره‌ی اولی که وارد شده بود پاک می‌شه.

sum n یعنی چی؟ شما باید sum رو خودتون داخل همون حلقه که n رو دریافت می‌کنید مقداردهی کنید.

یه sum که اولش صفره و داخل حلقه هر بار که n مقدار می‌گیره همون مقدار به sum هم اضافه می‌شه. وقتی حلقه تموم شد sum تقسیم بر t (و نه n) معدل رو نشون می‌ده.

منظورتون این بود :
#include "stdafx.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int d; t;
float n; sum=0; avg=0;
cout<<"Enter Tedad Daneshjou:";
cin>> d;
for(int i=1; i<=d; i++)
cout<<"Enter Tedad Dars Nafar <<i<<om :"<<endl;
cin>> t;
for(int j=1; j<=t; j++)
{
cout<<"Enter Nomarate Dars <<j<<om :"<<endl;
cin>>n;
sum=sum+n;
}
avg=sum/(float)t
cout<<"\n Moadel Danehsjou<<i<<om :"<<avg;
getchar();
return 0;
}

DELTANG_Programmer
پنج شنبه 02 آذر 1391, 15:39 عصر
اگه این درسته که اینم 12 تا ارور می ده؟

مسعود اقدسی فام
پنج شنبه 02 آذر 1391, 15:58 عصر
اگه این درسته که اینم 12 تا ارور می ده؟

این که ارور می‌ده ربطی به الگوریتم نداره علی‌الاصول. خطای برنامه‌نویسی اتفاق افتاده. مثلا حلقه for فقط یه دستور اول رو اجرا می‌کنه. چون آکولاد نذاشتید. این خطای منطقیه. بعد از محاسبه avg سمیکالن نذاشتی. این خطای دستوریه. یا اینکه t رو اشتباه تعریفی کردی همون اول برنامه.
اینا به من ربطی نداره. شما دقتت رو بیشتر کن. ولی اون بحث sum و غیره رو که من توضیح دادم درست پیاده کردی. البته t لازم نیست به float تبدیل بشه. چون sum خودش اعشاری هست. یکی از طرفین اعشاری باشه کافیه تا تقسیم اعشاری انجام بشه.

vahid_fathi
پنج شنبه 02 آذر 1391, 16:05 عصر
اگه این درسته که اینم 12 تا ارور می ده؟

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

درضمن این برنامه شما هم درست کار نمیکنه.به چند دلیل:
1- بعد حلقه ی اول شما الکولاد نذاشتین . و اون حلقه فقط برای دستور cout کار میکنه .
2- فک نکنم لازم باشه بعد از تعریف هر متغیر ; بذارین به جاش از , استفاده کنین (مثلا به جای ;int d;t بنویسین ;int d,t) شایدم این جزو ارورا حساب میشه .الان یادم نیست
3- بهتره وقتی قراره یه متغیر یه مقدار مجموع رو تو خودش نگه داره قبل از هرچیر به اون مقدار اولیه بدین چون این احتمال وجود داره که کامپیوتر به اون مقدار اولیه اشتباه بده و کل محاسبات اشتباه بشه .(که شما اصلاحش کردین).
4- فک نکنم لازم باشه قبل از t وقتی که میخوای sum رو به t تقسیم کنید عبارت (float) رو بنویسین .
5- اون دستور cout اخر هم باید داخل حلقه ی اول باشه .
شاید چندتا اشکال دیگه هم باشه .

DELTANG_Programmer
پنج شنبه 02 آذر 1391, 18:29 عصر
گذشته از سوء تفاهمایی که پیش اومد و الحمدالله رفع شد ، من برنامه رو نوشتم اجرام میشه ولی یه مشکل هست اینکه معدل نفر اول و درست حساب می کنه ولی بقیه رو اشتباه (میبینی معدل یک نفر میشه 17 میزنه 36 یا 54) ؟
اینم کد:
#include "stdafx.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
float d=0, avg=0, sum=0;
int n,c;
cout<<"Lotfan Tedad Daneshjou ra vared kon: ";
cin>>c;
for(int u=1; u<=c; u++)
{
cout<<"lotfan Tedad dorous Nafar "<<u<<"om ra vared kon: ";
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"\n Lotfan nomre Dars "<<i<<"om ra vared kon: ";
cin>>d;
sum=d+sum;
}
avg=sum/n;
cout<<"\n MOadele daneshjou "<<u<<"om = "<<avg<<endl;
}
getchar ();
return 0;
}

mahak006
پنج شنبه 02 آذر 1391, 18:36 عصر
گذشته از سوء تفاهمایی که پیش اومد و الحمدالله رفع شد ، من برنامه رو نوشتم اجرام میشه ولی یه مشکل هست اینکه معدل نفر اول و درست حساب می کنه ولی بقیه رو اشتباه (میبینی معدل یک نفر میشه 17 میزنه 36 یا 54) ؟
اینم کد:
#include "stdafx.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
float d=0, avg=0, sum=0;
int n,c;
cout<<"Lotfan Tedad Daneshjou ra vared kon: ";
cin>>c;
for(int u=1; u<=c; u++)
{
cout<<"lotfan Tedad dorous Nafar "<<u<<"om ra vared kon: ";
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"\n Lotfan nomre Dars "<<i<<"om ra vared kon: ";
cin>>d;
sum=d+sum;
}
avg=sum/n;
cout<<"\n MOadele daneshjou "<<u<<"om = "<<avg<<endl;
}
getchar ();
return 0;
}

دلیلش اینه که تو شروع حلقه ای که بره نفر جدید هست باید مقادیر رو به صفر برگردونی .یعنی sum=0

مسعود اقدسی فام
پنج شنبه 02 آذر 1391, 19:03 عصر
همیشه برای هر نفری باید مجموع نمراتش رو جدا حساب کنیم دیگه. واسه همین همونطور که دوستمون گفتن sum = 0 رو به جای اینکه اون بالا باشه، باید داخل حلقه و همونجایی که n رو می‌گیری بذاری. اینطوری برای هر دانشجو sum صفر می‌شه و جمع درستی از نمره‌ها به دست می‌یاد.

DELTANG_Programmer
پنج شنبه 02 آذر 1391, 20:46 عصر
سلام خدمت دوستان عزیز
خوشبختانه با راهنمایی کاملتون برنامه رو اجرا کرد، از همه بخصوص آقا مسعود تشکر می کنم.
فقط یه مشکل که همیشه دارم اینه که صفحه بعد از اتمام کار ناپدید میشه و بعضی اوقات نمیشه نتیجه رو مشاهده کرد از getchar(); هم استفاده می کنم ولی بیشتر اوقات درست نمیشه... اون گزینه press any key رو چه طوری میشه ظاهر کرد؟
بازم از همه ممنونم بخاطر پاسخاتون

مسعود اقدسی فام
پنج شنبه 02 آذر 1391, 20:49 عصر
سلام خدمت دوستان عزیز
خوشبختانه با راهنمایی کاملتون برنامه رو اجرا کرد، از همه بخصوص آقا مسعود تشکر می کنم.
فقط یه مشکل که همیشه دارم اینه که صفحه بعد از اتمام کار ناپدید میشه و بعضی اوقات نمیشه نتیجه رو مشاهده کرد از getchar(); هم استفاده می کنم ولی بیشتر اوقات درست نمیشه... اون گزینه press any key رو چه طوری میشه ظاهر کرد؟
بازم از همه ممنونم بخاطر کمکهاتون
خواهش می‌کنم. برای اجرای برنامه به جای F5 ترکیب Ctrl + F5 رو بزن. یا از منو Start without Debugging

vahid_fathi
جمعه 03 آذر 1391, 00:30 صبح
فقط یه مشکل که همیشه دارم اینه که صفحه بعد از اتمام کار ناپدید میشه و بعضی اوقات نمیشه نتیجه رو مشاهده کرد از getchar(); هم استفاده می کنم ولی بیشتر اوقات درست نمیشه... اون گزینه press any key رو چه طوری میشه ظاهر کرد؟
بازم از همه ممنونم بخاطر پاسخاتون

به غیر از ctrl+f5 که عبارت ...press any رو میاره میتونی از دستور ()get.cin استفاده کنی.