یک سوال خیلی خیلی مهم>>>>

جهت طرح ابهامات و مشکلات درسی خود به این بخش مراجعه نمایید

مدیر انجمن: rosa_127

قفل شده
sanan esmaili
پست: 5
تاریخ عضویت: پنج‌شنبه 10 شهریور 1390, 10:43 am

یک سوال خیلی خیلی مهم>>>>

پست توسط sanan esmaili » پنج‌شنبه 10 شهریور 1390, 10:53 am

سلام . من دانشجوی ترم دوم مهندسی برق قدرت هستم.در حال حاضر روی زبان برنامه نویسی c++کار میکنم . که به یک سوال برخوردم اون اینه که "چطور میشه یک معادله ی خطی که هر درجه ای میتونه باشه رو بنویسیم بعد مشتقش رو برای ما چاپ کنه"..........
تقریبا" هم حلش کردم اما یه جاهاییش هنوز مشکل داره.تو رو خدا هر کدوم از مهندسین کامپیوتر که میتونند کمکم کنند. ممنون naj

PrinceOfPersia
كاربر عالي
كاربر عالي
پست: 905
تاریخ عضویت: دوشنبه 16 فروردین 1389, 11:53 am
محل اقامت: On the Earth ...

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط PrinceOfPersia » پنج‌شنبه 10 شهریور 1390, 10:59 am

معادله ی خطی
چجور معادله خطی؟
فقط توش متغیر و ضریب و توان باشه !؟

// یعنی sin و cos و log اینا توش نباشه!؟

مثلا :

کد: انتخاب همه

2x^2+3x^5
// ^ علامت توان است.

یا خیلی پیچیده تر؟

اگر در حد همین بالایی باشه .. می‌تونم راهنماییت کنم.

sanan esmaili
پست: 5
تاریخ عضویت: پنج‌شنبه 10 شهریور 1390, 10:43 am

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط sanan esmaili » پنج‌شنبه 10 شهریور 1390, 6:40 pm

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

PrinceOfPersia
كاربر عالي
كاربر عالي
پست: 905
تاریخ عضویت: دوشنبه 16 فروردین 1389, 11:53 am
محل اقامت: On the Earth ...

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط PrinceOfPersia » جمعه 11 شهریور 1390, 7:36 pm

یعنی چی عدد ثابت آخر رو 0 قرار بدیدم؟

sanan esmaili
پست: 5
تاریخ عضویت: پنج‌شنبه 10 شهریور 1390, 10:43 am

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط sanan esmaili » شنبه 12 شهریور 1390, 11:27 am

یعنی اینکه مشتق یک عدد ثابت مثل 2 و 3 و..... صفر میشه. حالا من نمیتونم این صفر رو نشون بدم.
جان من هر چه زودتر برنامه رو برام بفرستید اگه میتونید. ممنون.
مثل مثال زیر مشتق رو برات چاپ کنه.
2x^2+3x^1+3
moashtagh=4x^1+3x^0+0

PrinceOfPersia
كاربر عالي
كاربر عالي
پست: 905
تاریخ عضویت: دوشنبه 16 فروردین 1389, 11:53 am
محل اقامت: On the Earth ...

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط PrinceOfPersia » دوشنبه 14 شهریور 1390, 8:55 pm

سلام،
اول از همه واقعا عذر می‌خوام که یکم دیر جواب میدم.

خوب گرفتم چی شد ، این مسئله ، میشه گفت یکم سخته ... سخت از چه نظر؟ الان میگم !

شما هر رشته ورودی که به عنوان معادله خطی دریافت می‎‌کنید رو باید بررسی کنید ، اینطوری :

مثلا ، ورودی ما این هست :

کد: انتخاب همه

277x^4+2+x^6
اول باید عبارت‌هایی که بین علامت «+» یا «-» هستن یکی یکی از هم جدا کنید.

خیلی راحت میشه با یه حلقه نوشت.
بعد چک کنید که آیا داخل اون عبارت جداشده ، علامت ^ هست؟
اگر بود ، یکی از عدد بعد از ^ کم بشه ، و اصل عدد ضرب در عدد قبل از ^ بشه.
اگر هم نبود ، مقدار 1 یا 0 رو چاپ کنه ( برای متغیر 1 ، برای عدد 0 !)

یه نمونه مثال می‌زنم :

کد: انتخاب همه

277x^4+2+x^6
در مرحله اول 277x^4 جدا میشه.
آیا داخلش ^ داریم؟ بله !
پس 4 را ضربدر 277 کن و یکی از 4 کم ! ( 1108x^3 )

قسمت بعدی : 2 جدا میشه.
آیا داخلش ^ داریم؟ خیر ...
عدد است یا حرف (متغیر ) ، عدد ... پس عدد صفر را چاپ کن !

قسمت بعدی ، x^6
آیا ^ دارد؟ بله ...
یکی کم کن ، ضرب در عدد قبل کن ...
// البته یه شرط دیگه هم لازم هست که چک کنه ، پشت متغیر عدد هست یا نه !
// که خیلی راحت میشه ، اگه حرف ( کارکتر ) اول قسمت جدا شده ، عدد باشه ، میشه عدد در غیر اینصورت یعنی اینکه عدد نداره ...

یه نکته دیگه ، وقتی اینطوری جدا می کنید ، نیاز به یه تابع تبدیل رشته به عدد دارید.
برای مثال 277 اینجا دویست و هفتاد و هفت نبود ، بلکه دو ، هفت ، هفت بود ...
یا حتی رقم توان ، اون هم عدد نبود ، کارکتر بود ...
هر دوی اینها باید تبدیل به عدد بشن بعد ...


متاسفانه یکم بی‌حوصلم ، وگرنه حتما برای تفریح هم که شده ، می‌نوشتم.


اگر باز راهنمایی نیاز بود ، در خدمتم.
آخرین ویرایش توسط PrinceOfPersia در سه‌شنبه 15 شهریور 1390, 1:00 am، در مجموع 1 بار ویرایش شده است.

PrinceOfPersia
كاربر عالي
كاربر عالي
پست: 905
تاریخ عضویت: دوشنبه 16 فروردین 1389, 11:53 am
محل اقامت: On the Earth ...

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط PrinceOfPersia » سه‌شنبه 15 شهریور 1390, 12:40 am

خوب ، شما خوش شانس بودید ، بعد از زدن پست قبلی ، حس رو پیدا کردم و این مسئله رو حل کردم.
این کدی که نوشتم همه حالت‌هایی رو که گفتم رو شامل میشه ، اکثر اشکال‌هاش رو گرفتم ، احتمالا باید توش حالت خاص پیش بیاد و اشتباه حساب کنه !

ویژگی ها :
عدد و متغیر رو به راحتی تشخیص میده ...
توان 0 رو چاپ نمیکنه ( هم صفر و هم متغیری که توانش صفر باشه چاپ نمیشه ! )
اگر ورودی به این شکل باشه x^2 ، یعنی ضریب رو ندیم ، به راحتی میفهمه که منظور همون ضریب 1 بوده و ....

همه حالات رو به نظرم توش فرض کردم .
// همون هایی که تو پست قبلی گفتم ! krn:

نمونه ورودی : خروجی : ورودی :

کد: انتخاب همه

3x^2+45z^7+2x^1+0+1+y
خروجی :

کد: انتخاب همه

Derivative: 6x^1+315z^6+2+0+0+1
اینم عکس :
تصویر


نکته ، کد زیر چند تا تابع داره :
1- string_to_integer :
یه رشته رو تبدیل به عدد می کنه !
2- search_string :
یه کارکتر رو داخل یه رشته جستجو می کنه !

___________________
3- خط به خطش رو خودم نوشتم ...
4- امیدوارم به کارتون بیاد ...
5- سوالی داشتید ، بپرسید که توضیح بدم.


اینم کد :
برای کامپایلر Mingw :
http://s2.picofile.com/file/7132078488/main.cpp.html

برای Turbo C : ( تست نکردم ، دستی از Mingw به Turbo تبدیل کردم !!! )
http://s2.picofile.com/file/7132081391/main2.cpp.html

این هم کل کد ( Mingw ) :

کد: انتخاب همه

/*
# Author   : Ali Bahrami Nezhad
# EMail    : ali.bhz[at]gmail.com
# Created  : 1390/06/14 , 8:30 P.M
# Updated  : 1390/06/15 , 00:34 A.M
# Compiler : Mingw
# IDE      : CodeBlocks
# Language : C/C++
*/

#include <iostream>

using namespace std;


int string_to_integer(char * str , int start=0,int end=100000)
{
    str = str + start;
    int number = 0;

    while(*str <='9' && *str >= '0' && start <= end)
    {
        number = number * 10;
        number = number + (*str - '0');
        str++;
    }

    return number;
}

int string_search(char needle,char*str,int start=0,int end=100000)
{
    int not_found = 1;

    while(*(str + start) != '\0' && start <= end)
    {
        if(*(str + start) == '^')
        {
           not_found = 0;
           break;
        }
        start++;
    }

    if (not_found == 1)
        return 0;
    return start;
}

int main()
{
    char equlation[100];

    cout << "Enter your liner equalation:\r\n";

    // get a liner equaltion from user keyboard
    cin >> equlation;

    cout << endl << "Derivative: ";

    char*eq = equlation;

    int index = 0;
    int last_index = 0;
    int found = 0;
    char sign = '\0';
    while(*(eq + index) != '\0')
    {
        if(*(eq + index) == '+' || *(eq + index) == '-'  || *(eq+index+1) == '\0' || *(eq+index) == '\0')
        {
            found = 1;

            sign = '\0';
            if(*(eq+index+1) != '\0')
                sign = *(eq+index);
        }else
            index++;


        if (found == 1)
        {
            // we have found a part ...
            // let's look for a ^ sign
            // Does it have that !?
            int pos = string_search('^',eq,last_index,index);
            if(pos == 0) // No !
            {
                // Checks if it's a number or a char ...
                if(*(eq + last_index) >= '0' && *(eq + last_index) <= '9')
                    cout << "0"; // it was a number ...
                else
                    cout << "1"; // it was a variable
                index++;

            }else{ // Yes :(

                // Horray ... there is a "^" there ...
                // Let's convert those strings to numbers ...
                int number = string_to_integer(eq,last_index,index);

                if (number == 0 && !(*(eq+last_index)  == '0'))
                    number = 1;

                int power = string_to_integer(eq,pos+1,index);

                // print the Derivative
                cout << number * power;



                // print the variable And Power
                if (((power-1) != 0) && pos !=0)
                {
                    // print the variable
                    cout << *(eq+pos-1);

                    // print the power
                    cout << "^";
                    cout << power-1;
                }
                index++;
            }
            // print the sign
            cout << sign;
            sign = '\0';

            last_index = index;
            found = 0;
        }

        //index++;
    }

    return 0;
}

sanan esmaili
پست: 5
تاریخ عضویت: پنج‌شنبه 10 شهریور 1390, 10:43 am

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط sanan esmaili » سه‌شنبه 15 شهریور 1390, 12:29 pm

سلام دستتون درد نکنه. خیلی جالب حلش کردید . اما خودم هم با یک روش دیگه حلش کردم بدون استفاده از حلقه ها . فقط مشکلی که داره یه کم طولانیه . حدودا" 300 خط برنامه شده.
اما در هر حال بازم ممنون rgs

PrinceOfPersia
كاربر عالي
كاربر عالي
پست: 905
تاریخ عضویت: دوشنبه 16 فروردین 1389, 11:53 am
محل اقامت: On the Earth ...

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط PrinceOfPersia » سه‌شنبه 15 شهریور 1390, 7:43 pm

sanan esmaili نوشته شده:سلام دستتون درد نکنه. خیلی جالب حلش کردید . اما خودم هم با یک روش دیگه حلش کردم بدون استفاده از حلقه ها . فقط مشکلی که داره یه کم طولانیه . حدودا" 300 خط برنامه شده.
اما در هر حال بازم ممنون rgs
سلام،
ممنون.
جالب که نیست ، دقیقا همون چیزی رو که توضیح دادم پیاده کردم.

خوب ببینید ، ویژگی که این کد من داره ، اینه که کل یه معادله رو می‌گیره ، در آخر همه رو حساب می‌کنه.

300 خط یعنی زیاده!؟ looc
کجاش زیاده ...


راستی خوشحال می‌شدم روش شما رو هم می‌دیدم.

//----------------

آواتار کاربر
hiva-r
کاربر ساده
کاربر ساده
پست: 33
تاریخ عضویت: جمعه 18 شهریور 1390, 9:55 pm

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط hiva-r » سه‌شنبه 22 شهریور 1390, 10:51 am

PrinceOfPersia نوشته شده:
sanan esmaili نوشته شده:سلام دستتون درد نکنه. خیلی جالب حلش کردید . اما خودم هم با یک روش دیگه حلش کردم بدون استفاده از حلقه ها . فقط مشکلی که داره یه کم طولانیه . حدودا" 300 خط برنامه شده.
اما در هر حال بازم ممنون rgs
سلام،
ممنون.
جالب که نیست ، دقیقا همون چیزی رو که توضیح دادم پیاده کردم.

خوب ببینید ، ویژگی که این کد من داره ، اینه که کل یه معادله رو می‌گیره ، در آخر همه رو حساب می‌کنه.

300 خط یعنی زیاده!؟ looc
کجاش زیاده ...


راستی خوشحال می‌شدم روش شما رو هم می‌دیدم.

//----------------
goli آفرين اين وسط منم با كد شما 2نمره گرفتم.
حلال كنيد goli goli
هرگز به رنج فردا نيانديش رنج هر روز براي آن روز كافيست...

sanan esmaili
پست: 5
تاریخ عضویت: پنج‌شنبه 10 شهریور 1390, 10:43 am

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط sanan esmaili » چهارشنبه 23 شهریور 1390, 9:37 pm

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

danesh

PrinceOfPersia
كاربر عالي
كاربر عالي
پست: 905
تاریخ عضویت: دوشنبه 16 فروردین 1389, 11:53 am
محل اقامت: On the Earth ...

Re: یک سوال خیلی خیلی مهم>>>>

پست توسط PrinceOfPersia » چهارشنبه 23 شهریور 1390, 9:41 pm

آفرين اين وسط منم با كد شما 2نمره گرفتم.
مبارک باشه !!!

قفل شده