PDA

View Full Version : اررورهای برنامه



fshb_ 1370
یک شنبه 18 مهر 1389, 08:56 صبح
سلام
چطوری میتونم error های این کد رفع کنم؟
فک کنم مشکل از اینجاست که نمیتونه متغیر size رو به عنوان سایز آرایه بگیره، درسته؟



#include<iostream>
using namespace std;
int Fill_array(double arr[],int size);
void show_array(double arr[],int size);
void Reverse_array(double arr[],int size);
const int size=10;
int main()
{
double a[size];
int s=Fill_array(a,size);
cout<<"the counting of numbers:"<<s<<endl;
show_array(a,s);
Reverse_array(a,s);
cout<<"after reverse:\n";
show_array(a,s);
}
int Fill_array(double arr[],int size)
{
cout<<"enter numbers:\n";
int count=0;
cout<<"arr[0]=";
while(cin>>arr[count])
{
count++;
cout<<"arr["<<count<<"]=";
}
return count;
}
void show_array(double arr[],int size)
{
for (int i=0;i<size;i++)
cout<<"arr["<<i<<"]="<<arr[i]<<endl;
}
void Reverse_array(double arr[],int size)
{
int j=0;
double arr_reverse[size];
for(int i=size-1;i>=0;i--)
{
arr_reverse[j]=arr[i];
j++;
}
}

مشکل از تابع Reverse_array.

Salar Ashgi
یک شنبه 18 مهر 1389, 10:17 صبح
کد زیر اشتباهه ، چون سایز یک آرایه استاتیک باید از قبل مشخص باشه :


double arr_reverse[size];//wrong
double arr_reverse[10];//True

یه مشکل دیگه اینکه تابع Rev شما Void تعریف شده و هیچ مقداری رو نه چاپ میکنه و نه بر میگردونه !!!؟؟؟
خوب الان این آرایه arr_reverse تکلیفش چیه ؟! چطوری باید بهش دسترسی داشت ؟! کدتون اشتباه
هستش .
اگه فقط میخواین چاپ کنید معکوس آرایه را :


#include <iostream>
#include <conio>
void Rev(int a[],int n){
for(int i=n-1;i>=0;i--)
cout<<a[i]<<" ";
cout<<endl;}
int main(){
int a[]={2,5,7,3,27,21};
Rev(a,6);
getch();
}

و اگه میخواین نتیجه بشکل یک آرایه جدید Return بشه :


#include <iostream>
#include <conio>
int* Rev(int a[],int n){
int *res = new int[n];
for(int i=n-1;i>=0;i--)
res[n-1-i] = a[i];
return res;}
//=======================
int main(){
int a[]={2,5,7,3,27,21};
int *b = Rev(a,6);
for(int i=0;i<6;i++)
cout<<b[i]<<" ";
getch();
}


موفق باشید ./

sh4mid
یک شنبه 18 مهر 1389, 10:41 صبح
سلام
مشکل که زیاد داره
تو C نمی تونی آرایه رو این جوری تعریف کنی


double arr_reverse[size];
اگه تو خط اول همچین چیزی تعریف کردی


double a[size];
و Compiler خطایی نداده(تازه اگه جدید باشه وگرنه همین تکه هم تو قدیمی ها ازش خطا می گرفت) بخاطر اینه که دو خط بالاتر متغیر size رو ثابت در نظر گرفتی
راستی اعلان توابع رو می تونی اینجور هم بنویسی


int Fill_array(double [],int );
بریم سروقت اولین تابع :لبخند:


int Fill_array(double arr[],int size)
{
cout<<"enter numbers:\n";
int count=0;
cout<<"arr[0]=";
while(cin>>arr[count])
{
count++;
cout<<"arr["<<count<<"]=";
}
return count;
اینجا تابعی داریم که قراره یک آرایه رو با اعداد ورودی ما پر کنه ، خب در لیست پارامترها ما size رو داریم ولی تو بدنه تابع ازش استفاده نشده پس اصلا چرا تعریف شده؟
اگر می خواهی که کاربر تعداد نا مشخص عدد رو وارد کنه میتونی اول اون تعداد رو ازش بگیری بعد تو یه حلقه for اون اعداد رو بخونی.
راستی این مدل خوندن عدد


while(cin>>arr[count])
بدرد وقتی می خوره که داری از یه فایل میخونی برای خوندن از Consol زیاد جالب نیست:متفکر:
بریم سروقت تابع reverse


void Reverse_array(double arr[],int size)
{
int j=0;
double arr_reverse[size];
for(int i=size-1;i>=0;i--)
{
arr_reverse[j]=arr[i];
j++;
}
}

تعریف متغیر غلطه ، بالا گفتم
بحث دیگه اینه متغیر arr_reverse یک متغیر محلی هست یعنی بازه تعریفش (scope ) داخل تابع هست (مقدار این متغیر فقط داخل تابع معنا دار است) نتیجه اینه که وقتی این تابع رو فراخوانی میکنید مقدار arr تغییر نمیکنه .
یک روش برای حل این موضوع


void Reverse_array(double arr[],double arr2[],int size)
{
int j=0;
//double arr_reverse[::size];
for(int i=size-1;i>=0;i--)
{
//arr_reverse[j]=arr[i];
arr2[j]=arr[i];
j++;
}
}
البته مثلا میتونی تو همون تابع خودت دوباره یک حلقه دیگه بگذاری و .... :لبخند:

راستی چرا از Vector استفاده نمی کنی :متفکر::متفکر::متفکر:

Kubuntu
یک شنبه 18 مهر 1389, 12:05 عصر
سلام
چطوری میتونم error های این کد رفع کنم؟
فک کنم مشکل از اینجاست که نمیتونه متغیر size رو به عنوان سایز آرایه بگیره، درسته؟



#include<iostream>
using namespace std;
int Fill_array(double arr[],int size);
void show_array(double arr[],int size);
void Reverse_array(double arr[],int size);
const int size=10;
int main()
{
double a[size];
int s=Fill_array(a,size);
cout<<"the counting of numbers:"<<s<<endl;
show_array(a,s);
Reverse_array(a,s);
cout<<"after reverse:\n";
show_array(a,s);
}
int Fill_array(double arr[],int size)
{
cout<<"enter numbers:\n";
int count=0;
cout<<"arr[0]=";
while(cin>>arr[count])
{
count++;
cout<<"arr["<<count<<"]=";
}
return count;
}
void show_array(double arr[],int size)
{
for (int i=0;i<size;i++)
cout<<"arr["<<i<<"]="<<arr[i]<<endl;
}
void Reverse_array(double arr[],int size)
{
int j=0;
double arr_reverse[size];
for(int i=size-1;i>=0;i--)
{
arr_reverse[j]=arr[i];
j++;
}
}
مشکل از تابع Reverse_array.
مشکلش بخاطر نحوه تعریف size است که وقتی می خواهید آنرا خارج از تابع تعریف کنید باید از define استفاهده کنید const برای داخل تابع استفاده می شود.
پس:

const int size=10تغییر پیدا کنه به:

#define size 10** بدون سمی کالن.

بقیه کدهاتون رو نگاه نکردم چون مشکل سایز فقط در نوع تعریف است.
موفق باشید

fshb_ 1370
یک شنبه 18 مهر 1389, 19:14 عصر
ممنون از همه دوستان.
استفاده از حافظه dynamic راه خیلی خوبی بود ولی اگر بخوام تابع رو بدون استفاده از تعریف اشاره گر بنویسم، مشکل پیش میاد.
در تابع reverse_array اگر تعداد element های آرایه زوج باشه مقادیر وسط رو نمیتونه جابه جا کنه، به خاطر اینکه 2بار از روی آنها رد میشه. حالا من بدون اسنفاده از شرط چطور میتونم این مشکل حل کنم؟



void reverse_array(double arr[],int size)
{
double r;
for (int i=size-1;i>0;i--)
{
r=arr[i];
arr[i]=arr[size-i-1];
arr[size-i-1]=r;
}
for (int i=0;i<size;i++)
cout<<"ar["<<i<<"]="<<arr[i]<<endl;
}

Salar Ashgi
یک شنبه 18 مهر 1389, 21:52 عصر
خیلی ساده :


#include <iostream>
#include <conio>
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;}
//======================
void Rev(int a[],int n){
for(int i=0;i<n/2;i++)
swap(a[i],a[n-1-i]);
}
//======================
int main(){
int a[]={6,7,8,9,24};
for(int i=0;i<5;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"-------------\n";
Rev(a,5);
for(int i=0;i<5;i++)
cout<<a[i]<<" ";
getch();
}