PDA

View Full Version : کمک در کار کردن با فایلها 2



arya_jal
یک شنبه 21 مرداد 1386, 17:17 عصر
با سلام به همه شما برنامه نویسان عزیز



من در حال نوشتن برنامه ای هستم که در آن یک فایل که حاوی تعدادی عدد اعشاری (حداکثر 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
}
/************************************************** *************************/





ممنون

emad_67
یک شنبه 21 مرداد 1386, 20:02 عصر
طبق این مثالی که زدید که در ابتدا دو به دو و بعد سه به سه و .... اعداد باید جمع بشن شما اومدید در هر مرحله مثلا مرحله اول اینجوری نوشتی
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 دو آرایه جدا هستند؟

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

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

emad_67
دوشنبه 22 مرداد 1386, 09:24 صبح
خوب زیاد وقت نکردم درست کدت رو نگاه کنم ولی اون حلقه 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 پیش میره و مشکلات دیگه ای هم بود که خودت برطرف کنی بهتره
ضمنا اون قسمتی از کد رو که فکر میکنی مشکل داره بزاری بهتره لااقل خوندش راحت تره

arya_jal
چهارشنبه 24 مرداد 1386, 23:13 عصر
با سلام
البته دوست عزیز من این نکته را نگفتم که حداقل تعداد اعداد 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
}
************************************************** *************************/

emad_67
چهارشنبه 24 مرداد 1386, 23:24 عصر
شما راه حلی برای خالی کردن حافظه بعد از تخصیص واجرای برنامه ندارید؟

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

arya_jal
جمعه 02 شهریور 1386, 14:56 عصر
با سلام
من بازهم توابع de_allocate را حذف کردم اما باز هم مشکل داشت
به نظر شما کجای برنامه ایراد دارد؟
من تمام برنامه را چک کردم از نظر منطقی هیچ مشکلی نباید پیش بیاید ولی باز هم درست کار نمی کند

emad_67
جمعه 02 شهریور 1386, 17:58 عصر
فایل تکمیل شده برنامت و همچنین اون فایلی رو که تو برنامه می خونی رو بزار اینجا (همچنین ابعاد فایلت رو اگه خیلی بزرگه بگو) ضمنا برنامت رو Debug هم کنی باید مشخص کنه که کجا ها مشکل پیش میاد

arya_jal
سه شنبه 06 شهریور 1386, 15:17 عصر
این هم فایلهایی که خواسته بودید
امیدوارم شما بتونید مشکل را حل کنید
ممنون

emad_67
سه شنبه 06 شهریور 1386, 18:11 عصر
برنامت رو به این شکل تغییر دادم


#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 ایی بود که کار جمع رو انجام میداد

arya_jal
چهارشنبه 07 شهریور 1386, 00:49 صبح
با سلام وخسته نباشید
من تغییرات شما را وارد کردم اما باز هم موقع اجرا اررور داد و همان اررور همیشگی من این اررور را برای شما ضمیمه کردم اصلا معنی این اررور چیست ممنون میشم در این مورد هم توضیحی بدهید
ممنون

emad_67
چهارشنبه 07 شهریور 1386, 10:24 صبح
معمولا exeption زمانی رخ میده که یه جاهایی از مقادیر آرایه ها خارج بشی و یا وارد حافظه های تخصیص نیافته بشی ولی من تو اجرا این کد و حتی کد های قبلیت هم مشکلی نداشتم . چند دفعه هم کد ها رو چک کردم ، دیگه فکر نکنم مشکلی توی کد باشه حالا شما یه بار برنامه رو Debug کن ببین روی کدوم خط ارور پیش میاد.

arya_jal
چهارشنبه 07 شهریور 1386, 23:52 عصر
دوست عزیز سلام
در زمان کامپایل که اررور نمی دهد اما در زمان اجرا و موقع دیباگ از این قسمت ایراد می گیرد

for(i=0;i<n;i++)
for(j=0;j<n;j++)
b[i][j]=-1;
فکر می کنید مشکل چیست؟
برای شما درست کار کرد؟

emad_67
پنج شنبه 08 شهریور 1386, 07:51 صبح
سلام
با عرض شرمندگی این قسمت برنامت رو هم تغییر بده، فراموش کردم عوض کنم چون برای تعداد بالای 366 تا به مشکل بر میخوره


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

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

arya_jal
شنبه 10 شهریور 1386, 19:25 عصر
با سلام خدمت شما دوست گرامی
من برنامه را طبق نیاز خودم به صورت زیر تغییر دادم اما باز هم درمورد فایلهای خیلی بزرگ که یک نمونه را دراینجا آورده ام درست کار نکرد واررور داد
من اررور را نیز در اینجا آورده ام تا شما ببینید مشکل از کجاست
البته من خروجی را طبق نیاز در دوفایل قرار داده ام
همچنین من فقط به 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;
}
}
}

emad_67
شنبه 10 شهریور 1386, 20:09 عصر
من برنامه را طبق نیاز خودم به صورت زیر تغییر دادم اما باز هم درمورد فایلهای خیلی بزرگ که یک نمونه را دراینجا آورده ام درست کار نکرد واررور داد

توی فایلی که گذاشتی 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);
}

arya_jal
دوشنبه 12 شهریور 1386, 15:08 عصر
به نظر شما اگه از float استفاده کنم سرعت پردازش وتخصیص حافظه را بیشتر کنم؟
اصلا روشی وجود دارد که من بتوانم برنامه ای با سرعت بالاتر داشته باشم؟

emad_67
دوشنبه 12 شهریور 1386, 17:34 عصر
به نظر شما اگه از float استفاده کنم سرعت پردازش وتخصیص حافظه را بیشتر کنم؟

این کار تاثیر آنچنانی روی کار نداره ولی چون اعدادت تعداد اعشارشون کم بود گفتم که float تعریف کنی


اصلا روشی وجود دارد که من بتوانم برنامه ای با سرعت بالاتر داشته باشم؟

در این مورد نمیدونم الگوریتم بهتری برای این کار وجود داره یا نه.

arya_jal
سه شنبه 13 شهریور 1386, 23:42 عصر
اگر ما حافظه را خالی نکنیم آیا با پایان برنامه خودبه خود قسمتهای تخصیص داده شده خالی می شوند؟

emad_67
سه شنبه 13 شهریور 1386, 23:57 عصر
اگر ما حافظه را خالی نکنیم آیا با پایان برنامه خودبه خود قسمتهای تخصیص داده شده خالی می شوند؟

بله خالی میشه

SMRAH1
سه شنبه 20 شهریور 1386, 02:12 صبح
سلام

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

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

موفق باشید

arya_jal
سه شنبه 27 شهریور 1386, 14:32 عصر
با تشکر از شما دوست عزیز

arya_jal
سه شنبه 27 شهریور 1386, 17:36 عصر
با سلام مجدد


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


من در فایل خروجی مشکل دارم


xls من می خواستم اعداد را در ستونهایی پشت سر هم چاپ کند یعنی در فایل اکسل با پسون


در واقع به صورت سنون به ستون (که به دو فایل اکسل نیاز است زیرا اکسل فقط 256 ستون قبول می کند)


ونیز در ستون اول خود اعدا که از ورودی خوانده شده قرار بگیرد یعنی ما به 366 ستون نیاز دایم


در ضمن اگر کمی درمورد کد نویسی برنامه توضیح بدهید ممنون میشم


فکر میکنم کلاس آموزشی خوبی بشه


ممنونم

SMRAH1
یک شنبه 01 مهر 1386, 02:26 صبح
سلام

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

arya_jal
پنج شنبه 05 مهر 1386, 22:22 عصر
با سلام و تشکر از شما دوست گرامی
من از خروجی برنامه یک فایل xls را مدنظر دارم وبه نظر من بهتر است به دلیل محدودیت ستونهای اکسل آنهارا در دوفایل xls قرار دهیم من نمونه خروجی که مدنظرم است را اینجا قرار دادم تا شما منظور من را بهتر بفهمید
همچنین من می خواستم در ستون اول فایل خروجی خود اعدادی از ورودی خوانده شده ( در واقع به شکل مرتب )
قرار بگیرد در حقیقت ما نیازمند 366 ستون هستیم
با تشکر از شما دوست گرامی

SMRAH1
جمعه 06 مهر 1386, 04:53 صبح
پیشنهاد من همان است که به جای استفاده از ستون ها داده ها را در ردیف ها ذخیره کنی .یعنی هر ردیف معادل یک ستون از داده ها در xls های بالا است.
در این صورت نیاز به شکستن داده ها هم نیست.در مورد دریافت داده های اضافی هم ،من متوجه نشدم.آیا این داده ها به غیر از داده های فایل اولیه است.

arya_jal
جمعه 06 مهر 1386, 17:16 عصر
ba salam
man be seton ha niaz daram
dar zemn manzor az soton aval haman dadehaee ast ke az file vorodi khandeh meshavad

SMRAH1
پنج شنبه 12 مهر 1386, 02:25 صبح
سلام

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

موفق باشید

arya_jal
پنج شنبه 12 مهر 1386, 19:55 عصر
با تشکر مجدد از شما دوست گرامی

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

SMRAH1
شنبه 14 مهر 1386, 01:29 صبح
سلام

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

موفق باشید.

SMRAH1
یک شنبه 15 مهر 1386, 02:29 صبح
سلام
این هم نظر من در مورد برنامه شما.توضیحات داخل فایل rar است.در ضمن یک پیغام خصوصی فرستادم حتما بخونید.
موفق باشید.

arya_jal
یک شنبه 15 مهر 1386, 22:18 عصر
با تشکر از شما دوست گرامی به خاطر راهنمایی های خوبتون

arya_jal
یک شنبه 15 مهر 1386, 22:56 عصر
با سلام
من فکر می کنم منظور درست نرساندنم
هدف اصلی من ازاین پروژه(که یک پروژه دانشجویی است) قرار دادن اعداد طبق همان الگویی است که گفتم یعنی قراردادن اعداد در سلول های اکسل آن هم به طور مجزا یعنی در هر سلول فقط یک عددو نیز ذخیره اعداد در یک فایل با پسوند ایکس ال اس
و همچنین در فایلهای برنامه شما سمی کلونها اضافی هستند وسلولها به طور مجزا تفکیک نمی شوند
با تشکر فراوان

SMRAH1
پنج شنبه 19 مهر 1386, 07:26 صبح
سلام

در مورد ذخیره داده ها نوشتید.فکر کنم باید چند خطی در مورد اینکه چرا من در 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 را پیشنهاد می کنم.چون هم برنامه نویسی آن ساده تر است و هم هماهنگی آن با برنامه های صفحه گسترده، بیشتر است.

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

arya_jal
شنبه 21 مهر 1386, 18:38 عصر
با سلام
من برای تخصیص حافظه در فایلهای بزرگتر (همانطور که گفته بودید) با مشکل مواجه شدم بنابراین تصمیم گرفتم برنامه را به نحوی تغییر دهم که حافظه کمتری را دریافت کتد یا بهتر بگویم فقط از یک آرایه استفاده کند که در این صورت مقدار حافظه کمتری اشغال می شود در هر حال برنامه را به شکلی که در ضمیمه است تغییر دادم اما متاسفانه متوجه شدم فایل خروجی یا بهتر بگویم اعداد خروجی نتایج متفاوتی را با نمونه های قبلی برنامه که خودتان قبلا یکی از آنها را نوشتید دارد در حالی که من از همان الگوریتم قبلی استفاده می کردم .
وهمچنین در چاپ اعداد در خروجی به درستی وبه طور منظم چاپ نمی کند البته من در نوشتن این برنامه تصورم براین بوده که هربارفایل خروجی باز می شود به ابتدای فایل می رسد بنابراین برای اینکه اعداد در سلولها قاطی نشوند از تب های متوالی استفاده کرده ام.
در ضمن هدف فقط دیدن اعداد نیست بلکه این در مراحل بعدی کار نیز مورد استفاده هستند( به خصوص هر ستون) بنابراین کار بافایلهای (سی اس وی) ونیز استخراج اعداد از آن بسیار مشکل است وبه این دلیل من به فایلهای (ایکس ال اس) روی آوردم
اگر شما نگاهی به کدهای برنامه بیاندازید ممنون می شوم
با تشکر

SMRAH1
دوشنبه 23 مهر 1386, 13:11 عصر
سلام

من برنامه شما را مطالعه کردم.ایراد این برنامه در خط 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) مرسوم نیست.البته بعضی کامپایلر ها این مورد را خطا می گیرند.

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

arya_jal
پنج شنبه 26 مهر 1386, 23:36 عصر
با سلام وتشکر مجدد

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

SMRAH1
سه شنبه 08 آبان 1386, 17:51 عصر
سلام

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

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

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