نمایش نتایج 1 تا 39 از 39

نام تاپیک: کمک در کار کردن با فایلها 2

  1. #1

    کمک در کار کردن با فایلها 2

    با سلام به همه شما برنامه نویسان عزیز
    من در حال نوشتن برنامه ای هستم که در آن یک فایل که حاوی تعدادی عدد اعشاری (حداکثر 658800) را از ورودی بخواند ابتدا تمام اعداد را دو به دوبه صورت زیر جعع کند وحاصل را درستون دوم آرایه دو بعدی ذخیره کند :

    B[0][0] = a[0]+a[1] b[1][0] =a[1] +a[2] b[2][0] = a[2]+a[3] b[3][0] = a[3]+a[4] …..

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

    B[0][1] = a[0] + a[1]+a[2] b[1][1]= a[1] + a[2]+a[3] B[2][1] = a[2] + a[3]+a[4] ….

    سپس اعداد را چهار به چهار به صورت زیر جمع کند و وحاصل را درستون چهارم آرایه دو بعدی ذخیره کند :

    B[0][2] = a[0] + a[1]+a[2]+a[3] b[1][2]= a[1] + a[2]+a[3]+a[4] B[2][2] = a[2] + a[3]+a[4]+a[5] ….

    وهمین جوری تا 366 تا 366 جمع کند وحاصل را ستون 366 آرایه دو بعدی ذخیره کند
    ضمنا در ستون اول آرایه خود اعداد باید ذخیره شوند
    سپس آرایه را به صورت نزولی مرتب کند و 20 سطر اول آرایه را چاپ کند ضمنا بعد از مرتب سازی باید در هیچ ستونی اعداد تکراری قرار نگیرد
    من آن را به صورت زیر نوشتم ولی درست کار نکرد
    فکر می کنید مشکل از کجاست؟

    #include<iostream.h>
    #include<stdlib.h>
    #include<fstream.h>
    #include<string.h>

    void main(void)
    {
    void de_allocate(float **);
    ifstream numfile("num.TXT");
    ofstream outnumfile1("result1.XLS");
    ofstream outnumfile2("result2.XLS");
    int i,j,k,n,count=1;

    char** a;
    float** b;
    float temp,sum;
    cout<<"Enter Number Of Data:";
    cin>>n;
    /************************************************** **************************/

    a=new char*[n]; // SET UP THE ROWS FOR ARRAY A[]

    b = new float*[n]; // STEP 1: SET UP THE ROWS FOR ARRAY B[][]
    for (j = 0; j < n; j++)
    b[j] = new float[366];// STEP 2: SET UP THE COLUMNS FOR ARRAY B[][]



    /************************************************** **************************/
    for(i=0;i<n;i++)
    {
    char *word=new char[10];
    numfile>>word;
    a[i] = word;
    }

    /************ convert string to float ********/
    float *c=new float [n];
    for(i=0;i<n;i++)
    c[i]=atof(a[i]);

    /************************************************** **************************/


    for (j=0;j<366;j++)
    for (i=0;i<n;i++)
    {
    sum=0;
    for (k=0;k<=count;k++)
    {
    sum=sum+c[k];
    }
    b[i][j]=sum;
    count+=1;
    }
    /************************************************** **************************/

    for (j=0;j<=366;j++)
    for (i=0;i<=n;i++)
    for (k=0;k<n-i;k++)
    if(b[k][j]<b[k+1][j])
    {
    temp=b[k][j];
    b[k][j]=b[k+1][j];
    b[k+1][j]=temp;

    }
    /********** Export sort array to file **********/
    for(i=0;i<20;i++)
    for(j=0;j<183;j++)
    {
    outnumfile1<<b[i][j]<<"\t";
    if(j==183-1)
    outnumfile1<<endl;
    }

    for(i=0;i<20;i++)
    for(j=184;j<=366;j++)
    {
    outnumfile2<<b[i][j]<<"\t";
    if(j==183-1)
    outnumfile2<<endl;
    }
    /************************************************** **************************/

    delete [] a;
    de_allocate(b);
    }
    /************************************************** **************************/

    void de_allocate(float **b) {
    for (int i = 0; i < 366; i++)
    delete[] b[i]; // STEP 1: DELETE THE COLUMNS

    delete[] b; // STEP 2: DELETE THE ROWS
    }
    /************************************************** *************************/
    ممنون

  2. #2
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    طبق این مثالی که زدید که در ابتدا دو به دو و بعد سه به سه و .... اعداد باید جمع بشن شما اومدید در هر مرحله مثلا مرحله اول اینجوری نوشتی
    B[0][1] = a[0]+a[1] b[1][0] =a[1] +a[2] b[2][0] = a[2]+a[3] b[3][0] = a[3]+a[4] …..
    تو مرحله دو اینجوری
    B[0][1] = a[0] + a[1]+a[2] b[1][1]= a[1] + a[2]+a[3] B[2][1] = a[2] + a[3]+a[4] ….
    و .....
    تو هر مرحله هم وقتی اعداد رو جمع کردی ریختی تو همون خونه ای که در مرحله قبل جمع اون رو حساب کردی و جواب قبلی رو از بین بردی .
    به طور مثال گفتی :

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




    B[0][1] = a[0] + a[1]+a[2] b[1][1]= a[1] + a[2]+a[3] B[2][1] = a[2] + a[3]+a[4] ….
    نوشتی که باید حاصل جمع ها در ستون سوم آرایه ذخیره بشه ولی همه رو تو ستون اول ریختی و بقیه هم به همین شکل
    میشه بیشتر توضیخ بدی.من که چیزی نفهمیدم. ضمنا آیا b و B دو آرایه جدا هستند؟

  3. #3

    تصحیح

    با تشکر از شما دوست گرامی و پوزش به خاطر اشتباه در ارسال
    بله من منظور را به درستی نرساندم
    منظور من این بود که ابتدا اعداد را دو به دو جمع کند یعنی عدد اول را بادوم سپس عدد دوم را با سوم و بعد عدد سوم را با چهار به همین ترتیب عدد یکی مانده به آخر را با آخر جمع کند و سپس آنها را در یک ستون دوم از آرایه ای دوبعدی (همان b) که تعریف کردیم ذخیره کند
    به همین ترتیب سپس اعداد را سه به سه جمع کند یعنی عدد اول را با عدد دوم وسپس با عدد سوم جمع کند در واقع ابتدا سه عدد اول را جمع کند سپس سه عدد دوم را جمع کند وهمین طوری تابه آخر
    این روند تا 366 ادامه می یابد یعنی در ستون 367 ودر سطر اول این ستون ([b[0][366) عددی که حاصل جمع 366 عدد اول فایل است قرار می گیرد و به همین منوال در سطر دوم این ستون عددی که حاصل جمع366 عدد دوم این فایل است قرار می گیرد الی آخر

    سپس ما آرایه را مر تب میکنیم به صورتی که در تمام ستون ها تکراری نباشد و بیست ستون اول این آرایه مرتب شده را در دو فایل اکسل چاپ می کنیم
    امیدوارم توانسته باشم منظور را رسانده باشم
    در ضمن b همان B است
    نوشته قبلی را نیز تصحیح کردم
    ممنون

  4. #4
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    خوب زیاد وقت نکردم درست کدت رو نگاه کنم ولی اون حلقه for ایی که کار جمع رو انجام میده فکر میکنم خیلی مشکل داشته باشه یه چکی بکن. به طور مثال اول حلقه نوشتی

    for (j=0;j<366;j++)

    الان اگه به فرض 10 تا عدد داشته باشیم حلقه تا 366 تکرار میشه که غلطه
    مشکل دیگه اینه که تو حلقه for دوم نوشتی

    for (i=0;i<n;i++)

    یعنی اگه 10 تا عدد داشته باشیم میشه i=0 تا i<10 و حالا اگه به مرحله ای برسه که بخواد 3 تا 3 تا عدد ها رو جمع کنه فقط 8 مرحله میتونه این کار رو انجام بده و برای 4 تا 4 تا , تا 7 مرحله ولی i تا 9 پیش میره و مشکلات دیگه ای هم بود که خودت برطرف کنی بهتره
    ضمنا اون قسمتی از کد رو که فکر میکنی مشکل داره بزاری بهتره لااقل خوندش راحت تره

  5. #5
    با سلام
    البته دوست عزیز من این نکته را نگفتم که حداقل تعداد اعداد 400 است یعنی از این بابت مشکلی نیست البته من کدها را باز هم اصلاح کردم ولی باز هم افاقه نکرد
    من فکر می کنم مشکل اصلی در خالی کردن حافظه است
    شما راه حلی برای خالی کردن حافظه بعد از تخصیص واجرای برنامه ندارید؟

    #include<iostream.h>
    #include<stdlib.h>
    #include<fstream.h>
    #include<string.h>

    void main(void)
    {

    ifstream numfile("num.txt");
    ofstream outnumfile1("result1.txt");
    ofstream outnumfile2("result2.txt");
    int i,j,k,n,count=1;

    char** a;
    double** b;
    double temp,sum;
    cout<<"Enter Number Of Data:";
    cin>>n;
    /************************************************** **************************/

    a=new char*[n]; // SET UP THE ROWS FOR ARRAY A[]

    b = new double*[n]; // STEP 1: SET UP THE ROWS FOR ARRAY B[][]
    for (j = 0; j < n; j++)
    b[j] = new double[366];// STEP 2: SET UP THE COLUMNS FOR ARRAY B[][]



    /************************************************** **************************/
    for(i=0;i<n;i++)
    {
    char *word=new char[10];
    numfile>>word;
    a[i] = word;
    }

    /************ convert string to float ********/
    double *c=new double [n];
    for(i=0;i<n;i++)
    c[i]=atof(a[i]);

    /************************************************** **************************/
    for (i = 0; i < n; i++)
    {
    b[i][0] = c[i];
    }

    for (j=1;j<366;j++)
    {
    for (i=0;i<n;i++)
    {
    sum=0;
    for (k=0;k<=count;k++)
    {
    sum=sum+c[k];
    }
    b[i][j]=sum;
    count+=1;
    }
    }

    for (j=0;j<366;j++)
    {
    for (i=0;i<n;i++)
    {
    for (k=0;k<n-1;k++)
    {
    if(b[k][j]<b[k+1][j])
    {
    temp=b[k][j];
    b[k][j]=b[k+1][j];
    b[k+1][j]=temp;
    }
    }
    }
    }
    /********** Export sort array to file **********/
    for(i=0;i<20;i++)
    for(j=0;j<183;j++)
    {
    outnumfile1<<b[i][j]<<"\t";
    if(j==183-1)
    outnumfile1<<endl;
    }

    for(i=0;i<20;i++)
    for(j=184;j<=366;j++)
    {
    outnumfile2<<b[i][j]<<"\t";
    if(j==183-1)
    outnumfile2<<endl;
    }
    /************************************************** **************************

    delete [] a;
    de_allocate(b);*/
    }
    /************************************************** **************************

    void de_allocate(float **b) {
    for (int i = 0; i < 366; i++)
    delete[] b[i]; // STEP 1: DELETE THE COLUMNS

    delete[] b; // STEP 2: DELETE THE ROWS
    }
    ************************************************** *************************/

  6. #6
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    شما راه حلی برای خالی کردن حافظه بعد از تخصیص واجرای برنامه ندارید؟
    اصلا نیازی به نوشتن تابع برای آزاد کردن حافظه تخصیص یافته نیست چون همه آرایه ها تا آخر برنامه قراره که باقی بمونن و با تموم شدن برنامه خود حافظه ها به طور اتوماتیک آزاد میشه

  7. #7
    با سلام
    من بازهم توابع de_allocate را حذف کردم اما باز هم مشکل داشت
    به نظر شما کجای برنامه ایراد دارد؟
    من تمام برنامه را چک کردم از نظر منطقی هیچ مشکلی نباید پیش بیاید ولی باز هم درست کار نمی کند

  8. #8
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    فایل تکمیل شده برنامت و همچنین اون فایلی رو که تو برنامه می خونی رو بزار اینجا (همچنین ابعاد فایلت رو اگه خیلی بزرگه بگو) ضمنا برنامت رو Debug هم کنی باید مشخص کنه که کجا ها مشکل پیش میاد

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

  10. #10
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    برنامت رو به این شکل تغییر دادم

    #include<iostream.h>
    #include<stdlib.h>
    #include<fstream.h>
    #include<string.h>
    void main()
    {

    ifstream numfile("num.txt");
    ofstream outnumfile1("result1.txt");
    ofstream outnumfile2("result2.txt");
    int i,j,k,n,count=1;

    char** a;
    double** b;
    double temp,sum;
    cout<<"Enter Number Of Data:";
    cin>>n;
    /************************************************** **************************/
    a=new char*[n]; // SET UP THE ROWS FOR ARRAY A[]
    b = new double*[n]; // STEP 1: SET UP THE ROWS FOR ARRAY B[][]
    for (j = 0; j < n; j++)
    b[j] = new double[366];// STEP 2: SET UP THE COLUMNS FOR ARRAY B[][]
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    b[i][j]=-1;


    /************************************************** **************************/
    for(i=0;i<n;i++)
    {
    char *word=new char[10];
    numfile>>word;
    a[i] = word;
    }
    /************ convert string to float ********/
    double *c=new double [n];
    for(i=0;i<n;i++)
    c[i]=atof(a[i]);
    /************************************************** **************************/
    for (i = 0; i < n; i++)
    {
    b[i][0]=c[i];
    }
    for (j=1;j<n;j++)
    {
    count=j;
    for (i=0;i<n-j;i++)
    {
    sum=0;
    for (k=i;k<=count;k++)
    {
    sum=sum+c[k];
    }
    b[i][j]=sum;
    count+=1;
    }
    }
    for (j=0;j<n;j++)
    {
    for (i=0;i<n;i++)
    {
    for (k=0;k<n-1;k++)
    {
    if(b[k][j]<b[k+1][j])
    {
    temp=b[k][j];
    b[k][j]=b[k+1][j];
    b[k+1][j]=temp;
    }
    }
    }
    }
    /********** Export sort array to file **********/
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
    if(b[i][j]!=-1)
    outnumfile1<<b[i][j]<<"\t";
    if(j==n-1)
    outnumfile1<<endl;
    }
    }

    البته من برنامه با 366 تا ستون ننوشتم . حالا خواستی تغییر به به 366 ستون ولی فکر میکنم برای هر تعداد عددی کار کنه بهتره چون به ازای n تا عدد یه آرایه n*n نیازه. حروجی برنامه رو هم فعلا روی یک فایل txt نوشتم
    بیشتر مشکلت روی حلقه for ایی بود که کار جمع رو انجام میداد

  11. #11
    با سلام وخسته نباشید
    من تغییرات شما را وارد کردم اما باز هم موقع اجرا اررور داد و همان اررور همیشگی من این اررور را برای شما ضمیمه کردم اصلا معنی این اررور چیست ممنون میشم در این مورد هم توضیحی بدهید
    ممنون
    عکس های ضمیمه عکس های ضمیمه

  12. #12
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    معمولا exeption زمانی رخ میده که یه جاهایی از مقادیر آرایه ها خارج بشی و یا وارد حافظه های تخصیص نیافته بشی ولی من تو اجرا این کد و حتی کد های قبلیت هم مشکلی نداشتم . چند دفعه هم کد ها رو چک کردم ، دیگه فکر نکنم مشکلی توی کد باشه حالا شما یه بار برنامه رو Debug کن ببین روی کدوم خط ارور پیش میاد.

  13. #13
    دوست عزیز سلام
    در زمان کامپایل که اررور نمی دهد اما در زمان اجرا و موقع دیباگ از این قسمت ایراد می گیرد
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    b[i][j]=-1;
    فکر می کنید مشکل چیست؟
    برای شما درست کار کرد؟

  14. #14
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    سلام
    با عرض شرمندگی این قسمت برنامت رو هم تغییر بده، فراموش کردم عوض کنم چون برای تعداد بالای 366 تا به مشکل بر میخوره

    b = new double*[n];
    for (j = 0; j < n; j++)
    b[j] = new double[366];

    به جای 366 ، n قرار بده
    مشکلی که از اون خطی که گفتی میگیره باید به خاطر همین باشه

  15. #15
    با سلام خدمت شما دوست گرامی
    من برنامه را طبق نیاز خودم به صورت زیر تغییر دادم اما باز هم درمورد فایلهای خیلی بزرگ که یک نمونه را دراینجا آورده ام درست کار نکرد واررور داد
    من اررور را نیز در اینجا آورده ام تا شما ببینید مشکل از کجاست
    البته من خروجی را طبق نیاز در دوفایل قرار داده ام
    همچنین من فقط به 366 ستون اول و 20 سطر اول نیاز دارم وبقیه را برای خروجی نیاز ندارم
    در ضمن در مورد فایلهای کوچک نیز خیلی طول می کشد و بعضی اوقات نیز گیر می کند
    من فایل ورودی وفایل exe برنامه را نیز در این جا قرار دادم تا شما با آن تست کنید
    راستی شما روشی برای اینکه برنامه اینقدر طول نکشد ندارید؟
    ممنون

    #include<iostream.h>
    #include<stdlib.h>
    #include<fstream.h>
    #include<string.h>
    void main()
    {


    ifstream numfile("num.txt");
    ofstream outnumfile1("result1.txt");
    ofstream outnumfile2("result2.txt");
    int i,j,k,n,count=1;
    char** a;
    double** b;
    double temp,sum;
    cout<<"Enter Number Of Data:";
    cout<<"\n Please Wait During Process... This is Take Several Minute:\n";
    cin>>n;

    /************************************************** **************************/

    a=new char*[n]; // SET UP THE ROWS FOR ARRAY A[]
    b = new double*[n]; // STEP 1: SET UP THE ROWS FOR ARRAY B[][]
    for (j = 0; j < n; j++)
    b[j] = new double[366];// STEP 2: SET UP THE COLUMNS FOR ARRAY B[][]
    for(i=0;i<n;i++)
    for(j=0;j<366;j++)
    b[i][j]=-1;


    /************************************************** **************************/

    for(i=0;i<n;i++)
    {
    char *word=new char[10];
    numfile>>word;
    a[i] = word;
    }
    /************ convert string to float ********/

    double *c=new double [n];
    for(i=0;i<n;i++)
    c[i]=atof(a[i]);
    /************************************************** **************************/

    for (i = 0; i < n; i++)
    {
    b[i][0]=c[i];
    }
    for (j=1;j<366;j++)
    {
    count=j;
    for (i=0;i<n-j;i++)
    {
    sum=0;
    for (k=i;k<=count;k++)
    {
    sum=sum+c[k];
    }
    b[i][j]=sum;
    count+=1;
    }
    }

    /***********sort array*********/

    for (j=0;j<366;j++)
    {
    for (i=0;i<n;i++)
    {
    for (k=0;k<n-1;k++)
    {
    if(b[k][j]<b[k+1][j])
    {
    temp=b[k][j];
    b[k][j]=b[k+1][j];
    b[k+1][j]=temp;
    }
    }
    }
    }
    /********** Export sort array to file **********/

    for(i=0;i<20;i++)
    {
    for(j=0;j<183;j++)
    {
    outnumfile1<<b[i][j]<<"\t";
    if(j==182)
    outnumfile1<<endl;
    }
    }

    for(i=0;i<20;i++)
    {
    for(j=183;j<366;j++)
    {
    outnumfile2<<b[i][j]<<"\t";
    if(j==365)
    outnumfile2<<endl;
    }
    }
    }
    عکس های ضمیمه عکس های ضمیمه
    فایل های ضمیمه فایل های ضمیمه

  16. #16
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    من برنامه را طبق نیاز خودم به صورت زیر تغییر دادم اما باز هم درمورد فایلهای خیلی بزرگ که یک نمونه را دراینجا آورده ام درست کار نکرد واررور داد
    توی فایلی که گذاشتی 16461 عدد وجود داره و فکر نمیکنم کامپایلر هم بتونه یه همچین مقداری رو تخصیص حافظه کنه به خاطر همینه که توی فایل های بزرگ به مشکل بر می خوری و ممکنه سیستم با کمبود حافظه مواجه بشه
    در ضمن در مورد فایلهای کوچک نیز خیلی طول می کشد و بعضی اوقات نیز گیر می کند
    بستگی داره منظورت از فایل کوچیک چقدر باشه چون برای من هم برای 1000 تا عدد حدود 2 دقیقه ای طول کشید فکر کنم
    راستی شما روشی برای اینکه برنامه اینقدر طول نکشد ندارید؟
    برای کوتاه تر شدن زمان باید الگوریتم های خیلی بهینه تری رو استفاده کرد برای مثال همین الگوریتم Bubble Sort که برای مرتب کردن اعداد استفاده شده الگوریتم بهینه ای نیست میتونید به جای اون از Quick Sort استفاده کنید البته من همنوز این قدر با الگوریتم ها آشنایی ندارم و ممکنه الگوریتم های بهینه تری هم وجود داشته باشه البته عملیاتی که بیشتر زمان میبره همین جمع بستن هستش و شاید عوض کردن الگوریتم Sort هم زیاد محسوس نباشه ضمنا اگه نیازی به double نداری اونو به float تبدیل کن
    میتونی آرایه های a و c رو هم حذف کنی تا یه کم حجم کار بیاد پایین و بجاش اینجوری بنویس

    for(i=0;i<n;i++)
    {
    char *word=new char[10];
    numfile>>word;
    b[i][0]=atof(word);
    }


  17. #17
    به نظر شما اگه از float استفاده کنم سرعت پردازش وتخصیص حافظه را بیشتر کنم؟
    اصلا روشی وجود دارد که من بتوانم برنامه ای با سرعت بالاتر داشته باشم؟

  18. #18
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    به نظر شما اگه از float استفاده کنم سرعت پردازش وتخصیص حافظه را بیشتر کنم؟
    این کار تاثیر آنچنانی روی کار نداره ولی چون اعدادت تعداد اعشارشون کم بود گفتم که float تعریف کنی
    اصلا روشی وجود دارد که من بتوانم برنامه ای با سرعت بالاتر داشته باشم؟
    در این مورد نمیدونم الگوریتم بهتری برای این کار وجود داره یا نه.

  19. #19
    اگر ما حافظه را خالی نکنیم آیا با پایان برنامه خودبه خود قسمتهای تخصیص داده شده خالی می شوند؟

  20. #20
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    اگر ما حافظه را خالی نکنیم آیا با پایان برنامه خودبه خود قسمتهای تخصیص داده شده خالی می شوند؟
    بله خالی میشه

  21. #21
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام

    من برنامه ای خواسته بودید نوشتم و توضیحاتش هم داخلش هست.(البته یه بار Upload کرده بودم ولی نمی دونم چرا توی صفحات این عنوان نیسن!!!)

    در ضمن حافظه ای که از سیستم عامل می گیرید بسته به نوع سیستم عامل آزاد میشه یا نمیشه.
    در XP و 2000 این حافظه ها آزاد میشه (البته مستندات این سیستم عاملها این رو میگن ولی باز هم ممکنه در بعضی مواقع از دستشون در بره) ولی در سیستم عامل های قبلی مایکروسافت اینطوری نمیشه.به این اتفاق «نشت حافظه» میگن

    موفق باشید
    فایل های ضمیمه فایل های ضمیمه

  22. #22
    با تشکر از شما دوست عزیز

  23. #23
    با سلام مجدد
    من برنامه شما دوست عزیز را دیدم برنامه بسیار جالب والبته کمی پیچیده ایی نوشته اید
    من در فایل خروجی مشکل دارم
    xls من می خواستم اعداد را در ستونهایی پشت سر هم چاپ کند یعنی در فایل اکسل با پسون
    در واقع به صورت سنون به ستون (که به دو فایل اکسل نیاز است زیرا اکسل فقط 256 ستون قبول می کند)
    ونیز در ستون اول خود اعدا که از ورودی خوانده شده قرار بگیرد یعنی ما به 366 ستون نیاز دایم
    در ضمن اگر کمی درمورد کد نویسی برنامه توضیح بدهید ممنون میشم
    فکر میکنم کلاس آموزشی خوبی بشه
    ممنونم

  24. #24
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام

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

  25. #25

    درخواست

    با سلام و تشکر از شما دوست گرامی
    من از خروجی برنامه یک فایل xls را مدنظر دارم وبه نظر من بهتر است به دلیل محدودیت ستونهای اکسل آنهارا در دوفایل xls قرار دهیم من نمونه خروجی که مدنظرم است را اینجا قرار دادم تا شما منظور من را بهتر بفهمید
    همچنین من می خواستم در ستون اول فایل خروجی خود اعدادی از ورودی خوانده شده ( در واقع به شکل مرتب )
    قرار بگیرد در حقیقت ما نیازمند 366 ستون هستیم
    با تشکر از شما دوست گرامی
    فایل های ضمیمه فایل های ضمیمه

  26. #26
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    پیشنهاد من همان است که به جای استفاده از ستون ها داده ها را در ردیف ها ذخیره کنی .یعنی هر ردیف معادل یک ستون از داده ها در xls های بالا است.
    در این صورت نیاز به شکستن داده ها هم نیست.در مورد دریافت داده های اضافی هم ،من متوجه نشدم.آیا این داده ها به غیر از داده های فایل اولیه است.

  27. #27
    ba salam
    man be seton ha niaz daram
    dar zemn manzor az soton aval haman dadehaee ast ke az file vorodi khandeh meshavad

  28. #28
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام

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

    موفق باشید
    فایل های ضمیمه فایل های ضمیمه

  29. #29
    با تشکر مجدد از شما دوست گرامی

  30. #30

    فایل xls اکسل

    با سلام مجدد
    دوست عزیز من هر جه تلاش کردم از فایلهای خروجی برنامه ای که شما نوشته اید سر در نیاوردم و به نظرم اشتباه آمد در واقع آدم را به اشتباه می اندازد
    البته من برنامه قبلی خودم را یکبار دیگر اینجا قرار می دهم فقط یک مشکل دارد وآن زمان زیادی صرف می کند همچنین من در یک مورد هم با مشکل برخوردم
    مشکل من در رابطه با ستونهاست درواقع من قصد دارم اعداد تکراری هر ستون رانیز حذف کنم وبعد در فایل چاپ کنم اما هرچه کردم الگوریتم مناسبی به ذهنم نرسید
    اگر ممکن است در این مورد هم مرا راهنمایی کنید
    درمورد برنامه خودتان قبلا که گفتم من به فایل xls نیاز دارم و نیز هدف برنامه من قرار دادن اعداد در ستونهای اکسل است نه سطرها واگر ممکن است برنامه خودتان را نیز اصلاح کنید البته اگر وقت داشتید
    در ضمن از پاسخهای خوب شما دوست عزیز نیز کمال تشکر را دارم
    ممنون
    فایل های ضمیمه فایل های ضمیمه

  31. #31
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام

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

    موفق باشید.

  32. #32
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام
    این هم نظر من در مورد برنامه شما.توضیحات داخل فایل rar است.در ضمن یک پیغام خصوصی فرستادم حتما بخونید.
    موفق باشید.
    فایل های ضمیمه فایل های ضمیمه

  33. #33
    با تشکر از شما دوست گرامی به خاطر راهنمایی های خوبتون

  34. #34
    با سلام
    من فکر می کنم منظور درست نرساندنم
    هدف اصلی من ازاین پروژه(که یک پروژه دانشجویی است) قرار دادن اعداد طبق همان الگویی است که گفتم یعنی قراردادن اعداد در سلول های اکسل آن هم به طور مجزا یعنی در هر سلول فقط یک عددو نیز ذخیره اعداد در یک فایل با پسوند ایکس ال اس
    و همچنین در فایلهای برنامه شما سمی کلونها اضافی هستند وسلولها به طور مجزا تفکیک نمی شوند
    با تشکر فراوان

  35. #35
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام

    در مورد ذخیره داده ها نوشتید.فکر کنم باید چند خطی در مورد اینکه چرا من در CSV فایلها رو ذخیره کردم برایتان بنویسم.
    فایلها XLS یا همون فایلها اکسل فایلها باینری هستند که فرمت شان توسط خوده مایکروسافت ابداع شده است.حالا اگر بخواهید که داده هایتان را در XLS ذخیره کنید دو راه حل دارید:
    1)به دنیال یک library در مورد خواند xls در زبان سی (ونه ویزوال سی) باشید تا بتونید چنین فایلی را بخوانید یا ایجاد کنید (در واقع آن کتابخانه این وظیفه رو بر عهده بگیرد).البته این کتابخانه ممکن است طبعاتی به همراه داشته باشد که ساده ترین آن عدم هماهنگی با برخی محصولات مایکروسافت باشد.
    2)اما راه دوم استفاده از درایور های مایکروسافت است.در این صورت باید حتما برنامه نویسی ویزوال تحت ویندوز داشته باشید (یعنی VB یا VC یا C#‎ یا دلفی و ...).در این صورت من می توانم کمکتان کنم.البته توجه کنید که برنامه ذخیره سازی کمی پیچیده می شود.
    اما فایلها CSV که مخفف Comma separated values است یک فرمت استاندار نوشتاری (text) است برای برنامه های صفحه گسترده (مثلا Office Excel یا OpenOffice Calc) که در آن خانه ها هر سطر با Comma و هز ردیف با کارکتر انتهای خط مشخص می شود (بهتر است حتما در گوگل به دنبال CSV Format بگردید تا اطلاعات تکمیلی بدست آورید).در نتیجه این فایل را شما بدون استفاده از ابزار یا کتابخانه ای می توانید تولید کنید (حتی در سی) و تبدیل به فرمت مناسب برای نمایش به عهده فرم افزار خواننده (در اینجا اکسل) است.البته من نمی دانم چرا در اکسل من (Excel 2003) برای جدا کردن ستونها در فایلها CSV از سمی کالون (;) به جای کاما (,) باید استفاده کنم.برنامه را هم بر این مبنی نوشته ام.البته در سیستم شما به نظر می رسد باید از همان کاما استفاده کنید پس می توانید برنامه های بالا را در قسمت خروجی فایلشان تصحیح کنید (به جای سمی کالون از کاما استفاده کنند).
    در هر حال تصمیم گیری به عهده شماست ولی اگر فقط هدف دیدن داده ها به صورت مناسب در اکسل است ،من همچنان CSV را پیشنهاد می کنم.چون هم برنامه نویسی آن ساده تر است و هم هماهنگی آن با برنامه های صفحه گسترده، بیشتر است.

    باز هم می توانید روی کمک من حساب کنید.
    موفق باشید

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

  37. #37
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام

    من برنامه شما را مطالعه کردم.ایراد این برنامه در خط 57 یعنی عبارت :
    sort(c,n);

    بود.توجه کنید که شما داده ها را بعد خواندن ، در آرایه c ذخیره می کنید.سپس اقدام به مرتب سازی آنها و ذخیره داده ها در فایل می نمایید.سپس به محاسبات اصلی می پردازید.در این محاسبات اگر تعداد داده های ورودی تعییر کند یا جای حتی 2 داده عوض شود جواب خروجی تغییر می کند و شما عملا تمام داده ها را با مرتب سازی جابجا می کنید.اگر تمایل به ذخیره داده های مرتب شده ورودی دارید بهتر است ابتدا داده ها را در b ذخیره و بعد از مرتب سازی b ،این داده ها را ذخیره کنید.
    در مورد فرمت خروجی هم علیرغم پسوند XLS فایلها،شما همچنان از نوعی فرمت نوشتاری (شبیه CSV) استفاده می کنید.خوشبختانه محصولات مایکروسافت (از جمله excel) می توانند فایل های ورودی را بدون توجه به پسوند و فقط ار روی فرمت داده های آنها (اگر مقدور باشد) شناسایی کنند.(برای امتحان می توانید پسوند یک فایل MP3 را تبدیل به wav یا حتی mid کنید و بعد با MediaPlayer باز کنید!!!!).در فرمت مورد استفاده شما هر کاراکتر خط بعد (مثل n\ یا endl) معادل حرکت به ردیف بعد و هر کاراکتر tab (یا t\) معادل حرکت به ستون بعد می باشد.بهتر از همزمان فایل خروجی (مانند result1.xls) را در Notepad و Excel ببینید تا بیشتر متوجه منظور من شوید.انتقال این داده ها از ردیف پایین تر به ردیف های بالایی موجب پیچیدگی برنامه می شود(در واقع عامل پیچیدگی برنامه من که مورد استقبال شما نبود همین موضوع بوده است).برای راهنمایی پیشنهاد می کنم برنامه اول که برایتان فرستادن را خط به خط مرور کنید به خصوص توابعی که وظیفه ذخیره در فایل را بر عهده دارند.

    اما چند نکته وجود دارد که حیفم آمد توضیح ندهم.اولین نکته در مورد آرایه b است.شما در هر بار حلقه
    for (j=1;j<366;j++)

    عملا یک بار حافظه مورد نیاز b را از سیستم عامل دریافت و در پایان این حلقه آن را به سیستم بر می گرداند.این عملیات باعث سرباز اضافی بر CPU شده و سرعت برنامه را کاهش می دهد.به نظر من بهتر است این عملیات یک بار برای دریافت حافظه،قبل از حلقه و یک بار هم آزاد سازی حافظه بعد از حلقه صورت پذیرد.در این صورت باید اول هر حلقه تمام داده های درون آرایه b معادل صفر شود که می توانید از دستور:
    memset(b,0,n*sizeof(double));

    استفاده کنید.در نتیجه حاقه فوق الذکر را می توانید به شکل زیر بنویسید:
        cout<<endl;
    double *b=new double[n];
    for (j=1;j<366;j++)
    {
    cout<<"\r"<<j<<" of "<<"366"<<flush;
    memset(b,0,n*sizeof(double)); //Set all b[i] = 0
    count=j;
    for (i=0;i<n-j;i++)
    {
    sum=0;
    for (k=i;k<=count;k++)
    {
    sum=sum+c[k];
    }
    //b[i]=sum;
    SET(b,i,sum);
    count+=1;
    }
    sort(b,n-j);
    if(j<=182)
    for(i=0;i<20;i++)
    {
    for(int k=0;k<j;k++){
    outfile1<<"\t";
    }
    outfile1<<b[i]<<endl;
    }

    else
    for(i=0;i<20;i++)
    {
    for(int k=0;k<j;k++){
    outfile2<<"\t";
    }
    outfile2<<b[i]<<endl;
    }
    }
    delete []b;

    نکته دیگر در مورد توابع GET و SET است که با توجه به عدم پیچیدگی این توابع بهتر است آن ها را حذف و هر کجا لازم است،عبارت معادل آنها را قرار دهید تا خوانایی برنامه بالاتر رود.
    نکته آخر هم در مورد تعریف تابع sort در خط 26 است.معمولا معرفی توابعی که قصد معرفی کامل آنها را با کد در برنامه در نظر دارید در ابتدا برنامه بعد از include ها صورت می گیرد تا خوانایی برنامه بالا تر رود و بطور کلی تعریف آنها در تابع دیگر (در این جا در تابع main) مرسوم نیست.البته بعضی کامپایلر ها این مورد را خطا می گیرند.

    موفق و سربلند باشید

  38. #38
    با سلام وتشکر مجدد
    بود.توجه کنید که شما داده ها را بعد خواندن ، در آرایه c ذخیره می کنید.سپس اقدام به مرتب سازی آنها و ذخیره داده ها در فایل می نمایید.سپس به محاسبات اصلی می پردازید.در این محاسبات اگر تعداد داده های ورودی تعییر کند یا جای حتی 2 داده عوض شود جواب خروجی تغییر می کند و شما عملا تمام داده ها را با مرتب سازی جابجا می کنید.اگر تمایل به ذخیره داده های مرتب شده ورودی دارید بهتر است ابتدا داده ها را در b ذخیره و بعد از مرتب سازی b ،این داده ها را ذخیره کنید.
    نکته بسیار ظریفی بود که من به آن دقت نکرده بودم باز هم ازشما تشکر می کنم
    اما برنامه بازهم در ذخیره سازی داده در فایل دچار مشکل است وهمچنان اعداد را به طور بی نظم ذخیره می کند من نمونه ذخیره اعداد در فایل را این جا قرار دادم تا شما ببینید مرا راهنمایی کنید
    با تشکر از شما
    فایل های ضمیمه فایل های ضمیمه

  39. #39
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884
    سلام

    مشکل در ذخیره فایل را در پست قبلی کاملا توضیح داده ام .با این حال دوباره تکرار می کنم:
    در فرمت مورد استفاده شما هر کاراکتر خط بعد (مثل n\ یا endl) معادل حرکت به ردیف بعد و هر کاراکتر tab (یا t\) معادل حرکت به ستون بعد می باشد.بهتر از همزمان فایل خروجی (مانند result1.xls) را در Notepad و Excel ببینید تا بیشتر متوجه منظور من شوید.انتقال این داده ها از ردیف پایین تر به ردیف های بالایی موجب پیچیدگی برنامه می شود(در واقع عامل پیچیدگی برنامه من که مورد استقبال شما نبود همین موضوع بوده است).برای راهنمایی پیشنهاد می کنم برنامه اول که برایتان فرستادن را خط به خط مرور کنید به خصوص توابعی که وظیفه ذخیره در فایل را بر عهده دارند.
    در واقع تمام پیچیدگی برنامه من ناشی از همین موضوع (ذخیره دقیق داده ها در ردیف ها بوده است).باز هم پیشنهاد می کنم برنامه من را دوباره مرور کنید بخصوص توابع SaveTmp1 و SaveTmp2 و SaveResult را به دقت مطالعه کنید.
    در هر حال اگر توضیحات تکمیلی لازم است،اشاره کنید.

    موفق و سر بلند باشید

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •