PDA

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



fereshtte
چهارشنبه 23 اردیبهشت 1388, 17:35 عصر
من توی سیستمم ویندوز نمی تونم نصب کنم و فقط لینوکس دارم
قبلا توی ویندوز با توربو برنامه می نوشتم و حالا برای نوشتن توی لینوکس از code blocked IDE استفاده می کنم
اما یه سوال دارم
من برنامه ای نوشتم که خیلی خوب هم کامپایل میشه اما وقتی اجرا میشه و ورودی رو وارد می کنم در خروجی nan چاپ میشه!!!!
من نمی دونم واقعا چرا اینجوری میشه! در حالی که همین برنامه رو وقتی به دوستم دادم و در ویندوز تست کرد می گفت قشنگ جواب میده!
این هم کدهام


float avrg(float,float,float,float);

#include<iostream>
using namespace std;
int main()
{
float x,y,z,w;
cout<<"inter 4 number:";
cin>>x>>y>>z>>w;
cout<<"avrg(x,y,z,w) is : "<<avrg(x,y,z,w);
}

float avrg(float a, float b, float c, float d)
{
float sum=0;
sum=a+b+c+d;
float avg=sum/4;
}

در خروجی:

inter 4 number: 1 2 3 4
avrg(x,y,z,w) is : nan

تابع هم این بود که میانگین چهار عدد رو می خواهیم حساب کنیم!

خواهش می کنم راهنمایی کنید. چند روزی هست دنبالش هستم و حتا چندتا تابع دیگه هم که تعریف می کنم با همین nan روبرو میشم! من تازه شروع کردم با c++ کار کنم و حالا هم شانس من اینجوری میشه:ناراحت: البته این رو هم بگم! همه ی این برنامه هام اینجوری نمیشه. مثلا تابع فاکتوریل رو که نوشتم قشنگ اجرا میشد و برام حساب می کرد. اما دو سه تا تابعی که نوشتم این جوری شده!

ممنون میشم اگه کسی کمکم کنه.

PC2st
چهارشنبه 23 اردیبهشت 1388, 18:55 عصر
خب تابع avrg به لحاظ گرامری اشتباه است. بجای این خط:

float avg=sum/4;
باید اینطور می‌نوشتی:

return sum/4;
عجیب اینه که تو ویندوز این برنامه خروجی داده!! شاید بخاطر بهینه‌سازی‌های turbo c بوده!! (که نباید این اجازه رو میداده). کامپایلر gcc تو لینوکس هم اخطار میده واسه این مورد:

sample.cxx: In function ‘float avrg(float, float, float, float)’:
sample.cxx:18: warning: unused variable ‘avg’
sample.cxx:19: warning: control reaches end of non-void function
واسه کامپایل تو لینوکس می‌تونی پارامتر Werror- رو به کامپایلر بدی تا از کوچکترین اخطارها هم نگذره:

g++ -Wall -Werror sample.cpp -o sample

fereshtte
چهارشنبه 23 اردیبهشت 1388, 20:02 عصر
یک دنیا تشکر بابت راهنمایی

یه سوال؟
من اگه بخوام توی برنامه ی code: :blockes IDE خودش همین خطاها رو بگیره و در حین اجرا اون مشکل دیگه پیش نیاد، میشه کاری کرد؟
یعنی این دستوری که شما گفتید فقط توی ترمینال جواب میده و ارورها رو نشون میده. نمیشه توی خود همونcode: :blockes IDE خطاهام رو نشون بده؟

از طرفی من این برنامه رو نوشتم اما باز هم با خروجی nan روبرو میشه وقتی ورودی رو وارد می کنم!!! تابع ترکیب هست که نوشتم:


سوالش هم این بود:
تابع ترکیب
c(n,k)
را با استفاده از رابطه ی زیر بدست آورید:

c(n,k)=p(n,k)/k!



int fact(int);
float perm(int,int);
float tarkib(float,float);

#include<iostream>
using namespace std;
int main()
{
int n,k;
cout<<"inter (p,k):";
cin>>n>>k;
cout<<"perm is : "<<tarkib(n,k);
}

int fact (int n)
{
int f=1;

for(int i=n; i>1 ; i--)
f*=i;
}


float perm(int z, int w)
{
int n,k;
if (k>n || n<0 || k<0) return 0;
return fact(n)/fact(n-k);
}

float tarkib (float a, float b)
{
int n,k;
if(k=0) return 0;
return perm(n,k)/fact(k);
}
اما return رو هم گذاشتم


و همین طور برنامه ی حجم کره رو نوشتم اما در خروجی مثلا وقتی 1 رو وارد می کنم اینها میاد:7.22213e-14-
البته هر دفعه که عدد 1 رو وارد می کنم هر دفعه یک نوع خروجی ظاهر میشه و اعداد با هم فرق داره. در حالی که من هر دفعه 1 رو به عنوان ورودی میدم


double hajm(float);

#include<iostream>
using namespace std;
int main()
{
int d;
cout<<"inter a shoae: ";
cin>>d;
cout<<"hajm kore is :"<<hajm(d);
}

double hajm(float d)
{
float v,r;
v=4/3*3.14*r*r*r;
return v;
}


ممنون میشم راهنماییم کنید

PC2st
چهارشنبه 23 اردیبهشت 1388, 21:12 عصر
متاسفانه الان code::block رو سیستم بهش دسترسی ندارم ولی قبلا که باهاش کار کرده بودم یادم میاد از قسمت تنظیمات جایی واسه تنظیم این مورد داشت.

این برنامه تابع ترکیب که از پای بست ویران است. تو این تابع:


float perm(int z, int w)
{
int n,k;
if (k>n || n<0 || k<0) return 0;
return fact(n)/fact(n-k);
}پارامترهای z و w بعنوان پارامترهای اول و دوم انتخاب شدند ولی بعدش تو هیج جای کد ازشون استفاده نشده! بجاش از متغیرهای n و k بترتیب استفاده شده در حالیکه این دو متغیر هنوز مقدار دهی اولیه هم نشده‌اند. برای کوچکترین تغییر، میشه خط اول پیاده‌سازی رو به این شکل تغییر داد:

int n=z, k=w;یا اینکه اصلا متغیرهای n و k رو حذف کنی و بترتیب بجاشون z و w بزاری و البته خط تعریف متغیرهای n و k (خط اول) هم باید کلا حذف بشه.
و همچنین تو تابع tarkib هم همین مشکل وجود داره.

واسه برنامه حجم کره هم دقیقا همین مشکل وجود داره، اصلا متغیر d که تو اعلان تابع hajm بعنوان پارامتر تعریف شده، اما هنوز مقدار دهی اولیه نشده و همچنین متغیر r که تو بدنه تابع تعریف شده هم مقدار دهی نشده، واسه حل این مشکل، کلا بجای متغیر r باید متغیر d رو بگذاری و البته حرف r رو از خط تعریف متغیرهای داخل بدنه تابع برداری، چیزی مثل این:

double hajm(float d)
{
float v;
v=4/3.0F*3.14F*d*d*d;
return v;
}وقتی d بعنوان یک پارامتر برای تابع تعریف شده، در واقع در کل بدنه تابع قابل استفاده است. و همچنین بهتر است که بجای 3.14 بنویسید 3.14F چون بطور پیش‌فرض 3.14 از نوع double در نظر گرفته می‌شود نه float. پس در صورت استفاده نکردن از F یک عمل تبدیل (double به float) صورت می‌گیرد. البته به احتمال زیاد کامپایلر از قابلیت بهینه‌سازی خود استفاده کرده و دیگر این عمل تبدیل را انجام نخواهد داد (خودش تشخیص میده).

ویرایش: همچنین عدد 3 باید به 3.0F تغییر پیدا کنه تا نتیجه تقسیم ۴ بر ۳ عدد اعشاری در بیاد. چون در غیر اینصورت نتیجه تقسیم دو عدد صحیح، یک عدد صحیح خواهد بود.

fereshtte
چهارشنبه 23 اردیبهشت 1388, 22:08 عصر
int fact(int);
float perm(int,int);
float tarkib(float,float);

#include<iostream>
using namespace std;
int main()
{
int n,k;
cout<<"inter (n,k):";
cin>>n>>k;
cout<<"tarkib is : "<<tarkib(n,k);
}

int fact (int n)
{
int f=1;

for(int i=n; i>1 ; i--)
f*=i;
}


float perm(int z, int w)
{
if (z>w || z<0 || w<0) return 0;
return fact(z)/fact(z-w);
}

float tarkib (float a, float b)
{

if(b=0) return 0;
return perm(a,b)/fact(b);
}


من کدهامو این طور تغییر دادم اما همچنان nan ظاهر میشه.

PC2st
چهارشنبه 23 اردیبهشت 1388, 23:59 عصر
بله، الان که دقت کردم، تابع fact هیچ مقداری رو برنمیگردونه و تو تابع tarkib هم برای مقایسه به اشتباه از = استفاده شده درحالیکه باید از == استفاده میشد و تو تابع perm هم باید z<w کنترل بشه نه z>w...! سرجمع کد اینطور میشه:


int fact (int n)
{
int f=1;

for(int i=n; i>1 ; i--)
f*=i;
return f;
}و ...

float perm(int z, int w)
{
if (z<w || z<0 || w<0) return 0;
return fact(z)/fact(z-w);
}
و ...

float tarkib (float a, float b)
{

if(b==0) return 0;
return perm(a,b)/fact(b);
}اینبار برنامه رو تست کردم، فکر نمیکنم دیگه مشکلی داشته باشه.
احتمالا خیلی تو کد نوشتن عجله می‌کنید، قبل از هر خط کدی که نوشته میشه، خوبه که بعد از اطمینان کامل به درستی اون، تایپش کرد. در غیر اینصورت، رفع ایرادها سخت‌تر خواهد بود. موفق باشید.

fereshtte
پنج شنبه 24 اردیبهشت 1388, 22:09 عصر
سلام

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

آخه می دونید چیه؟ من دو ترم قبل سی پلاس پلاس رو پاس کردم! اما چه پاس کردنی! یه دونه برنامه هم ننوشته بودم و اصلا نمی دونستم توربو چیه:ناراحت:
و همین جوری کتاب رو خوندم و رفتم امتحان دادم و شانسی!!! قبول شدم

اما لینوکس کار هستم. بعد از وارد شدن به لینوکس و کمی حرفه ای شدن تصمیم گرفتم درست ازش استفاده کنم!

این شد که با تحقیق های خیلی زیاد! به این نتیجه رسیدم که پایتون رو یاد بگیرم و بعد از اون هم انشالله GTk. مرجع انگلیسی داشتم از پایتون.
شروع خوبی داشتم و کمی پیش می رفتم اما هر چی جلوتر رفتم کار برام سخت تر شد. رسیدم به توابع و شی گرایی!

که دیدم نه! واقعا هنوز نمی دونم شی گرایی چیه! و تا حالا تو عمرم تابع هم ننوشته بودم.

یکی از دوستان منو راهنمایی کردن که اول بیام همین سی پلاس پایه ی خودمون رو بخونم بعد برم تو خط پایتون.

من عاشق پایتون شدم و خیلی دوست دارم یاد بگیرمش. و البته الان هم هزار در صد دوست دارم سی پلاس پلاس رو آنقدر خوب یاد بگیرم که چشم بسته کد بزنم.

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

باز هم سپاس از شما.
شاید البته باز هم سوال های فراوانی برام پیش بیاد و بااجازتون تو همین تاپیک مطرح می کنم.
البته قبلش روی برنامه هایی که می نویسم میخوام خیلی بیشتر از اینا وقت بزارم و بررسیشون کنم.

fereshtte
جمعه 25 اردیبهشت 1388, 12:24 عصر
سلام

ببخشید میشه در مورد این برنامه من رو راهنمایی کنید

تابع بولی زیر را نوشته و آزمایش کنید. اگر n یک عدد مثلثی باشد،(اعداد مثلثی 0و1و3و6و10و15و21و28و36و45) این تابع مقدار یک را برگرداند وگرنه 0 برگشت داده شود:
int yonan(int n)


من این برنامه رو نوشتم اما وقتی از ورودی n رو می گیرم با توجه به اون عدد مثلثی مربوطه رو چاپ می کنه. مثلا اگه چهار رو وارد کنم در خروجی چاپ 10 چاپ میشه.


int yonan(int);

#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"inter a number:";
cin>>a;
cout<<"yonan is : "<<yonan(a);
}

int yonan(int n)
{
int f0,f1,f2,i,a;
f0=0; f1=1;

for(i=1; i<n; i++)
{
f2=f0+f1+i+1;
f1=f2;
}
return f2;


}


اما اون چیزی نمیشه که سوال خواسته بود

یک if هم توی تابع به این شکل وارد می کنم اما باز هم در خروجی هر عددی که وارد می کنم یک چاپ میشه.


int yonan(int);

#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"inter a number:";
cin>>a;
cout<<"yonan is : "<<yonan(a);
}

int yonan(int n)
{
int f0,f1,f2,i,a;
f0=0; f1=1;

for(i=1; i<n; i++)
{
f2=f0+f1+i+1;
f1=f2;
}
return f2;

if (f2=n) return true;
else return false;
}


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

PC2st
شنبه 26 اردیبهشت 1388, 01:01 صبح
ببین، قبل از هر چیز پیشنهاد می‌کنم یک بار دیگه به کتاب‌های آموزشی برنامه‌نویسی C یا ++C برگشته و اونها رو مطالعه کنید در غیر اینصورت، ممکن است بازهم به مشکل بربخورید.

اما در مورد سوال، متغیر a زیادی تعریف شده و هیچ‌کاربردی جز سیاه‌کاری نداره و در کد دومی که از شرط if استفاده کردی، دو تا ایراد وجود داره (صرف نظر از الگوریتم):
۱) در دستور شرطی واسه مقایسه f2 با n از علامت = استفاده شده، همانطور که در پست قبلی هم گفتم باید برای اینکار از علامت == استفاده کنید. باز هم میگم، در ++C برای مقایسه از = استفاده نمی‌شه، علامت = برای مقداردهی متغیرها بکار گرفته میشه. برای اینکه این نکته رو فراموش نکنی، بهتره علامت == رو با علامت =! حفظ کنی. همانطور که احتمالا مطلع هستید، علامت =! در صورتی مقدار درست برمی‌گردونه که مقدار چپ با مقدار راست برابر نباشد.
۲) قبل از عمل شرطی if از دستور return استفاده شده... پس، هر وقت اجرای برنامه به دستور return می‌رسه، اجرای برنامه از تابع خارج میشه و بالطبع، هیچگاه کنترل برنامه به دستور if نمی‌رسه. یعنی دستور if بلااستفاده باقی می‌مونه.

بطور خلاصه، واسه اینکه برنامه، یک عدد رو بگیره و اگه جزء اعداد مثلثی خیام بود ۱ و در غیر اینصورت ۰ چاپ بشه. در اینصورت بهتره از یک تابع دیگه استفاده بشه (یک تابع جدید ایجاد کنین) و درونش از یک حلقه for استفاده کنین که مثلا نام متغیر شمارنده‌اش رو i بگذارین و یک بازه (range) مناسب رو براش انتخاب کنین:

for (int i = ...
در این حلقه همواره مقدار تابع yonan را روی متغیر شمارنده (مثلا i) کنترل کنین و مقدار بازگشتی حاصل ((yonan(i) رو با عددی که کاربر وارد کرده مقایسه کنین. اگه مقدار بازگشتی با مقداری که کاربر وارد کرده برابر شد، پس عددی که کاربر وارد کرده جزء اعداد مثلثی خیام است و از حلقه for خارج میشید در غیر اینصورت ...

fereshtte
دوشنبه 28 اردیبهشت 1388, 10:27 صبح
اگه بخوام تابع exit رو استفاده کنم باید چه نوع سر فایلی تعریف کنم تو لینوکس؟
توی ویندوز از

#include<cstdlib>
استفاده می کردیم. اما تو لینوکس ارور میگیره

حامد مصافی
دوشنبه 28 اردیبهشت 1388, 11:11 صبح
#include <stdlib.h>

fereshtte
دوشنبه 28 اردیبهشت 1388, 13:18 عصر
این برنامه رو دوستم توی ویندوز با توربو تست کرده و دقیقا جواب میده. و ریشه ی صحیح عدد رو بر می گردونه. اما تو لینوکس واسه من cout<<i رو ارور می گیره کامپایل!!!


#include<iostream>
using namespace std;
int main()
{
int n;
cout<<"inter a number:" ;
cin>>n;
for(int i=n/2; i>=1; i--)
{
int z;
z=i*i;
if(z<=n) break;
}
cout<<i;
}


ممنون میشم راهنمایی کنید

حامد مصافی
دوشنبه 28 اردیبهشت 1388, 13:46 عصر
#include<iostream>
using namespace std;
int main()
{
int n;
cout<<"enter a number:" ;
cin>>n;

int i;
for(i=n/2; i>=1; i--)
{
int z;
z=i*i;
if(z<=n) break;
}
cout<<i;
}

fereshtte
چهارشنبه 30 اردیبهشت 1388, 20:37 عصر
int index(int,int[],int);

#include<iostream>
using namespace std;
int main()
{
int a[]={22,44,66,88,44,66,55};
cout<<"index(40,a,7) is = " <<index(44 ,a,7);


}

int index(int x, int a[], int n)
{
for(int i=0; i<n; i++)

if (a[i]==x) return i;
return n;


}

این برنامه دقیقا چیزی هست که تو کتاب نوشته! اما خروجی نداره. کدهاش رو چک می کنم اما ایرادش نمی دونه چیه!
برنامه ی جستجوی دودویی هست.
اگه میشه راهنمایی کنید. مرسی