View Full Version : کمک در کار کردن با فایلها
arya_jal
شنبه 06 مرداد 1386, 18:04 عصر
با عرض سلام وخسته نباشید خدمت همه شما دوستان گرامی من به تازگی شروع به برنامه نویسی با سی پلاس پلاس کردم درواقع مبتدی هستم
من درنوشتن برنامه ای دچار مشکل شدم
من دراین برنامه قصد دارم یک فایل را که حاوی یک ماتریس است را از ورودی بخواند وسپس ستونهای این ماتریس را
به صورت نزولی وبه طور مجزا مرتب کند و حاصل را دریک فایل خروجی چاپ کند
این برنامه هیچ خطای زمان کامپایلی ندارد اما موقع اجرا درست کار نمی کند در ضمن ما تعداد سطر وستونها را از ورودی دریافت می کنیم
لطفا مرا راهنمایی کنید
این هم کدهای برنامه:
/************************************************** **************************/
#include<iostream.h>
#include<iomanip.h>
#include<fstream.h>
void main(void)
{
void de_allocate(float **,int);
ifstream input("num.TXT");
ofstream output("result.TXT");
int i,j,k,row,col;
float* temp;
float** a;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
temp=new float;
a = new float*[row];
for (j = 0; j < col; j++)
a[j] = new float[row];
for(i=0;i<row;i++)
for(j=0;j<col;j++)
input>>a[row][col];
for (j=0;j<col;j++) //sort
for (i=0;i<row;i++)
for (k=0;k<row-i;k++)
if(a[k][j]<a[k+1][j])
*temp=a[k][j];
a[k][j]=a[k+1][j];
a[k+1][j]=*temp;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
output<<a[i][j]<<"\t";
output<<"endl";
delete temp;
de_allocate(a,row);
}
/************************************************** *************************/
void de_allocate(float **a,int row) {
for (int i = 0; i < row; i++)
delete[]a[i]; // STEP 1: DELETE THE COLUMNS
delete[] a; // STEP 2: DELETE THE ROWS
}
/************************************************** **************************/
با تشکر
emad_67
شنبه 06 مرداد 1386, 21:50 عصر
مشکلی که تو این برنامه هست:
a = new float*[row];
for (j = 0; j < col; j++)
a[j] = new float[row];
شما برای ساخت آرایه دو بعدی این کد رو نوشتین که غلطه باید اینجوری بنویسین
for (j = 0; j < row; j++)
a[j] = new float[col];
مشکل دیگه اینجاست:
for(i=0;i<row;i++)
for(j=0;j<col;j++)
input>>a[row][col];
در فایل همه چیز به صورت کاراکتر هست پس با این دستور
input>>a[row][col];
نمیشه یه کاراکتر رو تو آرایه عددی ریخت پس بهتره که که آرایه رو به صورت کاراکتری تعریف کنی و مقادیر رو دریافت کنی بعد تبدیل رو انجام بدی ضمنا در کد بالا row و col رو به i و j تبدیل کن به این صورت:
for(i=0;i<row;i++)
for(j=0;j<col;j++)
input>>a[i][j];
این قسمت رو هم
for(i=0;i<row;i++)
for(j=0;j<col;j++)
output<<a[i][j]<<"\t";
output<<"endl";
به این کد تبدیل کن تا مشکلی در ذخیره سازی تو فایل خروجی هم به وجود نیاد
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
output<<a[i][j]<<"\t";
if(j==col-1)
output<<endl;
}
دیگه قسمت sort رو هم خودت بررسی کن اگه مشکلی بود بپرس
arya_jal
یک شنبه 07 مرداد 1386, 01:09 صبح
با تشکر از شما دوست گرامی برای پاسخ به این مشکل
من تمام تغییرات را اعمال کردم اما باز هم در زمان اجرا مشکل پیدا کرد
در ضمن میخواستم بپرسم با کدامیک از دستورهایtypedef ویا static_cast
می توان تغییر نوع متغیر داد؟
البته من فکر کنم مشکل اصلی در مرتب سازی است
باز هم از شما ممنونم
emad_67
یک شنبه 07 مرداد 1386, 03:27 صبح
خواهش میکنم
در مورد ارور هم مشکل از همون تابع sort هست. من اونو به این شکل تغییر دادم الان دیگه درسته
for (j=0;j<col;j++) //sort
for (i=0;i<row;i++)
for (k=0;k<row-1;k++)
if(a[k][j]<a[k+1][j])
{
*temp=a[k][j];
a[k][j]=a[k+1][j];
a[k+1][j]=*temp;
}
ضمنا لازم نیست temp رو از نوع اشاره گر تعریف کنی. یه کاراکتره دیگه
برای تبدیل های نوع داده ای میتونی از static_cast استفاده کنی مثلا فرض کن میخوای یه متغیر رو از نوع float به int تبدیل کنی باید اینجوری بنویسی
static_cast<int>(c);
که c همون متغیری هست که از نوع float تعریف شده یا اگه هم نخواستی میتونی اینجوری بنویسی
(int)c;
اینم همون کار رو میکنه
البته کلا با این روشی که گفته شد فقط باید فایل از اعداد 1 رقمی و همچنین از نوع int تشکیل شده باشه در غیر این صورت با مشکل مواجه میشی حالا اگه می خوای قابلیت پذیرفتن اعداد چند رقمی یا اعشاری رو هم داشته باشه باید محتوای هرخونه از آرایه رو یه رشته قرار بدی در واقع یعنی هر خونه اشاره گری به یه رشته باشه نه یه کاراکتر بعد در آخر رشته ها رو به عدد تبدیل کنی
arya_jal
دوشنبه 08 مرداد 1386, 19:42 عصر
دوست عزیز سلام
من تغییراتی را که گفته بودی را اعمال کردم اما باز هم در زمان اجرا ارور زیر را داد
Unhandled Exception in project.exe: 0xC00000005:Access Violation
من یک سوال دیگر دارم
کامپایلری که استفاده می کنم( Turbo C++ & Visual C++)نوع داده استرینگ را پشتیبانی نمی کنند
از طرفی ماتریس من از داده های اعشاری چندرقمی تشکیل شده است می خواستم ببینم این مشکل را چگونه حل کنم
من می توانم از نوع داده char* استفاده کنم ؟
اگر جواب مثبت است در این مثال چگونه اعلان می شود؟
اگر امکان دارد بیشتر توضیح بدهید
با تشکر از راهنمایی های شما دوست بزرگوار
این هم برنامه اصلاح شده:
#include<iostream.h>
#include<iomanip.h>
#include<fstream.h>
void main(void)
{
void de_allocate(char **,int);
ifstream input("num.TXT");
ofstream output("result.TXT");
int i,j,k,row,col;
float temp;
char **a;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
for (j = 0; j < row; j++)
a[j] = new char[col];
for (i=0;i<row;i++)
for(j=0;j<col;j++)
static_cast<float>(a[i][j]);
for(i=0;i<row;i++)
for(j=0;j<col;j++)
input>>a[i][j];
for (j=0;j<col;j++) //sort
for (i=0;i<row;i++)
for (k=0;k<row-1;k++)
if(a[k][j]<a[k+1][j])
{
temp=a[k][j];
a[k][j]=a[k+1][j];
a[k+1][j]=temp;
}
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
output<<a[i][j]<<"\t";
if(j==col-1)
output<<endl;
}
de_allocate(a,row);
}
/************************************************** *************************/
void de_allocate(char **a,int row) {
for (int i = 0; i < row; i++)
delete[]a[i]; // STEP 1: DELETE THE COLUMNS
delete[] a; // STEP 2: DELETE THE ROWS
}
/************************************************** **************************/
emad_67
دوشنبه 08 مرداد 1386, 19:56 عصر
کامپایلری که استفاده می کنم( Turbo C++ & Visual C++)نوع داده استرینگ را پشتیبانی نمی کنند
منم vc++ استفاده میکنم و string رو داره, هدر اون رو وارد میکنید؟؟
از طرفی ماتریس من از داده های اعشاری چندرقمی تشکیل شده است می خواستم ببینم این مشکل را چگونه حل کنم
من می توانم از نوع داده char* استفاده کنم ؟
بله همین کار رو باید بکنید البته باید آرایه رو به آرایه اشاره گر تبدیل کنی که هر خونه اون یه اشاره گر باشه به این صورت:
char*** a;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
temp=new char;
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
بعد حالا باید رشته رو این دفعه وارد خونه ها کنی و در آخر هم با دستور atof میتونی رشته ها رو به float تدیل کنی
در مورد برنامه هم شما اینجا:
for (i=0;i<row;i++)
for(j=0;j<col;j++)
static_cast<float>(a[i][j]);
اصلا دستور static_cast برای تبدیل رشته به عدد به کار نمیره برای این کار باید از atof در هدر stdlib.h استفاده کنی
ضمنا برای تبدیل آرایه باید ابتدا یه آرایه از نوع float بسازی و بعد تبدیل کنی و بریزی توی اون
ضمنا این رو هم یادت رفته بود بنویسی
a=new char *[row];
arya_jal
دوشنبه 08 مرداد 1386, 20:42 عصر
باز هم خسته نباشید خدمت شما دوست عزیز
اگه امکانش است روش استفاده از atof را توضیح دهید
در ضمن من از chr*** نیز استفاده کردم ولی کامپایلر ارور داد
با تشکر
emad_67
دوشنبه 08 مرداد 1386, 20:58 عصر
در مورد atof یه مثال میزنم :
void main()
{
char *s="12.3";
float x=atof(s);
cout<<x<<endl;
}
atof پارامتر ورودی اون یه رشته هست که نباید از حرف مثل a, b ... استاده شده باشه وگر نه تابع به اولین حروفی که بر بخوره تموم میشه کارش
در مورد char *** مشکلی نداره اون کدی که من نوشتم به احتمال زیاد یه جایی از برنامه اشتباه میکنی ولی اگه نخواستی میتونی از string استفاده کنی در مورد string هم این مثال رو ببین
#include<iostream>
#include <string>
#include<fstream>
using namespace std;
fstream in("num.txt",ios::in);
void main()
{
string str1[3][3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
in>>str1[i][j];
for( i=0;i<3;i++)
for(int j=0;j<3;j++)
cout<<str1[i][j]<<" ";
}
باید به جای وارد کردن string.h از فضای نام string استفاده کنی
arya_jal
چهارشنبه 10 مرداد 1386, 23:00 عصر
سلام گرم خدمت شما دوست گرامی
من برنامه را به شکل زیر تغییر دادم اما باز هم متاسفانه مشکل همان مشکل قبلی است
البته من فکر می کنم مشکل در کد زیر باشد :
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
زیرا ما برای ستون ها ماتریس تخصیص حافظه نمی کنیم نظر شما چیست ؟
این هم کدهای برنامه بعداز اصلاح:
#include<iostream.h>
#include<stdlib.h>
#include<math.h>
#include<fstream.h>
void main(void)
{
void de_allocatec(char ***,int);
void de_allocatef(float **,int);
ifstream input("num.TXT");
ofstream output("result.TXT");
int i,j,k,row,col;
float temp;
char*** a;
float** b;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
b = new float*[row];
for (j = 0; j < row; j++)
b[j] = new float[col];
for(i=0;i<row;i++)
for(j=0;j<col;j++)
input>>*a[i][j];
for (i=0;i<row;i++)
for(j=0;j<col;j++)
b[i][j] = atof(a[i][j]);
for (j=0;j<col;j++) //sort
for (i=0;i<row;i++)
for (k=0;k<row-1;k++)
if(a[k][j]<a[k+1][j])
{
temp=*a[k][j];
a[k][j]=a[k+1][j];
*a[k+1][j]=temp;
}
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
output<<a[i][j]<<"\t";
if(j==col-1)
output<<endl;
}
de_allocatec(a,row);
de_allocatef(b,row);
}
/************************************************** *************************/
void de_allocatec(char ***a,int row) {
for (int i = 0; i < row; i++)
delete[]a[i]; // STEP 1: DELETE THE COLUMNS
delete[] *a; // STEP 2: DELETE THE ROWS
}
/************************************************** **************************/
de_allocatef(float **b,int row)
{
for (int i = 0; i < row; i++)
delete[]b[i]; // STEP 1: DELETE THE COLUMNS
delete[] b; // STEP 2: DELETE THE ROWS
}
emad_67
چهارشنبه 10 مرداد 1386, 23:16 عصر
من برنامه را به شکل زیر تغییر دادم اما باز هم متاسفانه مشکل همان مشکل قبلی است
البته من فکر می کنم مشکل در کد زیر باشد :
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
زیرا ما برای ستون ها ماتریس تخصیص حافظه نمی کنیم نظر شما چیست ؟
دیگه برای کار با رشته ها نیازی به تخصیح حافظه نیست (یعنی تخصیص خلفظه از ن.ع char نیاز نیست ) این کد دقیقا مثل این کد هست
char** a;
a = new char*[row];
for (j = 0; j < row; j++)
a[j] = new char[col];
فقط فرقی که داره اینه که این کد هر خونه اون یه کاراکتر قبول میکنه ولی کد قبلی هر خونه ی اون یه آدرس هست( آدرسی که به رشته اشاره میکنه ) و ایجاد ستون ماتریس *** هم مثال ** انجام میشه
مشکل هایی که تو این کد هست:
b = new float*[row];
for (j = 0; j < row; j++)
b[j] = new float[col];
نوشتن این قسمت اصلا نیازی نیست چون قراره یه آرایه ای درست کنیم که هر خونه اون یه اشاره گره با همون کدی که اول نوشتی یعنی:
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
درست میشه
مشکل دیگه اینه که
for(i=0;i<row;i++)
for(j=0;j<col;j++)
input>>*a[i][j];
نمیشه یه خونه ای رو که فقط یه آدرس میپذیره با cin بهش اطلاعات رو وارد کرد باید اینجوری بنویسی
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
char *word=new char[10];
input>>word;
a[i][j]=word;
}
الان اینجا ابتدا اون رشته رو وارد آرایه word میکنیم و بعد خود word رو که یه آدرس هست به خونه آرایه انتقال میدیم
تابع sort رو هم باید به همین دلایل تغییر بدی. یا باید ابتدا رشته ها رو با هم مقایسه کنی و sort کنی یا اینکه اول تبدیل کنی و بعد sort. که البته بهتر که که اول تبدیل کنی چون قراره که اعداد اعشاری رو هم داشته باشی با مشکل بر خورد میکنی
کلا اگه فکر میکنی با اشاره گر ها مشل داری از string استفاده کن
arya_jal
پنج شنبه 11 مرداد 1386, 00:22 صبح
با تشکر مجدد
البته کمی گنگ است میشه بیشتر توضیح بدهی؟
یعنی کدها بید به این صورت باشد درسته
#include<iostream.h>
#include<stdlib.h>
#include<math.h>
#include<fstream.h>
void main(void)
{
void de_allocatec(char ***,int);
void de_allocatef(float **,int);
ifstream input("num.TXT");
ofstream output("result.TXT");
int i,j,k,row,col;
char temp[10];
char*** a;
float** b;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
b = new float*[row];
for (j = 0; j < row; j++)
b[j] = new float[col];
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
char *word=new char[10];
input>>word;
a[i][j]=word;
}
for (i=0;i<row;i++)
for(j=0;j<col;j++)
b[i][j] = atof(a[i][j]);
for (j=0;j<col;j++) //sort
for (i=0;i<row;i++)
for (k=0;k<row-1;k++)
if(a[k][j]<a[k+1][j])
{
temp=a[k][j];
a[k][j]=a[k+1][j];
a[k+1][j]=temp;
}
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
output<<a[i][j]<<"\t";
if(j==col-1)
output<<endl;
}
de_allocatec(a,row);
de_allocatef(b,row);
}
/************************************************** *************************/
void de_allocatec(char ***a,int row) {
for (int i = 0; i < row; i++)
delete[]a[i]; // STEP 1: DELETE THE COLUMNS
delete[] *a; // STEP 2: DELETE THE ROWS
}
/************************************************** **************************/
de_allocatef(float **b,int row)
{
for (int i = 0; i < row; i++)
delete[]b[i]; // STEP 1: DELETE THE COLUMNS
delete[] b; // STEP 2: DELETE THE ROWS
}
emad_67
پنج شنبه 11 مرداد 1386, 00:50 صبح
گفتم که اصلا نباید این کد وجود داشته باشه
for (i=0;i<row;i++)
for(j=0;j<col;j++)
b[i][j] = atof(a[i][j]);
بزار در مورد ** یه توضیحی بدم :
فرض کن ما یه متغیر به صورت ** تعریف میکنیم این به این معنی هست که که متغیر a متغیری هست که به خونه ای از حافظه اشاره میکنه که اون خونه از حافظه خودش به خونه ای دیگه اشاره داره مثلا وقتی مینویسی
a = new char*[row];
یعنی یه آرایه ای از اون خونه هایی که گفتم میسازه . یعنی خود a به خونه هایی اشاره داره که اون خونه ها خودشون اشاره گرن و حالا در اینجا اون خونه ها به نوع char اشاره دارن
و حالا با نوشتن
for (j = 0; j < row; j++)
a[j] = new char[col];
یه آرایه ایی از نوع char رو به هر کدوم از خونه های a وصل میکنیم در مورد *** هم قضیه به همین شکل هست فقط این دفه به جای اینکه هر خونه از آرایه به یه char اشاره کنه, به یه رشته اشاره میکنه( یا به نوعی به یه char * ( نمیدونم تونستم منظورم رو درست برسونم یا نه
اینجا رو هم ببینی بد نیست
http://en.wikipedia.org/wiki/Array#Multi-dimensional_arrays
به هر حال برنامت رو هم به این صورت edit و کامل کردم البته دو تا تابع allocate رو خذف کردم که خودت اضافه کن در مورد ائن temp هم که گفتم از نوغ ارایه تعریف کن نمیواد دیگه همون float باشه البته پست قبل رو edit کردم که فکر کنم ندیدی
#include<iostream.h>
#include<stdlib.h>
#include<fstream.h>
#include<string.h>
void main(void)
{
ifstream input("num.TXT");
ofstream output("result.TXT");
int i,j,k,row,col;
char*** a;
float temp;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
/********* enter string to array *********/
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
char *word=new char[10];
input>>word;
a[i][j]=word;
}
/******** create float array **********/
float **b=new float *[row];
for(i=0;i<row;i++)
for(j=0;j<col;j++)
b[j]=new float[col];
/************ convert string to float ********/
for(i=0;i<row;i++)
for(j=0;j<col;j++)
b[i][j]=atof(a[i][j]);
/******* sort float array ***********/
for (j=0;j<col;j++)
for (i=0;i<row;i++)
for (k=0;k<row-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<row;i++)
for(j=0;j<col;j++)
{
output<<b[i][j]<<"\t";
if(j==col-1)
output<<endl;
}
}
حالا اگه جایی از اون هم گنگ بود بگو تا توضیح بدم
arya_jal
شنبه 13 مرداد 1386, 23:56 عصر
با تشکر مجدد از شما
برنامه با تغییراتی که شما دادید درست شد وخوب کار کرد
فقط مشکلی که داره اینه با فایلهای بزرگ کار نمی کند و در زمان اجرا همان اررور قبلی را می دهد
حالا یک سوال دیگه دارم واینکه چطوری میشه خروجی را در یک فایل اکسل چاپ کرد
من سعی کردم اینکار را مشابه فایل تکست انجام دهم اما تمام سطر را را فقط را دریک خانه از خانه های اکسل چاپ کرد
اگه ممکنه کمی هم در باره فایلهای اکسل توضیح بده؟
ممنون
#include<iostream.h>
#include<stdlib.h>
#include<fstream.h>
#include<string.h>
void main(void)
{
void de_allocatec(char ***,int );
void de_allocatef(float **,int );
ifstream input("num.TXT");
ofstream output("result.TXT");
int i,j,k,row,col;
char*** a;
float temp;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
/********* enter string to array *********/
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
char *word=new char[10];
input>>word;
a[i][j]=word;
}
/******** create float array **********/
float **b=new float *[row];
for(i=0;i<row;i++)
for(j=0;j<col;j++)
b[j]=new float[col];
/************ convert string to float ********/
for(i=0;i<row;i++)
for(j=0;j<col;j++)
b[i][j]=atof(a[i][j]);
/******* sort float array ***********/
for (j=0;j<col;j++)
for (i=0;i<row;i++)
for (k=0;k<row-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<row;i++)
for(j=0;j<col;j++)
{
output<<b[i][j]<<"\t";
if(j==col-1)
output<<endl;
}
}
/************************************************** *************************/
void de_allocatec(char ***a,int row) {
for (int i = 0; i < row; i++)
delete[]a[i]; // STEP 1: DELETE THE COLUMNS
delete[] *a; // STEP 2: DELETE THE ROWS
}
/************************************************** **************************/
de_allocatef(float **b,int row)
{
for (int i = 0; i < row; i++)
delete[]b[i]; // STEP 1: DELETE THE COLUMNS
delete[] b; // STEP 2: DELETE THE ROWS
}
emad_67
یک شنبه 14 مرداد 1386, 01:06 صبح
فقط مشکلی که داره اینه با فایلهای بزرگ کار نمی کند و در زمان اجرا همان اررور قبلی را می دهد
منظور از فایل های بزرگ یعنی چقدر؟ چون تا حافظه سیستم پر نشه جواب میده.
ضمنا قبل از هر چیز من یه اشتباهی تو کد های بالا داشتم.به جای این کد :
/******** create float array **********/
float **b=new float *[row];
for(i=0;i<row;i++)
for(j=0;j<col;j++)
b[j]=new float[col];
این رو ببنویس:
/******** create float array **********/
float **b=new float *[row];
for(i=0;i<row;i++)
b[i]=new float[col];
حالا ببین باز هم ارور میده؟
من سعی کردم اینکار را مشابه فایل تکست انجام دهم اما تمام سطر را را فقط را دریک خانه از خانه های اکسل چاپ کرد
اگه ممکنه کمی هم در باره فایلهای اکسل توضیح بده؟
منظورت از فایل اکسل اینه که تو یه فایل txt مثل اکسل ستون بندی شده چاپ کنه؟
اگه منظورت اینه که این برنامه اگه فایل ورودیت مثلا 10*10 باشه خروجی هم 10*10 میده
arya_jal
یک شنبه 14 مرداد 1386, 14:30 عصر
با سلام
مثلا یک فایل که دارای ماتریسی 400*400 باشد واز اعداد اعشاری متشکل شده باشد
خروجی در اکسل به اینصورت بود که مثلا تمام عناصر سطر اول را فقط در یک سلول چاپ کرد
اصولا نحوه استفاده از فایلهای اکسل (ورودی وخروجی) مشابه فایلهای تکست است?
با تشکر:لبخندساده:
emad_67
یک شنبه 14 مرداد 1386, 14:40 عصر
برای اینکه همه اعداد توی یه سطر رو تو یه خونه چاپ نکنه باید "t\" رو حتما تو دستور خروجیت بزنی. با این کار هر عدد تو یه خونه قرار میگیره
arya_jal
یک شنبه 14 مرداد 1386, 23:23 عصر
با سلام مجدد
من همچنان برای اجرای برنامه در مورد فایلهای بزرگ (مثلا 400*400) مشکل دارم
فکر می کنید مشکل از کجاست؟
emad_67
یک شنبه 14 مرداد 1386, 23:37 عصر
میشه لطف کنید اون فایلی رو که تو برنامه open میکنید رو اینجا ضمیمه کنید تا ببینم
فکر نمیکنم مشکل از برنامه باشه چون من با بالاتر از این هم تونستم تخصیص حافظه کنم ضمنا اون اروری هم که میده رو ببنویس
arya_jal
سه شنبه 16 مرداد 1386, 19:09 عصر
با سلام مجدد و پوزش به خاطر تاخیر
من فایل را برای شما ضمیمه کردم که دارای 300 سطر و 250 ستون است
با تشکر
http://barnamenevis.org/forum/attachment.php?attachmentid=10102&stc=1&d=1186585560
emad_67
سه شنبه 16 مرداد 1386, 19:24 عصر
خوب این که مشکلی نداشت و درست کار کرد. بلاخره نگفتی که چه اروری میده؟
اینم فایل exe ی اون فایل num.txt رو بزار کنارش و اجرا کن.
arya_jal
سه شنبه 16 مرداد 1386, 19:39 عصر
این اررور را می دهد
Unhandled Exception in project.exe: 0xC00000005:Access Violation
دوست عزیز لطفا کمی هم در مورد نحوه استفاده از فای لهای اکسل توضیح بده
ممنون
emad_67
سه شنبه 16 مرداد 1386, 19:58 عصر
شما مطمئنی که اون برنامه ای رو که داده بودم با رفع اشکالی هم که پیش اومده بود اجرا کردی ؟ ضمنا فایل exe ایی رو هم که گذاشتم همین ارور را داد؟
تو این ارور والا ممکنه که از یه جاهایی از مقادیر آرایه ها خارج شده باشی ضمنا یه بار تابع های deallocate رو حذف کن ببین چی میشه. فکر میکنم یکی از اون ها هم یه کم اشتباه داره ولی تاثیر آنچنانی نباید داشته باشه
در مورد فایل های اکسل هم من زیاد کار نکردم فقط هنگام خروجی گرفتن فرمت فایلت رو به xls تغییر بده و "t\" رو هم در دستور حروجی بزن
arya_jal
چهارشنبه 17 مرداد 1386, 00:12 صبح
سلام
آره
دوست عزیز سوال دیگری داشتم و آن اینکه اگر بخواهم طوری ستون ها مرتب کنم که
تکراریها را حذف کند(یعنی در هر ستون از هر عدد حداکثر یکی باشد ) باید از چه الگوریتمی استفاده بکنم؟
emad_67
چهارشنبه 17 مرداد 1386, 10:03 صبح
خوب برای اینکه اعداد تکراری حذف بشن میتونی در حین مرتب سازی یه شرط دیگه ای اضافه کنی که بیاد مساوی بودن اعداد رو چک کنه و اگه مساوی بودن اون خونه رو برابر یه مقداری مثل 1- قرار بده که به عنوان یه خونه پوچ به حساب بیاد و تو خروجی هم مشخص کنی که وقتی به 1- رسید اون رو در فایل قرار نده
در مورد ارور هم والا من هم کد رو چک کردم و با borland و vc++ کامپایل هم کردم و مشکلی نبود نمی دونم دیگه مشکل از چی میتونه باشه یه بار debug کن برنامه رو ببین چه مشکلی داره
arya_jal
یک شنبه 21 مرداد 1386, 17:01 عصر
با سلام مجدد
من چند روزی دسترسی به اینترنت نداشتم برای همین نتوانستم جواب بدم
ولی از شما تشکر می کنم
arya_jal
دوشنبه 22 مرداد 1386, 00:45 صبح
با سلام مجدد
من نرم افزار را با این فایل امتحان کردم اما باز هم گیر کرد
میشه ببینی مشکل از کجاست؟
ممنون
emad_67
دوشنبه 22 مرداد 1386, 01:26 صبح
اگه مشکلت همون اروری هست که گفتی که من چند بار کد رو چک کردم و مشکلی ندیدم حالا خودت مثلا با حذف بعضی از قسمت ها مثل حلقه های for میتونی چک کنی ببینی که چه موقعی ارور پیش میاد .اون فایل exe برنامه ای رو هم که ارور میده رو بزار اینجا تا من ببینم
این فایلی هم که الان گذاشتی برا من اروری نداد اصلا مشکل از فایل نیست .ضمنا برای اجرای این فایلی که الان گذاشتی اون قسمت تخصیص حافظه برای word رو اینجوری بنویس
char *word=new char[20];
چون تعداد کاراکتر ها بیشتر از 10 تاست.
arya_jal
چهارشنبه 24 مرداد 1386, 23:09 عصر
با سلام مجدد
اتفاقا من همین کار را نیز کردم یعنی char[20 تعریف کردم ولی افاقه نکرد
حالا این هم کدها شاید من باز هم اشتباه کردم
البته من فکر می کنم مشکل اصلی در توابع de_allocate باشه
#include<iostream.h>
#include<stdlib.h>
#include<fstream.h>
#include<string.h>
void main(void)
{
void de_allocatec(char ***,int );
void de_allocatef(float **,int );
ifstream input("num.TXT");
ofstream output("result.TXT");
int i,j,k,row,col;
char*** a;
float temp;
cout<<"Enter Your Row and Column:";
cin>>row>>col;
a = new char**[row];
for (j = 0; j < row; j++)
a[j] = new char*[col];
/********* enter string to array *********/
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
char *word=new char[20];
input>>word;
a[i][j]=word;
}
/******** create float array **********/
float **b=new float *[row];
for(i=0;i<row;i++)
b[i]=new float[col];
/************ convert string to float ********/
for(i=0;i<row;i++)
for(j=0;j<col;j++)
b[i][j]=atof(a[i][j]);
/******* sort float array ***********/
for (j=0;j<col;j++)
for (i=0;i<row;i++)
for (k=0;k<row-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<row;i++)
{
for(j=0;j<col;j++)
{
output<<b[i][j]<<"\t";
if(j==col-1)
output<<endl;
}
}
}
/************************************************** *************************/
void de_allocatec(char ***a,int row) {
for (int i = 0; i < row; i++)
delete[]a[i]; // STEP 1: DELETE THE COLUMNS
delete[] *a; // STEP 2: DELETE THE ROWS
}
/************************************************** **************************
void de_allocatef(float **b,int row)
{
for (int i = 0; i < row; i++)
delete[]b[i]; // STEP 1: DELETE THE COLUMNS
delete[] b; // STEP 2: DELETE THE ROWS
}
*/
emad_67
چهارشنبه 24 مرداد 1386, 23:34 عصر
اصلا نیازی به نوشتن تابع deallocate نیست در پست های قبل هم گفتم که یه بار اون ها رو حذف کن و برنامه رو اجرا کن ببین چی میشه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.