PDA

View Full Version : جداسازی اعداد به صورت دو به دو



farhadamin
پنج شنبه 24 آبان 1386, 22:43 عصر
سلام دوستان سوالی در مورد اعداد اعشاری داشتم.
اول این که ورودی به صورت ****.** است.
یعنی دو عدد صحیح و چهار عدد اعشاری. می خوام اگه ورودی غیر از این بود برنامه از کاربر بخواهد که عدد را اصلاح کنه. یعنی تعداد اعداد صحیح و یا اعشاری کم تر و یا بیشتر بود.
خودم راهی به ذهنم نرسید.

در ضمن کد زیر برای جدا کردن یک عدد که به صورت ****.** است به بخشهای دو تایی (یعنی دو رقم دو رقم ) است... (برای یک محسابه باید به این صورت درآید). اما مشکل در رقم آخر اعشاری است که بعضی مواقع خود سی عدد را گرد می کند.... یعنی مثلا عدد 21.0000 به صورت 20.99999 در نظر می گیرد و محاسبه دقیق نمی شود....
من از کد زیر برای رفع این مشکل استفاده کردم... البته توی یکی از پست ها یه چیزایی پیدا کردم و از اون استفاده کردم ...



Double = ((int)(Double*100))/100.0;

int s = (int) Double;
if (Double -= s<0.50)
s+= 1;
printf("%lf\n",Double);
printf("%d\n",s);


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

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



همه کدی هم که نوشتم این حاست.....
ممنون می شم به دو سوالم پاسخ بدید....



#include <stdio.h>
#include<conio.h>

int main(void)
{
double Double = 16.1221;
int T = (int) Double;

printf("%d\n",T);
Double -= T;
printf("%.4lf\n",Double);

Double *= 100;
int min = (int) Double;

printf("%d\n",min);

Double -= min;
printf("%lf\n",Double);
Double *= 100;
printf("%lf\n",Double);
Double = ((int)(Double*100))/100.0;

printf("%lf\n",Double);
int s = (int) Double;
printf("%d\n",s);
if (Double -= s<0.50)
s+= 1;
printf("%lf\n",Double);
printf("%d\n",s);
getch();
return 0;
}

emad_67
پنج شنبه 24 آبان 1386, 23:24 عصر
یعنی دو عدد صحیح و دو عدد اعشاری. می خوام اگه ورودی غیر از این بود برنامه اعلام از کار بر بخواهد که عدد را اصلاح کنه. یعنی تعداد اعداد صحیح و یا اعشاری کم تر و یا بیشتر بود.
خودم راهی به ذهنم نرسید.
اگه میخوای که عددت به صورت دو رقم صحیح و دو رقم اعشاری باشه همین خطی که نوشتی درسته:


Double = ((int)(Double*100))/100.0;

تو اینجا اگه مقدار جدید Double رو با مقدار اولیه عدد مقایسه کنی متوجه میشی که عدد مورد نظر تو هست یا نه.

اما مشکل در رقم آخر اعشاری است که بعضی مواقع خود سی عدد را گرد می کند.... یعنی مثلا عدد 21.0000 به صورت 20.99999 در نظر می گیرد و محاسبه دقیق نمی شود....
برای کنترل تعداد ارقام اعشار هم تو c++ از این کد استفاده میشه:


double a=20.99999;
cout<<setiosflags(ios::fixed)<<setprecision(5)<<a<<endl;

ولی توی رو نمیدونم. تابع precison تعداد ارقام اعشار رو مشخص میکنه. حالا اگه میدونی توی c معادل اون چیه عوضش کن.

farhadamin
پنج شنبه 24 آبان 1386, 23:56 عصر
عدد به صورت دو رقم صحیح و چهار رقم اعشاری باید باشه.
منظورت از مقایسه عدد اولی را نفهمیدم... عدد اول من مثلا اینه 16.1221
اما این این قسمت کد عدد را به صورت 20.9999
در اورده.....نمی دونم کد را اجرا کردی یا نه.



Double = ((int)(Double*100))/100.0;


کدی هم که برای کنترل عدد نوشتی نمی دونم چیه و معادلش در سی چیه...
اما من باید هر دو قسمت را کنترل کنم که قسمت صحیح دو رقم باشه و قسمت اعشاری چهار رقم.
این برنامه برای تبدیل ساعات از ساعت معمولی که به صورت 24 ساعت و 60 دقیقه و 60 ثانیه است به ساعت صنعتی.... که به صورت 20 ساعت و 100 دقیقه و 100 ثانیه است هستنش البته نوشتمش اما این قسمت هاش که سوال کردم ناقص است.

farhadamin
جمعه 25 آبان 1386, 00:09 صبح
برنامه اینه که هنوز تکمیل نشده


#include <stdio.h>
#include<conio.h>

int main(void)
{

double Double;
int i;

printf("Type your time : ");
scanf("%lf",&Double);


if (Double<0 || Double>20.0000)
{
printf("Error");
getch();
}
else
{

printf("number is: %.4lf\n\n",Double);
int Tim = (int) Double;

printf(" time is : %d\n",Tim);
Double -= Tim;

Double *= 100;
int min = (int) Double;

printf(" minute is: %d\n\n",min);

Double -= min;

Double *= 100;

Double = ((int)(Double*100))/100.0;


int sek = (int) Double;

if (Double - sek>0.50)
sek+= 1;
printf("%lf\n",Double);
printf(" sekund is: %d\n",sek);

Double = ((((sek/60.)+ min)/60.)+ Tim)*(20./24.);







printf("\n\n\n\nNew time is: %.4lf\n\n",Double);
int Ntim = (int) Double;

printf("New time is : %d\n",Ntim);
Double -= Ntim;


Double *= 100;
int Nmin = (int) Double;

printf("New minute is: %d\n\n",Nmin);

Double -= Nmin;

Double *= 100;

Double = ((int)(Double*100))/100.0;


int Nsek = (int) Double;

if (Double - Nsek>0.50)
Nsek+= 1;
printf("%lf\n",Double);
printf("Ny sekund is: %d\n",Nsek);


getch();
return 0;
}
}

emad_67
جمعه 25 آبان 1386, 00:25 صبح
منظورت از مقایسه عدد اولی را نفهمیدم... عدد اول من مثلا اینه 16.1221
اما این این قسمت کد عدد را به صورت 20.9999
در اورده.....نمی دونم کد را اجرا کردی یا نه.
این کد :

Double = ((int)(Double*100))/100.0;
فقط عدد رو بع دو رقم اعشار تبدیل میکنه. یعنی برای عددی که مثال زدی میشه 16.12.
حالا چون تو میخوای عدد 4 رقم اعشار داشته باشه.
برای اینکه بفهمی قسمت صحیح هم چند رقمه باید اول عدد رو به int تبدیل کنی و بعد تعداد ارقامش رو بشمری. برای فسمت اعشاری هم به همین شکل باید عمل کنی یعنی قسمت اعشاری رو جدا کن و بعد با همین دستور چکش کن.


Double = ((int)(Double*10000))/10000;

البته چون برا 4 رقم اعشار میخوای باید 100 رو به 10000 تبدیل کنی

farhadamin
جمعه 25 آبان 1386, 06:42 صبح
فکر کنم منظور من را بد متوجه شدید..

ببینید ورودی به صورت یک عدد مثلا 12.1456
می خوام هرچیزی غیر از این بود برنامه از کار بر بخواد که ورودی را تغییر دهد...
باید دو رقم عدد صحیح و دو رقم اعشاری داشته باشد....
و حروف هم توش نباشد... نمی دونم چه چوری می شه همه این ها را چک کرد...

ممنون از لطفتون

emad_67
جمعه 25 آبان 1386, 10:06 صبح
ببخشید در مورد اون دستور Double اشتباه کردم.
باید قسمت اعشار و قسمت صحیح رو جدا کنی و تعداد رقم هاشون رو بشموری. برای به دست اوردن قسمت صحیح هم باید عدد رو به int تبدیل کنی و برای قسمت اعشار هم عدد اولیه و منهای قسمت صحیح کنی. البته برای شمردن تعداد رقم های قسمت اعشار ممکنه یه کم سخت بشه برا همین فکر میکنم اگه عدد رو تبذیل کنی به رشته یا اینکه قسمت های اعشار و صحیح رو جدا جدا تبدیل کنی میتونی با به دست اوردن طول رشته بفهی که مثلا عدد چند رقم اعشار داره. برای تبدیل عدد به اعشار هم این مثال رو از msdn پیدا کردم:


int main()
{
char str[30];
float flt = 2.4567;
sprintf(str, "%.5g", flt );
printf(str);
return 0;

}
وقتی تبدیل به رشته بشه خیلی سریع تر حتی با چک کردن مثلا خونه دوم از آرایه میتونی بفهمی که توی اون خونه ممیز قرار داره یا نه. در صورتی که هر چیزی به غیر از ممیز بود یعنی اینکه عدد 2 رقم صحیح نداره. برای اعشار هم به همین شکل.

farhadamin
جمعه 25 آبان 1386, 10:27 صبح
سلام و ممنون

ببین با این دستور الان عدد تبدیل به یک کاراکتر شده.... درست.... اما واقعا نمی دونم چه جوری باید چک کنم که کاراکتر دومش . است.... یعنی نمی دونم چه جوری تعداد را چک کنم... یه چیز دیگه الان به ذهنم رسید...
اگه عدد 02.2345
را به صورت 2.2345
کسی تایپ کنه هم باید درست در نظر گرفته بشه...
در ضمن به سوال اگه کسی اشتباها عدد را به صورت 02.2q45
تایپ کرد چی... ممنون از لطفت

emad_67
جمعه 25 آبان 1386, 11:28 صبح
اما واقعا نمی دونم چه جوری باید چک کنم که کاراکتر دومش . است.... یعنی نمی دونم چه جوری تعداد را چک کنم...برای چک کردن این. ببین


void main()
{
char str[30];
float flt = 2.4567;
sprintf(str, "%.6g", flt );

if(str[2]=='.')
printf("True\n");

}
توی if خونه 2دوم از آرایه با کارکتر '.' مقایشه میشه در صورت درست بودت شرط True چاپ میشه.

یه چیز دیگه الان به ذهنم رسید...
اگه عدد 02.2345
را به صورت 2.2345
کسی تایپ کنه هم باید درست در نظر گرفته بشه...
در ضمن به سوال اگه کسی اشتباها عدد را به صورت 02.2q45
تایپ کرد چی... شما باید اول عدد رو به صورت double از ورودی بگیری نه یه رشته یعنی یه متغیر double تعریف کن و عدد رو بخون بعد تبدیلش کن به رشته در این صورت اگه تایپ بشه 02.2345 مقدار 0 اول در نظر گرفته نمیشه و اگه تایپ بشه 02.2q45 فقط 2.2 از اون در نظر گرفته میشه. حالا اگه نمیخوای کاربر بتونه یه همچین چیزی رو بنویسه دیگه خودت باید یه سری شرط هایی بزاری یا یه فیلتری بزاری که اصلا کاربر نتونه به غیر از عدد چیزی تایپ کنه.

farhadamin
جمعه 25 آبان 1386, 12:26 عصر
من از حرف هات برداشتم این بود امیدوارم درست باشه ظاهرا که درسته.


#include<stdio.h>
#include <conio.h>
int main()
{
char str[30];
double flt = 112.4567;
printf("%0.4lf\n",flt);
sprintf(str, "%0.6g", flt );
printf("%s\n",str);

if(str[2]=='.'|| str[1]=='.')
{
printf("True\n");
}

getch();
return 0;

}

البته می دونمی برای من تعداد اعشاری اش مهم تره که چک بشه...
چون قبلا شرطی گذاشتم که ورودی از 20.0000 بزرگتر نباید باشه. و به خاطر همی قسمت صحیح عدد توی هموم شرط چک میشه... در مورد قسمت اعشاری می خوام بگم.
اعداد بعد از . بیشتر از چهار کاراکتر بود برنامه ارور بده.
بازم ممنون از وقتی که میگذارید

emad_67
جمعه 25 آبان 1386, 12:37 عصر
درسته ولی توی شرط اگه میخوای که عدد فقط 2 رقم صحیح داشته باشه دیگه نباید str[1] رو هم برابر '.' بگیری. فقط همین


if(str[2]=='.')

farhadamin
شنبه 26 آبان 1386, 15:11 عصر
درسته ولی توی شرط اگه میخوای که عدد فقط 2 رقم صحیح داشته باشه دیگه نباید str[1] رو هم برابر '.' بگیری. فقط همین


if(str[2]=='.')

برای این این کارو کردم که اگر یک رقم هم بود مثل 2.9987 هم قبول کنه.....اما تعداد اعشاری رو نمی دوم چه جوری چک کنم.

farhadamin
شنبه 26 آبان 1386, 15:17 عصر
سلام دوستان

ممنون از لطفت عماد جان

ببین برنامه ای که من نوشتم چند ساغت را محاسبه می کنه و به صورت مثلا 56 23 11 نشون می دهد////
که ساعت یازده و بیست و سه دقیقه و پنجاه و شش ثانیه است.
می خواستم ساعت ها را روی خروجی مرتب کنم... روش هم زیاد مهم نیست ... اما بهتر است از تابع return استفاده کنم.....

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

امیدوارم بازم راهنمایم کنید مثل همیشه...

emad_67
شنبه 26 آبان 1386, 17:35 عصر
اما تعداد اعشاری رو نمی دوم چه جوری چک کنم.
برای چک کردن اعشار هم اگه قسمت اعشار عدد از قسمت صحیح جدا کنی و بعد تبدیل کنی به رشته میتونی با تابع strlen طول رشته رو به دست بیاری که مثلا 4 هست یا نه. یا اینکه اگه قسمت اعشار جدا نشده باشه باید از مکان '.' به اندازه 4 خونه بری جلو و چک کنی خونه ها رو.

می خواستم ساعت ها را روی خروجی مرتب کنم.
منظورت رو نفهمیدم. یعنی چی روی خروجی مرتب کنی؟

farhadamin
شنبه 26 آبان 1386, 19:39 عصر
در مورد مرتب سازی
یعنی خروجی برنامه به صورت
چند تا ساعت است )بعنی برنامه یک سری عدد خاص رو می گیره و اون را تبدیل به ساعت می کنه در صفحه اول یه مقدار توضیح دادم.
در نهایت جروجی مثلا این جوریه.
04 59 19 00 50 04 41 28 6 10 01 11 22 59 02 01 00 22 04 16 01
که عدد اول نشان دهنده ساعت دومی دقیقه و سومی ثانیه است.
دو باره عدد دوم می آید که آن هم عدد اول نشان دهنده ساعت دومی دقیقه و سومی ثانیه است. و به همین ترتیب اعداد بعدی...
می خوام این ساعت ها به ترتیب مرتب بشوند.....
در یک سری فرم ها چیزی های خوندم اما متوجه نشدم...
فکر کنم اول باید هر ساخت که به صورت ساعت و دقیقه و ثانیه است را تبدیل به یک عدد واحد کنم و بعد مرتب کنم و دوباره تبدیل به ساعت و دقیقه و ثانیه کنم....

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

اصلا نمی دوم لگاریتم مرتب سازی چه جوریه... ممنون

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

emad_67
شنبه 26 آبان 1386, 21:34 عصر
برای مرتب کردن ساعت ها میتونی همون طور که خودت گفتی یعنی ابتدا ساعت بعد دقیقه و بعد ثانیه ها رو مقایسه کنی. البته اگه بخوای به یه عدد واحد تبدیل کنی دوباره بر گردوندنش سخت میشه. اصلا چرا برای خوندش ساعت میخوای یه عدد اعشاری رو بخونی و بد تفکیک کنیش؟
از همون اول جدا جدا از کاربر مقادیر رو بگیر. ضمنا به نظرم بهتره که یه struct تعریف کنی که متغیر های سعت و دقیقه و ثانیه در اون قرار داشته باشن. با این کار میتونی یه آرایه از اون struct بسازی که هر خونه اون معادل یه ساعت هست یهنی هر خونه هم دقیقه هم ساعت و هم ثانیه رو در خودش داره.

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


strlen(char *);
که یه مقدار int بر میگردونه و این تابع در string.h قرار داره.
ساده ترین نوع مرتب سازی هم bubble sort یا مرتب سازی حبابی هست که اگه بگردی همین جا پیادا میکنی

farhadamin
شنبه 26 آبان 1386, 23:58 عصر
اصلا چرا برای خوندش ساعت میخوای یه عدد اعشاری رو بخونی و بد تفکیک کنیش؟
ببین توی بعضی از دستگاه های صنعتی، ساعت به صورت 20 ساعت و 100 دقیقه و 100 ثانیه است... و به این صورت نوشته می شه مثلا 13.3345 ( که نشان دهنده ساعت سیزده و سی و سه دقیقه و چهل و پنج ثانیه است.....این به این به این خاطره که ساعت به صورت یک عدد و کار با اون راخت تره درون دستکاه... برای مقایسه با عدد های دیگه....

خوب من می خوام یه برنامه بنویسم که ساعت معمولی خودمون را به ساعت صنعتی و بالعکس تبدیل کنه......در قسمت تبدیل به ساعت خودمون بعدش باید ساعت ها را مرتب کنم.......
من برنامه را نوشتم در پست بعد میگذارم.... اما مشکلاتی که می دونی باقی مونده لطفا به برنامه یک نگاهی بکن.... البته با تابع برگشتی باید بنویسم که من بلد نیستم........


ضمنا به نظرم بهتره که یه struct تعریف کنی که متغیر های سعت و دقیقه و ثانیه در اون قرار داشته باشن.
به نطر خیلی خوب می یاد اما من اطلاعات زیادی در موردش ندارم دارم توی اینترنت می گردم اما تا حالا چیز زیادی پیدا نکردم...

farhadamin
یک شنبه 27 آبان 1386, 00:41 صبح
این هم کد برنامه که البته با قایل ورودی و خروجی است اما در ورودی اعداد به صورت
13.2345
و از این نوع هستند اسم فایل ورودی هم inddata.txt است.

البته من خود برنامه را به صورت کامل هم می گذارم الان....ممنون



#include <stdio.h>
#include<conio.h>





int main(void)
{
FILE *fp1, *fp2;
double Double;
int nCountOFArrow;

fp1 = fopen("inddata1.txt","r");
fp2 = fopen("uddata.txt", "w");


nCountOFArrow = 0;
while (fscanf(fp1,"%lf",&Double)!=EOF)

{

//somaresh tedad adad vorodi//

//Ý˜Ñ ˜ÑÏã ÈÑÇí ÞÓãÊ ãÑÊÈ ÓÇÒí Èå ÏÑÏã ãí ÎæÑå.||

nCountOFArrow++;

//!###########################//


//ÓÇÚÊ ÕäÚÊí äÈÇíÏ ÈÇáÇÊÑ ÇÒ 20.0000 ÈÇÔå//
// ÇÇáÈÊå ÈÇíÏ ˜ åã ÈÔä ˜å ÊÚÏÇÏ ÇÚÔÇÑí ÈÇáÇ ÇÒ 4 äÈÇÔå//
if (Double<0 || Double>20.0000)
{

printf("\n\n! ! ! ! FEJL ! ! ! !\n\n%7.4lf > 20 :fejl din %d tal i inddata file\n\n! ! ! ! FEJL ! ! ! !\n\n",Double,nCountOFArrow);
fprintf(fp2,"\n\n! ! ! ! FEJL ! ! ! !\n\n%7.4lf > 20 :fejl din %d tal i inddata file\n\n! ! ! ! FEJL ! ! ! !\n\n",Double,nCountOFArrow);
getch();
continue;
}
//over 20.0000 tjekes//end

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


//****************************//
else
{
///ÞÓãÊ ÊÈÏíá ÚÏÏ æÑæÏí Èå Óå ÈÎÔ Ïæ ÚÏÏí ˜å ÇáÈÊå Ç˜Ñ ÚÏÏ æÑæÏí ÝÞØ Êæí ÈÑäÇãå //
//Èå ÕæÑÊ åÇÑ ÑÞãí ÈæÏ ãÍÇÓÈÇÊ ÑÇÍÊ ÊÑ ÈæÏ ãí ÏæäíÏ ˜å ÎæÏ Óí ÇÚÏÇÏ ÇÚÔÇÑí ãËáÇ 14.2376//
// ÑÇ ÈÇ ÇÚÔÇÑ åÇí ÒíÇÏ ÏÑ äÙÑ ãí íÑÏ14.23769999999999//
fprintf(fp2,"sanati: %7.4lf\n\n",Double);
printf("sanati : %7.4lf\n\n",Double);
int Tim = (int) Double;

Double -= Tim;
Double *= 100;
int min = (int) Double;
Double -= min;
Double *= 100;
Double = ((int)(Double*100))/100.0;
int sek = (int) Double;
if (Double - sek>=0.50)
sek+= 1;
Double = ((((sek/100.)+ min)/100.)+ Tim)*(24./20.);


//*******************//
//ÊÈÏíá ÏæÈÇÑå ÚÏÏ Èå ÏÓÊ ÂãÏå Èå Óå ÈÎÔ//




int Ntim = (int) Double;

Double -= Ntim;
Double *= 60;
int Nmin = (int) Double;
Double -= Nmin;
Double *= 60;
Double = ((int)(Double*100))/100.0;
int Nsek = (int) Double;
if (Double - Nsek>=0.50)
Nsek+= 1;

//*******************//
//ãÍÇÓÈå Çíä ˜å ÞÓãÊ ËÇäíå æ ÏÞíÞå ÈÇáÇ ÊÑ ÇÒ 60 äÈÇÔäÏ //

if (Nsek>=60)
{
Nsek -=60;
Nmin += 1;
}
if (Nmin>=60)
{
Nmin -=60;
Ntim += 1;
}

//*******************//
//end rettelse//

fprintf(fp2,"adi timer: %02d %02d %02d\n\n\n\n",Ntim,Nmin,Nsek);
printf("adi timer: %02d %02d %02d\n\n\n\n",Ntim,Nmin,Nsek);



}



}
printf("\nRead %d arrow information from file.\nEND.",nCountOFArrow);

fclose(fp1);
fclose(fp2);
getch();
}

emad_67
یک شنبه 27 آبان 1386, 09:44 صبح
من تا فردا شب ایشالا بهت جواب میدم. امروز نمیرسم. شرمنده

farhadamin
یک شنبه 27 آبان 1386, 17:28 عصر
من تا فردا شب ایشالا بهت جواب میدم. امروز نمیرسم. شرمنده
ممنون از لطفت و منتظرم...ممنون ...ببین می تونی لطف کنی توضیح بدی با تابع برگشتی(return) چه جوری بنویسمش.... ممنون هزار بار

emad_67
دوشنبه 28 آبان 1386, 18:05 عصر
سلام و معذرت از اینکه دیر شد.
والا من درست نفمیدم چیکار کردی اصلا :لبخند:
به هر حال ظاهرا که جواب میده ولی بهتره برنامت رو با تابع بنویسی و اینکه 3 تا متغیر تعریف که کردی و مقدار های ساعت و دقیقه و ثانیه رو که در اونا قرار دادی، دیگه از این به بعد فقط اون سه مقدار رو به مقدار های مورد نظر تبدیل کن تا دیگه با Double کار نداشته باشی. نمیدونم شایدم احتیاج بوده که استفاده کردی.
در مورد کنترل ممیز هم توی c دیدم که دوستام استفاده میکنن ولی من بلد نیستم. میتونی یه تاپیک جدا بزنی و همین سوال رو بپرسی.

farhadamin
دوشنبه 28 آبان 1386, 20:05 عصر
والا من درست نفمیدم چیکار کردی اصلا :لبخند:
.....ولی بهتره برنامت رو با تابع بنویسی و اینکه 3 تا متغیر تعریف که کردی و مقدار های ساعت و دقیقه و ثانیه رو که در اونا قرار دادی، دیگه از این به بعد فقط اون سه مقدار رو به مقدار های مورد نظر تبدیل کن تا دیگه با Double کار نداشته باشی. نمیدونم شایدم احتیاج بوده که استفاده کردی.

سلام
اولا ممنون از وقتی که گذاشتی......
بعد فکر کنم اون قسمتی که می گی نفهمیدی مربوط به Double باشه من باید اول عدد ورودی مثلا (12.3456) را به سه قسمت تبدیل می کردم.... که نشان دهنده ساعت و دقیقه و ثانیه باشه... به همین خاطر عدد ورودی (Double) را اول قسمت صحیحش را جدا کردم بعد دو رقم اول اعشاری و بعد دو رقم آخر که نشان دهنده ثانیه بود....بعد با استفاده از فرمول اون را به ساعت معمولی خودمون تبدیل کردم....در آخر هم باید خروجی که همون ساعت معمولی خودمون را مرتب کنم..(البته می دونی که در خروجی تعدادی ساعت داریم). که بلد نیستم......


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

emad_67
دوشنبه 28 آبان 1386, 20:33 عصر
والا اگه من بودم ابتدا یه struct یا کلاس تعریف می کردم و توابع مورد نظر برای تبدیل برنامه رو مینوشتم. به یه آرایه ای از اشیاء یا متغیر های struct هم نیازه. ولی خوب چون تو با اینا کار نکردی باید همین جوری مینوشتم منم. برای همین مرتب سازی هم باید کلیه زمان ها داخل آرایه قرار بگیرن تا بشه مرتب کرد. توی برنامه شما فقط یه زمان رو از ورودی میخونی و اونو در خروجی چاپ میکنی و این اعداد هیچ جا ذخیره نیستند که بشه مرتب سازی رو روش پیاده کرد. البته چون یه فایل رو برای خروجی زمان های تبدیل شده در نظر گرفتی میتونی اونا رو از فایل دوم بخونی و در آرایه قرار بدی و بعد مرتبشون کنی. منظورم از تابع هم این بود که برای هر کاری تو برنامه یه تابع تعریف کنی و عملیات رو مورد نظر رو به اون واگذار کنی. این جوری برنامه خیلی مرتب تر میشه واگه مشکلی هم در قسمتی پیش بیاد میتونی با بررسی اون تابع مورد نظر اشکال رو پیدا کنی.
به هر حال الان مشکلت فقط مرتب سازی هست؟ اگر این طور هست با وضعیت فعلی باید 3 تا آرایه تعریف کنی که معادل ساعت ها و ... باشن. در مورد الگوریتم مرتب سازی، سادهترین الگوریتمی که میتونی استفاده کنی bubble sort یا مرتب سازی حبابی هست که اگه همین جا هم بگردی پیدا میکنی. ولی به نظرم اول struct یا همون ساختار ها رو یاد بگیر بعد خیلی بعتر میتونی بنویسی. زیاد چیز خاصی هم نداره اصلا خیلی ساده هست.

farhadamin
دوشنبه 28 آبان 1386, 20:47 عصر
ولی به نظرم اول struct یا همون ساختار ها رو یاد بگیر بعد خیلی بعتر میتونی بنویسی. زیاد چیز خاصی هم نداره اصلا خیلی ساده هست.

راستش من هم می خووام برنامه را با struct بنویسم اما بلد نبودم اکه جایی مطلب آموزشی در مورد می شناسی بهم معرفی کن این جوری برنامه درست کار میکنه اما برای کار های بعدی مشکل زیاد داره.... ممنون

emad_67
دوشنبه 28 آبان 1386, 23:04 عصر
این 3 قسمت رو بخون:
http://cpplearning.blogfa.com/post-19.aspx
http://cpplearning.blogfa.com/post-20.aspx
http://cpplearning.blogfa.com/post-21.aspx

farhadamin
چهارشنبه 30 آبان 1386, 02:21 صبح
من دارم در موردش می خونم برنامه را که تغییر دادم می گذارم این جا یک لطفی کنید غلط یابی کنید......

عماد جان بازم از لطفت ممنون.

farhadamin
چهارشنبه 30 آبان 1386, 15:51 عصر
سلام میشه لطف کنید بگید چرا به قسمتی که من می خوام معادله در main بازخوانی کنم ایراد می گیره...
در زیر نوشتم به کدام قسمت.... ممنون

#include <stdio.h>
#include <conio.h>

double nytilgammel(double nytimer, int *time, int * min, int * sek)
{
nytimer *= (24./20.);

*time = (int) nytimer;

nytimer -= *time;
nytimer *= 60;
*min = (int) nytimer;
nytimer -= *min;
nytimer *= 60;
*sek = (int) nytimer;
}





int main(void)
{
int time[80], min[80], sek[80];
double nytimer[80];
char d;
double nytilgammel[80],a, b,c,e;
printf("1 for ny til gammel");
printf("2 for gammel til ny");
printf("3 for Exit");
scanf("%s",&d);
if (d==1)
{


FILE *fp1, *fp2;

fp1 = fopen("inddata1.txt","r");
fp2 = fopen("uddata.txt", "w");

fscanf(fp1,"%lf",&nytimer);


nytilgammel(nytimer, time, min, sek);


}



دقیقا به تا به این خط می رسه... error می دهد.


nytilgammel(nytimer, time, min, sek);
"nytilgammel" cannot be used as a function
من در بالا nytilgammel را به عنوان یک معادله معرفی کردم.....ممنون و منتظرم

emad_67
چهارشنبه 30 آبان 1386, 16:39 عصر
nytimer یه آرایه هست که وقتی بخوای اونو به تابع ارسال کنی باید در prototype به این صورت بنویسیش


double nytilgammel(double *nytimer, int *time, int * min, int * sek)

یا


double nytilgammel(double nytimer[], int *time, int * min, int * sek)

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


nytimer *= (24./20.);

و بقیه جا هایی که nytimer رو * یا - کردی رو هم باید درست کنی.

farhadamin
چهارشنبه 30 آبان 1386, 16:44 عصر
ببین مقدار nytimer را از تایع scanf گرفته می شه که و از کاربر در یافت می میشه....
که من ازش توی تابع فرعی که دارم برای انجام محاسبات می خوام استفاده کنم......

emad_67
چهارشنبه 30 آبان 1386, 17:38 عصر
من با scanf کار نکردم ولی فکر نمیکنم اصلا درست باشه اینجوری که نوشتی. چون nytimer یه آرایه هست و باید تو یه حلقه for مقادیر رو تک تک در هر خونه اون قرار بدی.

farhadamin
پنج شنبه 01 آذر 1386, 16:33 عصر
من با scanf کار نکردم ولی فکر نمیکنم اصلا درست باشه اینجوری که نوشتی. چون nytimer یه آرایه هست و باید تو یه حلقه for مقادیر رو تک تک در هر خونه اون قرار بدی.آره می دونم عماد جان... می حواستم بنویسم.. برنامه هنوز کامل نشده ... اما می خواستم ببینم توی قسمتی که تابع فرعی را توی تابغ اصلی main فراخوانی کردم درست انحام دادم یا نه.... تابع scanf همون تابعی است که اطلاعات را از کی برد می گیره فکر کنم cin باشه توی سی پلاس......
ممنون

farhadamin
جمعه 02 آذر 1386, 23:26 عصر
سلام من یک مقدار تغییرات توی برنامه دادم عماد جان سعی کردم همان جوری گه گفته بودی بنویسم....اما هنوز به قسمتی که در تابپ قبلی گفته بودم ایراد می گیره... لطف کنید راهنمایی کنید....


#include <stdio.h>
#include <conio.h>
//*******************ny til gammel******************///
double nytilgammel(double nytimer, int *gtime, int * gmin, int * gsek)
{
nytimer *= (24./20.);

*gtime = (int) nytimer;

nytimer -= *gtime;
nytimer *= 60;
*gmin = (int) nytimer;
nytimer -= *gmin;
nytimer *= 60;
*gsek = (int) nytimer;
}

//*********************end**************************//

//*******************gammel til ny*********************//

double gammeltilny (int time, int min, int sek,double *nytid)
{
*nytid = ((((sek/60.)+ min)/60.)+ time)*(20./24.);
}
//**********************end************************* **//

int main()
{
FILE *fp1, *fp2;
FILE *fp3, *fp4;

int gtime[80], gmin[80], gsek[80];
double nytimer[80];
int time[80], min[80], sek[80];
double nytid [80];
char menu;
double nytilgammel[80],a, b,c;
double gammeltilny[80],d,e,f;
int i;

printf("\n\t1. for ny til gammel");
printf("\t2. for gammel til ny\n");
printf("\t3.for Exit");

scanf("%s",&menu);

//***********************************************//
if (menu==1)
{
fp1 = fopen("inddata1.txt","r");
fp2 = fopen("uddata.txt", "w");
while (fscanf(fp1,"%lf",&nytimer[i])!=EOF)
{


nytilgammel( nytimer, *gtime, *gmin, *gsek);

i++;
fprintf(fp2,"Gammel timer: %02d %02d %02d\n\n\n\n",gtime[i],gmin[i],gsek[i]);

}
}

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

if (menu==2)
{
fp3 = fopen("ind.txt","r");
fp4 = fopen("ud.txt", "w");

while (fscanf(fp3,"%d%d%d",&time[i],&min[i],&sek[i])!=EOF)
{
gammeltilny (time,min,sek,*nytid);
i++
fprintf(fp4,"Ny tid: %0.04lf\n\n\n",nytid[i]);
}
}

if (menu==3)
{
exit(0)
}
else
{
printf("Error",)
}
getch();


}


منظورم به این قسمت البته می دونم برنامه زیاد ایراد داره.. اما پیداشون نمی کنم...

nytilgammel( nytimer, *gtime, *gmin, *gsek);

emad_67
شنبه 03 آذر 1386, 09:40 صبح
مشکل اینه که اومدی توی بدنه تابع nytilgammel مشخص کردی که پارامتر اول از نوع double هست در صورتی که داری به جای همون پارامتر یه آرایه از نوع double به تابع ارسال میکنی.
یعنیباید در


nytilgammel( nytimer, *gtime, *gmin, *gsek);

تک تک خونه های آرایه رو ارسال کنی به این شکل


nytilgammel( nytimer[i], *gtime, *gmin, *gsek);

مشکل دیگه ای که در همین تابع هست اینه که برا متغیر های بعدی نوشتی gtime* و ... در صورتی که اصلا نیازی نیست چون با نوشتم نام آرایه که یک اشاره گر به خونه اول آرایه هست مشکل رفع میشه( وقتی مینویسی gtime* هیچ فرقی با gtime[0] نمیکنه) یعنی به این صورت:


nytilgammel( nytimer[i], gtime, gmin, gsek);

ولی کلا پیاده سازی تابع nytilgammel غلطه. چون تو توی تابع اومدی مثلا نوشتی


nytimer -= *gtime;

که این کد معادل همینه


nytimer -= gtime[0];

که در صورت نیازت باید یه حلقه یا به هر صورتی یه ایندسی رو برای اون در نظر بگیری.
در تابع gammeltilny هم همین مشکلات وجود داره. و این تابع ها باید یه مقداری رو برگردونن که این کار رو انجام ندادی.
اشکالات جزیی هم:


if (menu==3)
{
exit(0)
}
else
{
printf("Error",)
}

تبدیل کن به


if (menu==3)
{
exit(0);
}
else
{
printf("Error");

و توی همین شرط مقدار menu یک کاراکتر هست که وقتی مینویسی 3 میاد اونو با کد اسکی 3 مقایسه میکنه. در صورتی که می خوای با کاراکتر 3 مقایسه بشه باید اونو توی '3' بزاری.
مقدار i رو هم 0 کن.
به نظرم تو اشاره گر ها یه مقدار مشکل داری که بهتره رفعش کنی.
موفق باشی

farhadamin
شنبه 03 آذر 1386, 17:36 عصر
سلام عماد تغییراتی که گفتی را روی برنامه انجام دادم ... توی یک سایت هم یک مقدار در مورد اشاره گرها خواندم.... اما هنوز هم به همان جمله ای که در بالا گفتم ایراد می گیره می شه بک لطفی کنی دوباره یک نگاهی بهش بیندازی... خیلی ممنون....
من در ادامه برنامه باید اهداد خروجی را مرتب کنم...که این قسمت ر ا هنوز انحام ندادم منتطرم ایرادات این قسمت ها را پیدا کنم با کمک شما....گفتم در حریان باشی.....

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

#include <stdio.h>
#include <conio.h>
//*******************صنعتی به معمولی******************///
double nytilgammel(double nytimer[80], int *gtime[], int * gmin[], int * gsek[])
{
int i;
for (i=0; i<80; i++)
{
nytimer[i] *= (24./20.);

*gtime[i] = (int) nytimer[i];

nytimer[i] -= *gtime[i];
nytimer[i] *= 60;
*gmin[i] = (int) nytimer[i];
nytimer[i] -= *gmin[i];
nytimer[i] *= 60;
*gsek[i] = (int) nytimer[i];

}
}
//*********************end**************************//

//*******************معمولی به صنعتی*********************//

double gammeltilny (int time[80], int min[80], int sek[80],double *nytid[])
{
int i;
for (i=0; i<80; i++)
{
*nytid[i] = ((((sek[i]/60.)+ min[i])/60.)+ time[i])*(20./24.);
}
}
//**********************end************************* **//

int main()
{
FILE *fp1, *fp2;
FILE *fp3, *fp4;

int gtime[80], gmin[80], gsek[80];
double nytimer[80];
int time[80], min[80], sek[80];
double nytid [80];
int menu;
double nytilgammel[80],a, b,c;
double gammeltilny[80],d,e,f;
int i;

printf("\n\t1. for ny til gammel");
printf("\t2. for gammel til ny\n");
printf("\t3.for Exit");

scanf("%s",&menu);

//***********************************************//
if (menu==1)
{

fp1 = fopen("inddata1.txt","r");
fp2 = fopen("uddata.txt", "w");
while (fscanf(fp1,"%lf",&nytimer[i])!=EOF)
{
for (i=0; i<80; i++)
{
nytilgammel( nytimer[i], &gtime[i], &gmin[i], &gsek[i]);


fprintf(fp2,"Gammel timer: %02d %02d %02d\n\n\n\n",gtime[i],gmin[i],gsek[i]);
}
}
}

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

if (menu==2)
{
fp3 = fopen("ind.txt","r");
fp4 = fopen("ud.txt", "w");

while (fscanf(fp3,"%d%d%d",&time[i],&min[i],&sek[i])!=EOF)
{
for (i=0; i<80; i++)
{
gammeltilny (time[i],min[i],sek[i],*nytid[i]);

fprintf(fp4,"Ny tid: %0.04lf\n\n\n",nytid[i]);
}
}
}

if (menu==3)
{
exit(0);
}
else
{
printf("Error",);
}
getch();


}


هنوز...
هم به این قسمت ایراد می گیره...

nytilgammel( nytimer[i], &gtime[i], &gmin[i], &gsek[i]);

البته حتما ایراد های دیگه ای داره هنوز....

نمی دونم یادت هست یا نه این همون برنامه ای است که ساعت صنعتی را به ساعت معمولی و برعکس تبدیل می کرد...

نمی دونم چه جوری ازت تشکر کنم...ممنون

Nima_NF
شنبه 03 آذر 1386, 18:16 عصر
برنامه شما پر از اشتبا هات برنامه نویسی هست که رفع کردن همه آن ها مساوی با نوشتن دوباره برنامه.

مثلا برای تابع nytilgammel شما تعریف کردید double مقدار برگشتی تابع در حالی که return ندارد. یا تابع را به تابع بدون مقدار برگشتی یعنی void تبدیل کنید.



double nytilgammel(double nytimer, int *time, int * min, int * sek)
{
// codes
return (any double number)
}


خواندن از فایل : شما با دستور fscanf فقط یک مقدار را از ورودی می خوانید پس اول همه آنها را با هما حلقه for تک تک در یک آرایه 80 تایی بریزید و سپس تابع را فراخوانی کنید. نه اینکه 80 مرتبه تابع را نیز برای هر خانه تکرار کنید.

ضمنا تعریف توابع شما و استفاده از آن کلا غلط است.
1- حلقه for بیرون تابع را حذف کنید.(برای scanf همچنان باقی بماند)
2- وقتی می خواهید آرایه ای به صورت آرگومان به تابع ارسال می کنید در تابع ، آرگومان را اینگونه بنویسید:(هر چهار آرگومان را)


double * nytimer
3 و 4- موقع فراخوانی تابع فقط اسم انها را بدون * یا & یا [] به عنوان ارگومان ارسال کنید که این به این معنی هست که شما ادرس اول آرایه را به تابع فرستادید و حالا می توانید مثل آرایه های معمولی با [] و i در حلقه در داخل تابع از انها استفاده کنید. و اگر هم مقدارشان تغییر کند واقعا مقادیر تغییر می کنند ؛ پس برای مواقعی که نمی خواهید آرایه ها تغییر کنند در تعریف ارگومان تابع بنویسید :



const double * nytimer

farhadamin
شنبه 03 آذر 1386, 21:05 عصر
سلام
ممنون از لطفت
ناامیدوم کردی.....
کد را با توجه به حرف های شما تغییر دادم.... فکر کنم بهتر شده باشه... اما هنوز هم به عبارت


nytilgammel( nytimer, gtime, gmin, gsek);

ایراد می گیره در اصل تابع بالا یک عدد به صورت 23.2345 (nytimer) را از تابع اصلی در یافت می کنه و بعد از انحام محاسبات سه تا عدد (gtime, gmin, gsek) را به تابع اصلی برای چاپ می فرستد....

و هم چنین به این تابع هم ایراد می گیره


gammeltilny (time,min,sek,nytid);
این تابع سه عدد به صورت 45 57 12 (min,sek,nytid) را از تابغ اصلی دریافت می کند و یک عدد (time) را به خروجی می فرسته
ایرادی هم که به دو عبارت می گیره این که ....میگه این دو عبارت را به صورت تابع نمی توانی تعریف کنی یا اشتباه تعریف کرده ای...
ممنون می شم دوباره یگ نگاهی بهش بیندازید....

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


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//*******************ny til gammel******************///
double nytilgammel(double nytimer, int *gtime, int * gmin, int * gsek)
{
int i;
for (i=0; i<80; i++)
{
nytimer *= (24./20.);
*gtime = (int) nytimer;
nytimer -= *gtime;
nytimer *= 60;
*gmin = (int) nytimer;
nytimer -= *gmin;
nytimer *= 60;
*gsek = (int) nytimer;

return(0);
}
}


//*********************end**************************//

//*******************gammel til ny*********************//

double gammeltilny (int *time, int *min, int *sek,double nytid)
{
int i;
for (i=0; i<80; i++)
{
nytid = ((((sek[i]/60.)+ min[i])/60.)+ time[i])*(20./24.);
}
return(0);
}
//**********************end************************* **//

int main()
{
FILE *fp1, *fp2;
FILE *fp3, *fp4;

int gtime[80], gmin[80], gsek[80];
double nytimer[80];
int time[80], min[80], sek[80];
double nytid [80];
int menu;
double nytilgammel[80],a, b,c;
double gammeltilny[80],d,e,f;
int i;

printf("\n\t1. for ny til gammel");
printf("\t2. for gammel til ny\n");
printf("\t3.for Exit");

scanf("%s",&menu);

//***********************************************//
if (menu==1)
{

fp1 = fopen("inddata1.txt","r");
fp2 = fopen("uddata.txt", "w");
while (fscanf(fp1,"%lf",&nytimer)!=EOF)
{
for (i=0; i<80; i++)
{
fscanf(fp1,"%lf",&nytimer[i]);
}
nytilgammel( nytimer, gtime, gmin, gsek);

fprintf(fp2,"Gammel timer: %02d %02d %02d\n\n\n\n",gtime[i],gmin[i],gsek[i]);

}
}

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

if (menu==2)
{
fp3 = fopen("ind.txt","r");
fp4 = fopen("ud.txt", "w");

while (fscanf(fp3,"%d%d%d",&time,&min,&sek)!=EOF)
{
for (i=0; i<80; i++)
{
fscanf(fp3,"%d%d%d",&time[i],&min[i],&sek[i]);
}
gammeltilny (time,min,sek,nytid);

fprintf(fp4,"Ny tid: %0.04lf\n\n\n",nytid[i]);
}

}

if (menu==3)
{
exit(0);
}
else
{
printf("Error");
}
getch();


}


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

Nima_NF
شنبه 03 آذر 1386, 23:15 عصر
شما همه مواردی را که ذکر کردم را انجام ندادید.
همانطور که در شماره 2 گفتم هر 4 آرگومان شما باید * باشد که برای اصلی ترین آرگومان که قرار است مقدارش تغییر کند ، شما انجام ندادید. هر دو تعریف تابع را به این شکل تغییر دهید:

double را به void چون نیازی به مقدار برگشتی که صفر وارد کردید ندارید (و اگر void گذاشتید باید rerurn را هم حذف کنید.)

nytimer و nytid شما هر دو آرایه هستند ، مثل 3 مورد دیگر و نه تنها باید با * آن را مشخص کنید بلکه در داخل تابع نیز باید به صورت آرگومانی از double استفاده کنید نه فقط یک متغیر double تنها. نگاهی به تعریف آن بیاندازید ، شما آن ها را مثل یک متغیر تنها در یک حلقه for گذاشته اید و [] ندارند تا آرایه پر شود.


بعد از انحام محاسبات سه تا عدد (gtime, gmin, gsek) را به تابع اصلی برای چاپ می فرستد....
3 مورد فوق عدد نیستند آرایه ای هستند شامل چندین زمان ، برای نمایش (print) همه آن ها باید داخل حلقه for باشند.




void nytilgammel(double * nytimer, int *gtime, int * gmin, int * gsek)
{
// other codes
nytimer[i] *= (24./20.);
// other codes
// No return
}

//-------------------------------
void gammeltilny (int *time, int *min, int *sek, double * nytid)
{
// other codes
nytid[i] = ((((sek[i]/60.)+ min[i])/60.)+ time[i])*(20./24.);
// other codes
// No return

}



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

ضمنا اگر همین برنامه را در یک کامپایلر تحت ویندوز و جدید مثل visual studio express می نوشتید خطا یابی ها بسیار بهتر و با شرح بیشتری بود .

emad_67
یک شنبه 04 آذر 1386, 00:34 صبح
سلام
اینجوری من یا آقا نیما فقط داریم syntax برنامه رو برات درست می کنیم که بازم ممکنه چیزی که میخوای نشه. لطفا بگو تابع های nytilgammel و gammeltilny دیققا قرار چکار کنن و آیا به این تابع ها تک تک زمان رو ارسال می خوای بکنی و یا اینکه کل زمان های موجود در آرایه ها رو میخوای بفرستی به تابع؟

farhadamin
یک شنبه 04 آذر 1386, 00:56 صبح
سلام
اینجوری من یا آقا نیما فقط داریم syntax برنامه رو برات درست می کنیم که بازم ممکنه چیزی که میخوای نشه. لطفا بگو تابع های nytilgammel و gammeltilny دیققا قرار چکار کنن و آیا به این تابع ها تک تک زمان رو ارسال می خوای بکنی و یا اینکه کل زمان های موجود در آرایه ها رو میخوای بفرستی به تابع؟

ببین تابع اول باید عددی به صورت 12.3456 را برگردونه به زمان معمولی (در برخی از دستگاه های صعنتی زمان را به صورت یک عدد نشون می دن برای راحتی کار در درون سیستم) خوب ورودی برنامه یک فایل که توش تعدادی عدد و باید همه رو دونه به دونه برگردون به زمان معمولی نشان بدهد...یعنی مثلا اگه از ورودی دو تا عدد را بخواند در خروجی هم دو تا ساعت (که البته می شود شش عدد چون هر زمان از سه عدد ساعت دقیقه و ثانیه تشکیل شده) را نشان دهد

در کل ورودی تابع اول اعدادی به صورت 14.5967 12.3456
و خروحی اون به صورت 45 23 12 و 44 23 09
که مثلا اولی می شود نه و بیست و سه دقیقه و چهل و چهار ثانیه.

در توضیح فرمولشم این که مثلا برای عدد 12.3456



12.3456*(24/20)= 14.8147
که 14 می شود مقدار ساعت
0.8147*60=48.8832
که 48 می شود مقدار دقیقه
0.8832*60= 52.992
که 52 می شود مقدار ثانیه




تابع دوم هم همین کار را بر عکس انحام می دهد یعنی از ورودی زمان را می گیرد و تبدیل به عدد که در اصل زمان در دستگاه صنعتی است می کند......
در توضیح فرمول تابع دوم هم اینه که مثلا برای زمان 45 23 12


10.3299 = ((((45/60.)+ 23)/60.)+ 12)*(20./24.);

که جواب عدد 10.3299 زمان در دستگاه صنعتی است.

البته من در نهایت باید خروجی های تابع اول (زمان ها را) مرتب کنم....که البته هنوز کدش را ننوشتم .. که باید بعدا یک تابغ برای اون تعریف کنم دوباره........

مثلا ورودی تابغ اول (inndata1.txt) این ها هستند.


0.0000 0.0001 0.0002 0.0139 0.5000 0.8333 1.0000 1.2500 1.2550 3.3333 3.3334
5.0000 7.1579 9.4433 9.4434 12.4456 15.4478 17.8631 17.8640 17.8684 17.8691
18.0000 19.4999 19.5000 19.9999 20.0000

مثلا ورودی تابغ دوم (ind.txt) این ها هستند.


00 00 00 00 00 01 00 01 00 00 01 01 00 59 59
01 00 00 04 16 35 12 60 23 02 34 2 22 34 59


بازم ممنون از لطفتون نمی دونم چه جوری تشکر کنم.......


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

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

emad_67
یک شنبه 04 آذر 1386, 09:39 صبح
مشکلی که هست اینه که تو نمیتونی یه مقداری رو به این شکل از تابع اولیه بر گردونی : 44 23 09
در اینصورت مجبوری کل آرایه ها رو به تابع ارسال کنی و بعد از تغییر، مقادیر رو در خونه های هر آرایه ذخیره کنی
اولین تابع رو با این حساب به این شکل تغییر دادم:


void nytilgammel(double *nytimer, int *gtime, int *gmin, int *gsek,int n)
{
int i;
for (i=0; i<n; i++)
{
nytimer[i] *= (24./20.);
gtime[i] = (int) nytimer[i];
nytimer[i] -= gtime[i];
nytimer[i] *= 60;
gmi[i] = (int) nytimer[i];
nytimer -= gmin[i];
nytimer[i] *= 60;
gsek[i] = (int) nytimer[i];

}
}
یه متغیر دیگه هم به عنوان پارامتر 4 ام که مشخص کننده تعداد عناصر موجود در آرایه هست(n) به تابع فرستادم تا مشکلی پیش نیاد. درسته که آرایه تو 80 تا خونه داره ولی معلوم نیست توی فایل 80 تا عنصر وجود داشته باشه، پس اگه آرایه کامل پر نشه در زمان اجرا به مشکل بر میخوری. بنابراین باید تعداد ساعت هایی رو که از فایل میخونی با یه متغیر بشمری و اون متغیر رو به تابع ارسال کنی. پس این حلقه هم اشتباه هست و باید تغییر بدی:


while (fscanf(fp1,"%lf",&nytimer)!=EOF)
{
for (i=0; i<80; i++)
{
fscanf(fp1,"%lf",&nytimer[i]);
}
nytilgammel( nytimer, gtime, gmin, gsek);

fprintf(fp2,"Gammel timer: %02d %02d %02d\n\n\n\n",gtime[i],gmin[i],gsek[i]);

}
توی اینجا هم میتونی while رو حذف کنی و شرط رسیدن به پایان فایل رو به جای i<80 در حلقه for قرار بدی. البته همچنان مشکل من و تو اینه که من c بلد نیستم و اگه مشکل دستوری در اینا وجود داشته باشه نمیتونم بهت بگم. اگه دستوراتی که در این قسمت نوشتی کاملا درست باشه باید به این شکل تغییر کنه.


for (i=0; fscanf(fp1,"%lf",&nytimer)!=EOF; i++)
{
fscanf(fp1,"%lf",&nytimer[i]);
}
nytilgammel( nytimer, gtime, gmin, gsek,i);

fprintf(fp2,"Gammel timer: %02d %02d %02d\n\n\n\n",gtime[i],gmin[i],gsek[i]);
البته بازم فکر میکنم مشکل داره بهتره برای شناسایی انتهای فایل از تابع eof استفاده کنی. مقدار i هم میشه تعداد عناصر خونده شده.
با این صحبت ها بقیه قسمت های برنامه هم خودت تغییر بده. از جمله تابع gammeltilny و ...

farhadamin
یک شنبه 04 آذر 1386, 13:05 عصر
ممنون عماد جان من تغییرات شما را اعمال کردم اما مشکل این جاست که هنوز به همان دو عبارت کمپایلر گیر می ده.... نمی دونم امکانشو داری که برنامه را دانلود کنی و چک کنی ...ممنون می شم ازت...

emad_67
یک شنبه 04 آذر 1386, 14:17 عصر
اگه میشه برنامت رو به صورت zip بزار نه rar چون الان winrar ندارم.

emad_67
یک شنبه 04 آذر 1386, 14:31 عصر
مشکلش اینه هم نام با تابع ها دو تا آرایه هم به نام های nytilgammel و gammeltilny تعریف کردی که این خودش تداخل ایجاد میکنه. این آرایه ها رو حذف کردم.

farhadamin
یک شنبه 04 آذر 1386, 16:15 عصر
ممنون عماد جان الان برنامه ارور نمی ده اما اصلا نه قسمت منوش کار می کنه نه درست مخاسبه می کنه..... جالبه چون مطمئنم که برنامه قسمت محاسبه اش درست است ... الان تابغ اول فقط یک سه عدد را بر می گردونه اونم اعداد عجیب نشون می دهد و تابع دوم یک عدد را بر می گردونه اونو هم صفر نشون می ده.... اما خیلی ممنون با این همه فکر کنم کمپایلر سی نداشتی ... .....ممنون

farhadamin
یک شنبه 04 آذر 1386, 16:33 عصر
سلام قسمت منوش درست شد.... اما بقیش هنوز همون جوریه که بالا گفتم.........:عصبانی++: ممنون

Nima_NF
یک شنبه 04 آذر 1386, 16:33 عصر
گفتم به جای اینکه هی بیایم و بگیم کجا اشتباست بیام و کل برنامه شما را تصحیح کنم تا به پست صدمی نکشه.
البته با توضیحاتی که تو صفحه قبل به طور کامل با مثال زدید دستگیرم شد که منظورتان چه هست و در آخر تست کردم ، همه جواب می دهند. (برنامه را بگیرید و خط به خط مطالعه کنید)
حدود 30/40 اشتباه داشت :گیج: که همه را درست کردم و جلوی هر خط نوشتم (البته انگلیسی)

نکات:
fscanf با حرف f متغیر double قبول نمی کنه (اصلا این تابع double قبول نمی کند) که باعث می شد غلط بشه یعنی 4 بایت را به 8 بایت می ریخت و دوباره و دوباره ، پس همه متغیر هات به float باید تغییر داده می شدند.
دوباره بعضی جا ها شما [] را یادتان رفته بود ، حتی در تابع.
در حالت نوشتن در فایل 0.04f می نوشتید که غلط است و نمی توانست بنویسد فقط 4f. کافی بود
تو حلقه ها دوبار از فایل می خواندید که غلط بود ؛ همان داخل شرط for خودش کافی بود.
کل برنامه را تو حلقه while گذاشتم تا در موقع نیاز خطا بده نه پس از هر بار اجرا.
و if های شما نیاز به else if داشتند.
و ....

با وجودی که خیلی سرم شلوغ بود و کار داشتم ، امیدوارم اینجوری وظیفه ام را انجام داده باشم.
موفق باشید و امیدوارم قبل از هر کاری مطالعه بیشتری کنید (مخصوصا که کتاب های فارسی ترجمه شده خوبی داریم)


----------------------
EDIT: فایل درست را گذاشتم

emad_67
یک شنبه 04 آذر 1386, 16:38 عصر
تابع اولی رو که چک کردم مشکلی نداشت مشکل توی این قسمت هست:


for (i=0; fscanf(fp1,"%lf",&nytimer)!=EOF; i++)
{
fscanf(fp1,"%lf",&nytimer[i]);
}

قسمت شرط حلقه for اشتباه هست.
برنامتو یه کم تغییر دادم. مقدار menu رو 1 وارد کن تا خروجی تابع اول رو ببینی


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//*******************ny til gammel******************///
void nytilgammel(double *nytimer, int *gtime, int *gmin, int *gsek,int n)
{
int i;
for (i=0; i<n; i++)
{
nytimer[i] *= (24./20.);
gtime[i] = (int) nytimer[i];
nytimer[i] -= gtime[i];
nytimer[i] *= 60;
gmin[i] = (int) nytimer[i];
nytimer[i] -= gmin[i];
nytimer[i] *= 60;
gsek[i] = (int) nytimer[i];

}
}

//*********************end**************************//
//*******************gammel til ny*********************//
void gammeltilny (int *time, int *min, int *sek,double *nytid, int n)
{
int i;
for (i=0; i<n; i++)
{
nytid[i] = ((((sek[i]/60.)+ min[i])/60.)+ time[i])*(20./24.);
}

}
//**********************end************************* **//
int main()
{
FILE *fp1, *fp2;
FILE *fp3, *fp4;

int gtime[80], gmin[80], gsek[80];
double nytimer[80];
int time[80], min[80], sek[80];
double nytid [80];
int menu;
double a, b,c;
double d,e,f;
int i;

printf("\n\t1. for ny til gammel");
printf("\t2. for gammel til ny\n");
printf("\t3.for Exit");
scanf("%d",&menu);
//***********************************************//
if (menu==1)
{

fp1 = fopen("inddata1.txt","r");
fp2 = fopen("uddata.txt", "w");
for (i=0; i<10; i++)
{

fscanf(fp1,"%lf",&nytimer[i]);
}
nytilgammel( nytimer, gtime, gmin, gsek,i);
for (int j=0; j<10; j++)
fprintf(fp2,"Gammel timer: %02d %02d %02d\n\n\n\n",gtime[j],gmin[j],gsek[j]);

}
//**************************************//
else if (menu==2)
{
fp3 = fopen("ind.txt","r");
fp4 = fopen("ud.txt", "w");

for (i=0; fscanf(fp1,"%d%d%d",&time,&min,&sek)!=EOF; i++)
{
fscanf(fp3,"%d%d%d",&time[i],&min[i],&sek[i]);
}
gammeltilny (time,min,sek,nytid,i);

fprintf(fp4,"Ny tid: %0.04lf\n\n\n",nytid[i]);
}


else if (menu==3)
{
exit(0);
}
else
{
printf("Error");
}
getch();

}

farhadamin
یک شنبه 04 آذر 1386, 16:40 عصر
ممنون نیما جان اما فکر کنم برنامه را اشتباه در سایت گذاشتی چون ای برنامه که گذاشتی هیچ float توش نیست... بعد هنوز فقط error را به خروجی می دهد..... اما هزار بار ممنون از لطفت.....

Nima_NF
یک شنبه 04 آذر 1386, 16:47 عصر
شرمنده اشتباها فایل قبلی را zip کردم ، فایل پست قبلی را edit کردم .دوباره download کنید.
error را اصلا تغییر دادم به چیز دیگری.


ضمنا هر وقت به جواب رسیدید بر روی گفتگوی مفید کلیک کنید تا پست بسته شود

farhadamin
یک شنبه 04 آذر 1386, 17:05 عصر
ممنون نیما جان اما

نکات:
fscanf با حرف f متغیر double قبول نمی کنه (اصلا این تابع double قبول نمی کند) که باعث می شد غلط بشه یعنی 4 بایت را به 8 بایت می ریخت و دوباره و دوباره ، پس همه متغیر هات به float باید تغییر داده می شدند
اما فکر نمی کنم این درست باشه جون من قبلااستفاده کردم در تایپ قبل هم عماد جان استفاده کرد... مشکلی نداشت..


با وجودی که خیلی سرم شلوغ بود و کار داشتم ، امیدوارم اینجوری وظیفه ام را انجام داده باشم.
موفق باشید و امیدوارم قبل از هر کاری مطالعه بیشتری کنید (مخصوصا که کتاب های فارسی ترجمه شده خوبی داریم)



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

farhadamin
یک شنبه 04 آذر 1386, 17:12 عصر
تابع اولی رو که چک کردم مشکلی نداشت مشکل توی این قسمت هست:


for (i=0; fscanf(fp1,"%lf",&nytimer)!=EOF; i++)
{
fscanf(fp1,"%lf",&nytimer[i]);
}

قسمت شرط حلقه for اشتباه هست.
برنامتو یه کم تغییر دادم. مقدار menu رو 1 وارد کن تا خروجی تابع اول رو ببینی
[/code]
ممنون عماد جان.... آرده کاملا درست کار می کنه تابع دوم را خودم سعی می کنم درستش کنم.... ممنون با کاری که شما کردید و نیما جان سعی می کنم خودم دو تاشو قاطی کنم یک چیزی از توش در بیاورم.... اکه دوتاشونو خراب نکنم.... بی نهایت ممنون....
در ضمن اون مرتب کردنش را هم الان شروع می کنم.... اگه لطف کنی اشکالاتمو را بگیرید ممنون می شم......واقعا اگه شما نبودید نمی دونم این برنامه به این حا می رسید یا نه......ممنون

farhadamin
یک شنبه 04 آذر 1386, 18:31 عصر
شرمنده اشتباها فایل قبلی را zip کردم ، فایل پست قبلی را edit کردم .دوباره download کنید.
error را اصلا تغییر دادم به چیز دیگری.


ضمنا هر وقت به جواب رسیدید بر روی گفتگوی مفید کلیک کنید تا پست بسته شود

ممنون نیما جان تابع دوم هنوز ایراد داره دنبال اون هستم همه اعداد را بر نمی گرداند ...ممنون اما برام عجیبه چرا با double کار نمی کنه.....

نمیدونم چرا اصلاحی که عماد انحام داده بود روی تابع اول مشکلی نداشت

Nima_NF
یک شنبه 04 آذر 1386, 18:48 عصر
اما فکر نمی کنم این درست باشه چون من قبلااستفاده کردم در تایپ قبل هم عماد جان استفاده کرد... مشکلی نداشت...

درسته حق با شماست ، من L را یادم رفته بود ، همون lf% درست بود به معنی double
ولی در هر حال وقتی 4 رقم اعشار و 2 رقم صحیح می خواهید و همان float نیز کافی هست . ولی اگر می خواهید double کنید آرگومان تابع را هم باید به double تغییر دهید

farhadamin
یک شنبه 04 آذر 1386, 18:56 عصر
void gammeltilny (int *time, int *min, int *sek,float *nytid, int n)
{
int i;
for (i=0; i<n; i++)

نیماجان من نقش n را درست متوجه نمی شه ما جایی از برنامه مقداری برای اون در نظر نگرفنیم پس چطور برنامه مقدار را تشخیص می دهد.....ممنون

ببین من می خوام خروجی تابع اول یعنی زمان هرا مرتب کنم صعودی برای 0 0 0 تا 59 59 11 و نزولی برای 00 00 12 تا 59 59 23 پیشنهاد شما چیه می می خواستم اول اعداد را توی دو ردیف مرتب کنم یعنی بزرگ تر از 59 59 11 و کوچک تر از اون... بعد از دو تا تابع جدا استفاده کنم برای مرتب کردن..... نمی دونم فکرم درسته

Nima_NF
یک شنبه 04 آذر 1386, 19:09 عصر
عدد n فقط نام آرگومان 4 ام در داخل تابع هست و هر چیز که به این آرگومان ارسال شود جای ان قرار می گیرد ، یعنی مقدار متغیر counter را که همان i+1 را به آن ارسال کردیم. (یعنی تعداد اعدادی که قرار است بخوانیم ، با ازای هر 3 عددیکی به i اضافه شده بود )
برای من تابع دوم همه را در فایل می ریزد ، گفتید برای شما جواب نمی دهد؟

emad_67
یک شنبه 04 آذر 1386, 19:13 عصر
اینم اون تابع دوم:


else if (menu==2)
{
fp3 = fopen("ind.txt","r");
fp4 = fopen("ud.txt", "w");

for (i=0; i<10; i++)
{
fscanf(fp3,"%d%d%d",&time[i],&min[i],&sek[i]);
}
gammeltilny (time,min,sek,nytid,i);
for (int j=0; j<10; j++)
fprintf(fp4,"Ny tid: %0.04lf\n\n\n",nytid[j]);
}

در کل میخواستم خودت درستش کنی چون تقریبا شبیه اون یکی بود. در مورد n هم توضیح داده شد.

farhadamin
یک شنبه 04 آذر 1386, 19:31 عصر
در کل میخواستم خودت درستش کنی چون تقریبا شبیه اون یکی بود. در مورد n هم توضیح داده شد.
ممنون
البته خودم با توجه به تابع اول درستش کرده بود (خسته نباشم)....ممنون...
ببین من می خوام خروجی تابع اول یعنی زمان ها را مرتب کنم صعودی برای 0 0 0 تا 59 59 11 و نزولی برای 00 00 12 تا 59 59 23 می خواستم ببینم نظر شما چیه .....می خواستم اول اعداد را توی دو ردیف مرتب کنم یعنی بزرگ تر از 59 59 11 و کوچک تر از اون... بعد از دو تا تابع جدا استفاده کنم برای مرتب کردن..... نمی دونم فکرم درسته البته فقط روش مرتب سازی bubble sort را می شناسم......:خجالت: ممنون

farhadamin
دوشنبه 05 آذر 1386, 04:28 صبح
سلام

عماد جان و نیما جان من تابع زیر را به برنامه اضافه کردم برای مرتب کردن خروجی تابع اول... نمی دونم درست کار کردم یا نه البته در برنامه ظاهرا جواب می ده اما.....
در ضمن باید به این ترتیب مرتب کنم که اعداد صعودی باشند برای 0 0 0 تا 59 59 11 و نزولی برای 00 00 12 تا 59 59 23 که نمی دونم اون را باید چه جوری تعریف کنم.... البته تابع زیر فقط تابع صعودی است..... نمی دونم توی همین تابع می شه این کار را کرد... یا باید یه تابع جدا بنویسم..... نمی دونم جه جوری شرط بگذارم.......ممنون بازم از لطف همیشگیتون....




void bubbleSort1(int *ta11,int *ta12,int *ta13,int max)
{
int i,imax,j,k;
int save1,save2,save3;
do
{
for (j=0,i=0,k=0;i<max-1;i++)
{
if (ta11[i+1]<ta11[i])
{
save1=ta11[i];
save2=ta12[i];
save2=ta13[i];

ta11[i]=ta11[i+1];
ta12[i]=ta12[i+1];
ta13[i]=ta13[i+1];

ta11[i+1]=save1;
ta12[i+1]=save2;
ta13[i+1]=save3;
j=i=k;
}
}
imax=j=k;
}
while (imax>0);
}

farhadamin
دوشنبه 05 آذر 1386, 23:17 عصر
سلام....
من یک دو تا تابع برای مرتب کردن خروحی به برنامه اضافه کردم اما چندان درست کار نمی کنند... یعنی فقط ساعت را مد نطر دارند و در صورتی که ساعت ها برابر باشند .... به دقیقه و ثانیه کاری ندارند.........

در ضمن من دو تا if هم استفاده کردم برای این کا باید ساعت ها برای بزرگتر از 12 به صورت صعودی و برای کوچک تر از آن به صورت نزولی مرتب شوند....... اما این ها هم درست کار نمی کنندد .... ممنون می شم یک نگاهی به برنامه بیندازید.....نمی دونم این کار را راحت تر هم می شود کرد یا با یک تابع..... .
خیلی ممنون


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

/**********************Bubble sortering1***************///
void bubbleSort1(int *ta11,int *ta12,int *ta13,int max)
{
int i,imax,j,k;
int save1,save2,save3;
do
{
for (j=0,i=0,k=0;i<max-1;i++)
{
if (ta11[i+1]<ta11[i])
{
save1=ta11[i];
save2=ta12[i];
save2=ta13[i];

ta11[i]=ta11[i+1];
ta12[i]=ta12[i+1];
ta13[i]=ta13[i+1];

ta11[i+1]=save1;
ta12[i+1]=save2;
ta13[i+1]=save3;
j=i=k;
}
}
imax=j=k;
}
while (imax>0);
}

//************************end*********************** **//

/**********************Bubble sortering2***************///
void bubbleSort2(int *ta14,int *ta15,int *ta16,int max1)
{
int i,imax,j,k;
int save4,save5,save6;
do
{
for (j=0,i=0,k=0;i<max1-1;i++)
{
if (ta14[i+1]>ta14[i])
{
save4=ta14[i];
save5=ta15[i];
save6=ta16[i];

ta14[i]=ta14[i+1];
ta15[i]=ta15[i+1];
ta16[i]=ta16[i+1];

ta14[i+1]=save4;
ta15[i+1]=save5;
ta16[i+1]=save6;
j=i=k;
}

}
imax=j=k;
}
while (imax>0);
}
//************************end*********************** **//






//*******************ny til gammel******************///
void nytilgammel(double *nytimer, int *gtime, int *gmin, int *gsek,int n)
{
int i;
for (i=0; i<n; i++)
{
nytimer[i] *= (24./20.);
gtime[i] = (int) nytimer[i];
nytimer[i] -= gtime[i];
nytimer[i] *= 60;
gmin[i] = (int) nytimer[i];
nytimer[i] -= gmin[i];
nytimer[i] *= 60;
gsek[i] = (int) nytimer[i];

/* if (nytimer[i] - gsek[i]>0.50)
gsek[i]+= 1;

//*******************/
//Retter sek og min i 100 //

/* if (gsek[i]>=60)
{
gsek[i] -=60;
gmin[i] += 1;
}
if (gmin[i]>=60)
{
gmin[i] -=60;
gtime[i] += 1;
}
*/
}
}

//*********************end**************************//

//*******************gammel til ny*********************//

void gammeltilny (int *time, int *min, int *sek,double *nytid, int n)
{
int i;
for (i=0; i<n; i++)
{
nytid[i] = ((((sek[i]/60.)+ min[i])/60.)+ time[i])*(20./24.);
}

}
//**********************end************************* **//

int main()
{
FILE *fp1, *fp2;
FILE *fp3, *fp4;

int gtime[80], gmin[80], gsek[80];
double nytimer[80];
int time[80], min[80], sek[80];
double nytid [80];
char menu;
int i, counter;

printf("\n\t*Det program regner mellem to tidsystemer\n\tv?lge sin valg til regning*\n");
printf("\n\ta. for ny til gammel");
printf("\tb. for gammel til ny\n");
printf("\n\tc.for Exit\n");

scanf("%s", &menu);

while ( true ) // just exit when number 3 is pressed
{

//***********************************************//
if( menu=='a'||menu=='A')
{

fp1 = fopen("inddata1.txt","r");
fp2 = fopen("uddata.txt", "w");

for (i=0; fscanf(fp1,"%lf",&nytimer[i])!=EOF; i++)
{
counter = i;
}
counter++ ; // counter is one more

// counter means number of data read divided by 3
nytilgammel( nytimer, gtime, gmin, gsek,counter);
fprintf(fp2,"Resultatet af convert til gammel tider er: \n\n");
for (i=0; i<counter; i++)
{

fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]);

}

fprintf(fp2,"\nResultatet af sorteringen: \n\n");
if (gtime[i]<=12)
{
bubbleSort1( gtime, gmin, gsek,counter);
for (i=0;i<counter;i++)
{
fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]);
}
}
else
{
bubbleSort2( gtime, gmin, gsek,counter);
fprintf(fp2,"\nResultatet af sorteringen: \n\n");

for (i=0;i<counter;i++)
{
fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]);
}
}
fprintf(fp2, "\nDet sorterede array er: %d",counter);
}

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

else if(menu=='b'||menu=='B')
{
fp3 = fopen("ind.txt","r");
fp4 = fopen("ud.txt", "w");

for (i=0; fscanf(fp3,"%d%d%d",&time[i],&min[i],&sek[i])!=EOF; i++)
{
counter = i;
}
counter++ ; // counter + 1, because for the first loop get i=0
gammeltilny ( time, min ,sek, nytid, counter);

for (i=0; i<counter; i++)
{
fprintf(fp4,"Ny tid: %07.4lf\n\n\n",nytid[i]);
}
fprintf(fp4, "\n\n\n\nDet sorterede array er: %d",counter);
}



else if(menu=='c'||menu=='C')
{
exit(0);
}
else
{
printf("Wrong number Entered, try it again\n");
}

scanf("%s", &menu);
}

}

emad_67
دوشنبه 05 آذر 1386, 23:43 عصر
این کد رو جایگزین تابع sort در برنامه کن


void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
void bubbleSort1(int *ta11,int *ta12,int *ta13,int max)
{
int i,j;
for (i=0;i<max;i++)
{
for(j=0;j<max-1;j++)
{
if(ta11[j]<=11 && ta11[j+1]<=11)
{
if (ta11[j+1]<ta11[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
else if(ta11[j+1]==ta11[j] && ta12[j+1]<ta12[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
else if(ta12[j+1]==ta12[j] && ta13[j+1]<ta13[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
}
}
}
}

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

farhadamin
دوشنبه 05 آذر 1386, 23:54 عصر
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}


ممنون عماد جان... ببین من این قسمت از کد را نفهمیدم یعنی کجای main باید این تابع را فراخوانی کنم...بعد من خذفشم کردم اتفاقی نیفتاد.....
در ضمن عماد حان این تابع اعداد صفر را در نظر نمی گیره یعنی زمان 00 00 00 اگه باشه اون را مرتب نمی کنه...ممنون......


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

این دو قسمت را به برنامه اضافه کردم

for (i=0; i<counter; i++)
{
if (gtime[i]<12)
{
bubbleSort1( gtime, gmin, gsek,counter);
fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]);
}
}
که خروجی برنامه اینه (البته کد مرتب سازی همون طور که در بالا گفتم صفر را در نظر نمی گیره این جا اگه مرتبه چون توی ورودی هم مرتب بوده)


00 00 00
00 00 00
00 01 00
00 36 00
00 59 59
01 11 59
01 30 00
01 30 21
03 59 59
04 00 00
06 00 00
08 35 22
11 19 55
11 19 55
اما وقتی این رو به برنامه اضافه می کنم

for (i=0; i<counter; i++)
{
if (gtime[i]>=12)
{
bubbleSort2( gtime, gmin, gsek,counter);
fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]);
}
}
خروجی اینه

06 00 00
تابع اول صعودی مرتب می کنه و تابع دوم نزولی تابغ ها درست کار می کنند (جز همون مشکل که صفر را در نظر نمی گیرند) اما نمی دونم چرا خروجی ها این جوریه ... حرف شما هم عماد جان درسته اما باید یک راهی براش پیدا کنم......

emad_67
سه شنبه 06 آذر 1386, 13:44 عصر
تابع swap دو تا پارامتر میگیره و او 2 تا رو جا بجا میکنه در واقع برای اینکه همش این کد ها:


save1=ta11[i];
save2=ta12[i];
save2=ta13[i];

ta11[i]=ta11[i+1];
ta12[i]=ta12[i+1];
ta13[i]=ta13[i+1];

ta11[i+1]=save1;
ta12[i+1]=save2;
ta13[i+1]=save3;

رو تکرار نکنی این تابع رو نوشتم که کار همینا رو انجام میده.

ببین من این قسمت از کد را نفهمیدم یعنی کجای main باید این تابع را فراخوانی کنم...بعد من خذفشم کردم اتفاقی نیفتاد.....

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

در ضمن عماد حان این تابع اعداد صفر را در نظر نمی گیره یعنی زمان 00 00 00 اگه باشه اون را مرتب نمی کنه.
تابعی که من نوشتم اعداد صفر رو هم مرتب میکنه.
یه بار دیگه اول تابع sort ایی رو که خودت نوشتی پاک کن و بعد کل کدی رو که گذاشتم جایگزین اون کن و برنامه رو اجرا کن.

این دو قسمت را به برنامه اضافه کردم

کد:
for (i=0; i<counter; i++) { if (gtime[i]<12) { bubbleSort1( gtime, gmin, gsek,counter); fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]); } }
که خروجی برنامه اینه (البته کد مرتب سازی همون طور که در بالا گفتم صفر را در نظر نمی گیره این جا اگه مرتبه چون توی ورودی هم مرتب بوده)


کد:
00 00 0000 00 0000 01 0000 36 0000 59 5901 11 5901 30 0001 30 2103 59 5904 00 0006 00 0008 35 2211 19 5511 19 55
اما وقتی این رو به برنامه اضافه می کنم

کد:
for (i=0; i<counter; i++) { if (gtime[i]>=12) { bubbleSort2( gtime, gmin, gsek,counter); fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]); } }

این راه ها اشتباه هست. مثلا نوشتی که :


if (gtime[i]<12)
{
bubbleSort1( gtime, gmin, gsek,counter);
fprintf(fp2,"%02d %02d %02d\n",gtime[i],gmin[i],gsek[i]);
}

این کد فقط برای ساعت های کمتر از 12 یک بار مجددا کل آرایه ها رو مرتب میکنه و اصلا ربطی به صعودی یا نزولی بودن نداره چون اینکار رو باید همون تابع مرتب سازی انجام بده.
من منظورت رو درست نمی فهمم که چه جوری میخوای مرتب کنی. ولی 2 تا راه داری:
یکی اینکه ساعت ای کمتر یا بیشتر از 12 رو در یه آرا یه دیگه قرار بدی و بعد هر کدوم از آرایه ها رو به یک صورت مرتب کنی.
یا اینکه میتونی ساعت های بیشتر از 12 رو در اندیس های ابتدایی یا انتهایی آرایه قرار بدی و بعد تا اون اندیس مورد نظر مرتب سازی رو انجام بدی. یعنی ساعت های کمتر از 12 مرتب شده کنار هم قرار میگیرن و بیشتر از 12 ها هم به همین شکل. البته راه اول ساده تره
اگه منظورت چیز دیگه ای هست با مثال توضیح بده.

farhadamin
سه شنبه 06 آذر 1386, 15:52 عصر
عماد جان .... بعد از تبدیل ساعت ها می خواهم ساعت ها به این صورت مرتب شوند اگر کم تر از 12 بودند از صفر تا دوازده مرتب شوند و اگر بیش تر از دوازده بودند از 24 تا دوازده مرتب شوند یعنی مثلا این جوری

00 00 00
01 23 43
01 24 56
04 34 45
09 11 23
11 59 59
23 59 59
20 45 46
17 65 39
14 23 87
13 34 29
12 00 00امیدوارم منظورم را خوب رسانده باشم.....از لطفت واقعا ممنونم

farhadamin
سه شنبه 06 آذر 1386, 15:56 عصر
من برنامه را هم میگذارم گفتن شاید چک کردنش راحت تر باشه....ممنون

emad_67
سه شنبه 06 آذر 1386, 16:18 عصر
ساده ترین راه همینه که ساعت ها رو در 2 تا آرایه قرار بدی و بعد مرتبشون کنی. یعنی بیشتر از 12 ها در یه آرایه بقیه هم در یه آرایه دیگه.

farhadamin
سه شنبه 06 آذر 1386, 16:26 عصر
ساده ترین راه همینه که ساعت ها رو در 2 تا آرایه قرار بدی و بعد مرتبشون کنی. یعنی بیشتر از 12 ها در یه آرایه بقیه هم در یه آرایه دیگه.
عماد جان این همون کاریه که بالا سعی کردم انجام بدهم و خودت گفتی اشتباه است ....منظورت را از دو تا آرایه را درست متوجه نمی شم .... ممنون از لطفت

emad_67
سه شنبه 06 آذر 1386, 17:58 عصر
تو در مثالی که زده بودی فقط برای اعداد بزرگتر از 12 و کوچکتر از 12 یکبار تابع sort رو فراخوانی کرده بودی، همین ولی من منظورم اینه که یه آرایه جدید تعریف کن و اعداد بزرگتر از 12 رو بریز توی اون و در واقع 2 تا آرایه خواهیم داشت یکی از اونا ساعت ها قبل 12 و دیگری بعد 12. بعد با همین روش میتونی آرایه ها رو به صورت نزولی و یا صعودی مرتب کنی البته باید 2 تا تابع sort بنویسی یا اینکه یه متغیر برای مشخص کردن نوع صعودی یا نزولی بودن اون به تابع بفرستی و در هون تابع چک کنی و ببینی که چه جوری باید مرتب بشه.
راه دیگه ای هم برای اینکه همین تابع فعلی هم به صورت صعودی و هم به صورت نزولی مرتب کنه هست که باید اشاره گر به توابع رو بلد باشی.

farhadamin
سه شنبه 06 آذر 1386, 18:15 عصر
تو در مثالی که زده بودی فقط برای اعداد بزرگتر از 12 و کوچکتر از 12 یکبار تابع sort رو فراخوانی کرده بودی، همین ولی من منظورم اینه که یه آرایه جدید تعریف کن و اعداد بزرگتر از 12 رو بریز توی اون و در واقع 2 تا آرایه خواهیم داشت یکی از اونا ساعت ها قبل 12 و دیگری بعد 12. بعد با همین روش میتونی آرایه ها رو به صورت نزولی و یا صعودی مرتب کنی البته باید 2 تا تابع sort بنویسی یا اینکه یه متغیر برای مشخص کردن نوع صعودی یا نزولی بودن اون به تابع بفرستی و در هون تابع چک کنی و ببینی که چه جوری باید مرتب بشه.
راه دیگه ای هم برای اینکه همین تابع فعلی هم به صورت صعودی و هم به صورت نزولی مرتب کنه هست که باید اشاره گر به توابع رو بلد باشی.

ممنون عماد جان اما می شه یک مثال بزنی...شرمنده ها....نمی دونم منظروت از آرایه جدید یک تابغ جدیده....ممنون

emad_67
چهارشنبه 07 آذر 1386, 00:10 صبح
ببخشید من یه مقدار منظورم رو بد رسوندم. باید 3 تا آرایه جدید مثل همین gtime و ... تعریف کنی و بعد موقعی که از فایل ساعت ها رو میخونی، ساعت هایی که از 12 بیشتر هست رو در این آرایه ای جدید قرار بدی. البته یه کم برنامه شلوغ میشه ولی ساده تریت راه هست. راه دیگه ای هم به ذهنم رسید اینه که ابتدا کل آرایه رو به صورت صعودی مرتب کنی و بعد مجددا آرایه و از اون اندیسی که ساعت های 12 به بعد قرار دارن مجددا نزولی مرتب کنی. توی همین مثالی که خودت زدی ابتدا اینجوری میشه:


00 00 00
01 23 43
01 24 56
04 34 45
09 11 23
11 59 59
12 00 00
13 34 29
14 23 87
17 65 39
20 45 46
23 59 59

بعد آرایه رو باید از اعت 12 00 00 به بعد به صورت نزولی مرتب کنی. امیدوارم نظورم رو درست رسونده باشم.

farhadamin
چهارشنبه 07 آذر 1386, 04:20 صبح
سلام عماد جان ممنون از لطف زیادت

کد مرتب سازی را این جوری نوشتم.... ظاهرا جواب میده.... اما به نظر زیاد مطمئن نمی یاد چون وقتی else تبدیل به else if می کنم همه چیز به هم می ریزه... اما خروجی درسته......نمی دانم نظر تو چیه.....


void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
void bubbleSort(int *ta11,int *ta12,int *ta13,int max)
{
int i,j;
for (i=0;i<max;i++)
{
for(j=0;j<max-1;j++)
{
if(ta11[j]>=12 && ta11[j+1]>=12)
{
if (ta11[j+1]>ta11[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
else if(ta11[j+1]==ta11[j] && ta12[j+1]>ta12[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
else if(ta12[j+1]==ta12[j] && ta13[j+1]>ta13[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
}
else

if (ta11[j+1]<ta11[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
else if(ta11[j+1]==ta11[j] && ta12[j+1]<ta12[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}
else if(ta12[j+1]==ta12[j] && ta13[j+1]<ta13[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}

}
}
}
]

emad_67
چهارشنبه 07 آذر 1386, 15:43 عصر
برنامت درسته، مشکلی هم نداره اگه else رو به else if تغییر بدی، اینجوری میشه دیگه:


}
}
else if (ta11[j+1]<ta11[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}

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

farhadamin
چهارشنبه 07 آذر 1386, 17:38 عصر
برنامت درسته، مشکلی هم نداره اگه else رو به else if تغییر بدی، اینجوری میشه دیگه:


}
}
else if (ta11[j+1]<ta11[j])
{
swap(ta11[j],ta11[j+1]);
swap(ta12[j],ta12[j+1]);
swap(ta13[j],ta13[j+1]);
}

که فرقی هم با else نداره چون اگه به صورت else هم بنویسی همون شرط رو باید در داخل بلاک بررسی کنی.
نه عماد جان فکر کنم منظورم را بد رساندم منظورم این if



if(ta11[j]>=12 && ta11[j+1]>=12)
{
و else ان بود برای مرتب کردن صعودی کوچک تر از ساعت دوازده و نزولی بزرگتر از 12 ...ممنون

emad_67
چهارشنبه 07 آذر 1386, 22:07 عصر
من بازم درست متوجه نشدم که منظورت از else و else if چیه؟
به هر حال برنامه مشکلی نداره

farhadamin
جمعه 09 آذر 1386, 20:47 عصر
سلام عماد جان می خواستم ازت خیلی تشکر کنم به خاطر لطفی که در حقم برای نوشتم این برنامه کردی هزار بار ازت ممنونم.... البته از آقا نیما هم ممنونم..... برنامه تموم شده.... اما هنوز یه مقدار به نظرم خشک می یاد یعنی با تغییرات کوچک همه چیز به هم می ریزه ..... اما ... از لطف شماها ممنونم.