صفحه 1 از 2 12 آخرآخر
نمایش نتایج 1 تا 40 از 74

نام تاپیک: جداسازی اعداد به صورت دو به دو

  1. #1

    Tick جداسازی اعداد به صورت دو به دو

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

    در ضمن کد زیر برای جدا کردن یک عدد که به صورت ****.** است به بخشهای دو تایی (یعنی دو رقم دو رقم ) است... (برای یک محسابه باید به این صورت درآید). اما مشکل در رقم آخر اعشاری است که بعضی مواقع خود سی عدد را گرد می کند.... یعنی مثلا عدد 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;
    }

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

    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 معادل اون چیه عوضش کن.

  3. #3
    عدد به صورت دو رقم صحیح و چهار رقم اعشاری باید باشه.
    منظورت از مقایسه عدد اولی را نفهمیدم... عدد اول من مثلا اینه 16.1221
    اما این این قسمت کد عدد را به صورت 20.9999
    در اورده.....نمی دونم کد را اجرا کردی یا نه.


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


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

  4. #4
    برنامه اینه که هنوز تکمیل نشده

    #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;
    }
    }

  5. #5
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    منظورت از مقایسه عدد اولی را نفهمیدم... عدد اول من مثلا اینه 16.1221
    اما این این قسمت کد عدد را به صورت 20.9999
    در اورده.....نمی دونم کد را اجرا کردی یا نه.
    این کد :
    Double = ((int)(Double*100))/100.0;

    فقط عدد رو بع دو رقم اعشار تبدیل میکنه. یعنی برای عددی که مثال زدی میشه 16.12.
    حالا چون تو میخوای عدد 4 رقم اعشار داشته باشه.
    برای اینکه بفهمی قسمت صحیح هم چند رقمه باید اول عدد رو به int تبدیل کنی و بعد تعداد ارقامش رو بشمری. برای فسمت اعشاری هم به همین شکل باید عمل کنی یعنی قسمت اعشاری رو جدا کن و بعد با همین دستور چکش کن.

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

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

  6. #6
    فکر کنم منظور من را بد متوجه شدید..

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

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

  7. #7
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    ببخشید در مورد اون دستور Double اشتباه کردم.
    باید قسمت اعشار و قسمت صحیح رو جدا کنی و تعداد رقم هاشون رو بشموری. برای به دست اوردن قسمت صحیح هم باید عدد رو به int تبدیل کنی و برای قسمت اعشار هم عدد اولیه و منهای قسمت صحیح کنی. البته برای شمردن تعداد رقم های قسمت اعشار ممکنه یه کم سخت بشه برا همین فکر میکنم اگه عدد رو تبذیل کنی به رشته یا اینکه قسمت های اعشار و صحیح رو جدا جدا تبدیل کنی میتونی با به دست اوردن طول رشته بفهی که مثلا عدد چند رقم اعشار داره. برای تبدیل عدد به اعشار هم این مثال رو از msdn پیدا کردم:

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

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

  8. #8
    سلام و ممنون

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

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

    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 از اون در نظر گرفته میشه. حالا اگه نمیخوای کاربر بتونه یه همچین چیزی رو بنویسه دیگه خودت باید یه سری شرط هایی بزاری یا یه فیلتری بزاری که اصلا کاربر نتونه به غیر از عدد چیزی تایپ کنه.

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

    #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 بزرگتر نباید باشه. و به خاطر همی قسمت صحیح عدد توی هموم شرط چک میشه... در مورد قسمت اعشاری می خوام بگم.
    اعداد بعد از . بیشتر از چهار کاراکتر بود برنامه ارور بده.
    بازم ممنون از وقتی که میگذارید

  11. #11
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    درسته ولی توی شرط اگه میخوای که عدد فقط 2 رقم صحیح داشته باشه دیگه نباید str[1] رو هم برابر '.' بگیری. فقط همین

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

  12. #12
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    درسته ولی توی شرط اگه میخوای که عدد فقط 2 رقم صحیح داشته باشه دیگه نباید str[1] رو هم برابر '.' بگیری. فقط همین

    if(str[2]=='.')
    برای این این کارو کردم که اگر یک رقم هم بود مثل 2.9987 هم قبول کنه.....اما تعداد اعشاری رو نمی دوم چه جوری چک کنم.

  13. #13
    سلام دوستان

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

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

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

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

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

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

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

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

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

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

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

  17. #17
    اصلا چرا برای خوندش ساعت میخوای یه عدد اعشاری رو بخونی و بد تفکیک کنیش؟
    ببین توی بعضی از دستگاه های صنعتی، ساعت به صورت 20 ساعت و 100 دقیقه و 100 ثانیه است... و به این صورت نوشته می شه مثلا 13.3345 ( که نشان دهنده ساعت سیزده و سی و سه دقیقه و چهل و پنج ثانیه است.....این به این به این خاطره که ساعت به صورت یک عدد و کار با اون راخت تره درون دستکاه... برای مقایسه با عدد های دیگه....

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

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

  18. #18
    این هم کد برنامه که البته با قایل ورودی و خروجی است اما در ورودی اعداد به صورت
    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();
    }
    آخرین ویرایش به وسیله farhadamin : یک شنبه 27 آبان 1386 در 19:09 عصر دلیل: به دلیل اشتباه در کد

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

  20. #20
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    من تا فردا شب ایشالا بهت جواب میدم. امروز نمیرسم. شرمنده
    ممنون از لطفت و منتظرم...ممنون ...ببین می تونی لطف کنی توضیح بدی با تابع برگشتی(return) چه جوری بنویسمش.... ممنون هزار بار

  21. #21
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    سلام و معذرت از اینکه دیر شد.
    والا من درست نفمیدم چیکار کردی اصلا
    به هر حال ظاهرا که جواب میده ولی بهتره برنامت رو با تابع بنویسی و اینکه 3 تا متغیر تعریف که کردی و مقدار های ساعت و دقیقه و ثانیه رو که در اونا قرار دادی، دیگه از این به بعد فقط اون سه مقدار رو به مقدار های مورد نظر تبدیل کن تا دیگه با Double کار نداشته باشی. نمیدونم شایدم احتیاج بوده که استفاده کردی.
    در مورد کنترل ممیز هم توی c دیدم که دوستام استفاده میکنن ولی من بلد نیستم. میتونی یه تاپیک جدا بزنی و همین سوال رو بپرسی.

  22. #22
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    والا من درست نفمیدم چیکار کردی اصلا
    .....ولی بهتره برنامت رو با تابع بنویسی و اینکه 3 تا متغیر تعریف که کردی و مقدار های ساعت و دقیقه و ثانیه رو که در اونا قرار دادی، دیگه از این به بعد فقط اون سه مقدار رو به مقدار های مورد نظر تبدیل کن تا دیگه با Double کار نداشته باشی. نمیدونم شایدم احتیاج بوده که استفاده کردی.
    سلام
    اولا ممنون از وقتی که گذاشتی......
    بعد فکر کنم اون قسمتی که می گی نفهمیدی مربوط به Double باشه من باید اول عدد ورودی مثلا (12.3456) را به سه قسمت تبدیل می کردم.... که نشان دهنده ساعت و دقیقه و ثانیه باشه... به همین خاطر عدد ورودی (Double) را اول قسمت صحیحش را جدا کردم بعد دو رقم اول اعشاری و بعد دو رقم آخر که نشان دهنده ثانیه بود....بعد با استفاده از فرمول اون را به ساعت معمولی خودمون تبدیل کردم....در آخر هم باید خروجی که همون ساعت معمولی خودمون را مرتب کنم..(البته می دونی که در خروجی تعدادی ساعت داریم). که بلد نیستم......


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

  23. #23
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    والا اگه من بودم ابتدا یه struct یا کلاس تعریف می کردم و توابع مورد نظر برای تبدیل برنامه رو مینوشتم. به یه آرایه ای از اشیاء یا متغیر های struct هم نیازه. ولی خوب چون تو با اینا کار نکردی باید همین جوری مینوشتم منم. برای همین مرتب سازی هم باید کلیه زمان ها داخل آرایه قرار بگیرن تا بشه مرتب کرد. توی برنامه شما فقط یه زمان رو از ورودی میخونی و اونو در خروجی چاپ میکنی و این اعداد هیچ جا ذخیره نیستند که بشه مرتب سازی رو روش پیاده کرد. البته چون یه فایل رو برای خروجی زمان های تبدیل شده در نظر گرفتی میتونی اونا رو از فایل دوم بخونی و در آرایه قرار بدی و بعد مرتبشون کنی. منظورم از تابع هم این بود که برای هر کاری تو برنامه یه تابع تعریف کنی و عملیات رو مورد نظر رو به اون واگذار کنی. این جوری برنامه خیلی مرتب تر میشه واگه مشکلی هم در قسمتی پیش بیاد میتونی با بررسی اون تابع مورد نظر اشکال رو پیدا کنی.
    به هر حال الان مشکلت فقط مرتب سازی هست؟ اگر این طور هست با وضعیت فعلی باید 3 تا آرایه تعریف کنی که معادل ساعت ها و ... باشن. در مورد الگوریتم مرتب سازی، سادهترین الگوریتمی که میتونی استفاده کنی bubble sort یا مرتب سازی حبابی هست که اگه همین جا هم بگردی پیدا میکنی. ولی به نظرم اول struct یا همون ساختار ها رو یاد بگیر بعد خیلی بعتر میتونی بنویسی. زیاد چیز خاصی هم نداره اصلا خیلی ساده هست.

  24. #24
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    ولی به نظرم اول struct یا همون ساختار ها رو یاد بگیر بعد خیلی بعتر میتونی بنویسی. زیاد چیز خاصی هم نداره اصلا خیلی ساده هست.
    راستش من هم می خووام برنامه را با struct بنویسم اما بلد نبودم اکه جایی مطلب آموزشی در مورد می شناسی بهم معرفی کن این جوری برنامه درست کار میکنه اما برای کار های بعدی مشکل زیاد داره.... ممنون

  25. #25

  26. #26
    من دارم در موردش می خونم برنامه را که تغییر دادم می گذارم این جا یک لطفی کنید غلط یابی کنید......

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

  27. #27
    سلام میشه لطف کنید بگید چرا به قسمتی که من می خوام معادله در 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 را به عنوان یک معادله معرفی کردم.....ممنون و منتظرم

  28. #28
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    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 رو * یا - کردی رو هم باید درست کنی.

  29. #29
    ببین مقدار nytimer را از تایع scanf گرفته می شه که و از کاربر در یافت می میشه....
    که من ازش توی تابع فرعی که دارم برای انجام محاسبات می خوام استفاده کنم......

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

  31. #31
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    من با scanf کار نکردم ولی فکر نمیکنم اصلا درست باشه اینجوری که نوشتی. چون nytimer یه آرایه هست و باید تو یه حلقه for مقادیر رو تک تک در هر خونه اون قرار بدی.
    آره می دونم عماد جان... می حواستم بنویسم.. برنامه هنوز کامل نشده ... اما می خواستم ببینم توی قسمتی که تابع فرعی را توی تابغ اصلی main فراخوانی کردم درست انحام دادم یا نه.... تابع scanf همون تابعی است که اطلاعات را از کی برد می گیره فکر کنم cin باشه توی سی پلاس......
    ممنون

  32. #32
    سلام من یک مقدار تغییرات توی برنامه دادم عماد جان سعی کردم همان جوری گه گفته بودی بنویسم....اما هنوز به قسمتی که در تابپ قبلی گفته بودم ایراد می گیره... لطف کنید راهنمایی کنید....

    #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);

  33. #33
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    مشکل اینه که اومدی توی بدنه تابع 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 کن.
    به نظرم تو اشاره گر ها یه مقدار مشکل داری که بهتره رفعش کنی.
    موفق باشی

  34. #34
    سلام عماد تغییراتی که گفتی را روی برنامه انجام دادم ... توی یک سایت هم یک مقدار در مورد اشاره گرها خواندم.... اما هنوز هم به همان جمله ای که در بالا گفتم ایراد می گیره می شه بک لطفی کنی دوباره یک نگاهی بهش بیندازی... خیلی ممنون....
    من در ادامه برنامه باید اهداد خروجی را مرتب کنم...که این قسمت ر ا هنوز انحام ندادم منتطرم ایرادات این قسمت ها را پیدا کنم با کمک شما....گفتم در حریان باشی.....

    ببین کد الان این جوریه...
    #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]);


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

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

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

  35. #35
    برنامه شما پر از اشتبا هات برنامه نویسی هست که رفع کردن همه آن ها مساوی با نوشتن دوباره برنامه.

    مثلا برای تابع 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






  36. #36
    سلام
    ممنون از لطفت
    ناامیدوم کردی.....
    کد را با توجه به حرف های شما تغییر دادم.... فکر کنم بهتر شده باشه... اما هنوز هم به عبارت

     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();


    }


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

  37. #37
    شما همه مواردی را که ذکر کردم را انجام ندادید.
    همانطور که در شماره 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 می نوشتید خطا یابی ها بسیار بهتر و با شرح بیشتری بود .

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

  39. #39
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    سلام
    اینجوری من یا آقا نیما فقط داریم 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


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

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

  40. #40
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    مشکلی که هست اینه که تو نمیتونی یه مقداری رو به این شکل از تابع اولیه بر گردونی : 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 و ...

صفحه 1 از 2 12 آخرآخر

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

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