اطلاعیه

Collapse
No announcement yet.

استفاده از c++ درپروژه ها!!!

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    استفاده از c++ درپروژه ها!!!

    سلام به همه. :bye
    کامپایلر های جدید که برای میکرو ها اومدن اکثرا 30++ رو هم ساپورت میکنند و خیلی جا ها بهتره که از 30++ به جای 30 استفاده کنیم تا بتونیم از امکانات بیشتر اون استفاده کنیم.
    جدا از اون بحث کلاس ها و شی گرایی و .... یه سری امکانات دیگه مثل STL (standard template library) و رشته ها و..... هست که بسیار کار آمد هم هست. خودم استارت اولین آموزش رو میزنم و از رشته ها شروع میکنم. دوستان اگه نظری داشتند و یا من اشتباهی کردم لطفا بهم بگن. اگه خدا کمک کنه و استقبال هم خوب باشه وکتور و لیست و... رو هم میاریم وسط و نحوه کارش رو میگیم:
    خوب اصل مطلب:
    توی حالت عادی برای ایجاد رشته از یه آرایه استفاده میکنیم که مشکلات خودشون مثل داشتن سایز ثابت(حالت استاتیک),سخت بودن اضافه کردن به وسط آرایه,نبود جستجو و..... همه اینها رو میشه یه جورایی مشکلش رو حل کرد اما هم سخته و هم به بهینه بودن string نمیرسه.
    برای اینکه بتونید از string استفاده کنید باید کتابخونه اون رو با دستور
    #include <string>
    به اول برنامه اضافه کنید.بعد از اون باید به برنامه بگید که از std هم میخواید استفاده کنید.برای این منظور این خط رو هم اضافه میکنیم: using namespace:std;
    از اینجا به بعد میتونید از string به صورت یه متغیر هرجای برنامه تعریف کنید.
    string test1;
    strang test2="ECA";

    خوب حالا که تعریف کردیم چه طور باید استفاده کنیم؟ لیست تابع ها رو میذارم. بعد تک تک توضیح میدمشون:
    کد:
    string::append
    string::assign
    string::at
    string::begin
    string::capacity
    string::clear
    string::compare
    string::copy
    string::c_str
    string::data
    string::empty
    string::end
    string::erase
    string::find
    string::find_first_not_of
    string::find_first_of
    string::find_last_not_of
    string::find_last_of
    string::get_allocator
    string::insert
    string::length
    string::max_size
    string::operator+=
    string::operator=
    string::operator[]
    string::push_back
    string::rbegin
    string::rend
    string::replace
    string::reserve
    string::resize
    string::rfind
    string::size
    string::substr
    string::swap
    [hr]
    assign
    این تابع برای مقدار دادن به رشته استفاده میشه.برای واضح بودن کار 2تا رشته تعریف میکنم و با اونا کار میکنم.
    string str;
    string base="The quick brown fox jumps over a lazy dog.";


    این تابع چند ریختی هست و به صورت های مختلف استفاده میشه:
    اگه بخوایم مقدار بیس رو مستقیم تو str بریزیم:
    str.assign(base);


    اگر بخوایم قسمتی از یه رشته رو تو یه رشته دیگه بریزیم:
    str.assign(base,10,9);

    این تابع از کاراکتر 10 ام رشته بیس تا 9 تا اون طرف ترش رو تو رشته str میریزه. که مقدارش میشه"brown fox"



    str.assign("pangrams are cool",7)

    این تابع هم 7تای اول رشته ای که داخلش هست رو ذخیره میکنه. که مقدارش میشه"pangram"

    str.assign("ECA..."

    این تابع هم که دیگه بحثی توش نیست.

    str.assign(10,'*'

    این تابع به تعداد آرگومان اولش,آرگومان دوم رو کپی میکنه که حاصل 10 تا ستاره هست..

    str.assign<int>(10,0x2D);

    این تابع دقیقا مثل تابع قبل هست ولی به جای کاراکتر کد اسکی رو میگیره که در اینجا 2D میشه- پس نتیجه میشه:----------

    str.assign(base.begin()+16,base.end()-12);

    در مورد begin و end مفصل حرف میزنیم.اما خلاصه اون میشه اینکه 16 تای اول رشته بیس رو رد میکنه بعد شروع میکنه به نوشتن تو رشته مقصد تا برسه به 12 تا کاراکتر آخر که اونا رو هم بیخیال میشه! حاصل میشه:"fox jumps over"

    خوب فعلا خسته شدم. بقیه رو کم کم میگم تا رشته ها رو به یه جایی برسونیم. دقت کنید تا اینجا فقط یه تابع رو برسی کردیم و چیز زیادی نبود. از ظاهر چند ریختی اون نترسید.یکم کار کنید میبینید خیلی منعطف هست.
    ادامه دارد.......
    1,142
    مفید است.
    0%
    413
    نیازی نیست.
    0%
    298
    کاربردی نیست.
    0%
    166
    نظری ندارم.
    0%
    143
    نظر خاصی دارم و در پایین توضیح دادم.
    0%
    122
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    #2
    پاسخ : استفاده از c++ درپروژه ها!!!

    تابع بعدی که میخوایم در موردش صحبت کنم تابع append هست.
    این تابع برای اضافه کردن یه رشته به انتهای رشته ی جاری هست. فرقی که با تابع قبلی داره اینه که تابع assign مقدار جدیدی به رشته میده اما این مقداری به انتهای رشته اضافه میکنه!
    باز مثل قبل چند تا رشته تعریف میکنیم تا نحوه عملکرد این تابع رو روی این ها ببینیم:
    string str;
    string str2="Writing ";
    string str3="print 10 and then 5 more";


    خوب شرح تابع:
    str.append(str2);

    رشته str2 رو به انتهای رشته ی str اضافه میکنه اما چون این رشته از قبل خالی بوده پس همون اولش میره. یعنی اینجا مثل تابع قبل عمل کرد! محتوای strمیشه: "Writing "

    str.append(str3,6,3);

    تو این حالت از کاراکتر 6ام رشته سوم, تا 3 تا بعدش رو به رشته ما اضافه میکنه.چیزی که اضافه میکنه میشه:"10 "
    الان رشته ما یه چیزی رو از قبل داشت یه چیزی هم که اضافه کردم پس شد:"Writing 10 "

    str.append("dots are cool",5);

    تو این حالت 5 تای اول رشته ای که وارد کردیم رو اضافه میکنه.مقدار قبل هم که یادتون هست. چیزی که اضافه میشه به انتهای رشته str میشه: "dots "

    str.append("here: "

    این تابع هم که مثل بچه آدم رشته ای که توش گزاشتیم رو به ته رشته مقصد اضافه میکنه. چیزی که اضافه میکنه میشه: "here: "

    str.append(10,'.'

    این حالت هم به تعداد آرگومان اول از آرگومان دوم رو به ته رشته اضافه میکنه که در اینجا 10 تا نقطه هست!

    str.append<int>(5,0x2E);

    این تابع هم مثل تابع قبل هست ولی به جای کاراکتر کد اسکی میگیره. در اینجا چیزی که اضافه میشه5 تا . هست"....."

    str.append(str3.begin()+8,str3.end());

    begin و end رو در موردشون صحبت میکنیم. در اینجا عملکردشون میشه که از کاراکتر 8ام رشته str3 شروع به اضافه کردن کن تا 3 تای آخر. چیزی که اضافه میشه : " and then 5 more"

    دیدید چه قدر شبیه به تابع قبلی بود؟! اگر یکی از این ها رو هم متوجه بشید بقیه رو هم متوجه میشید چون همش یه مورد تکراری هست.
    ادامه دارد.......
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    دیدگاه


      #3
      پاسخ : استفاده از c++ درپروژه ها!!!

      خوب اون 2 تا تابع که حالت های زیادی داشتن رو گفتیم.از اینجا به بعد کار ساده تر میشه و تابع های چند ریختی کمتر.البته چند تا تابع چند ریختی دیگه هم هست اما حالت هاشون مثل 2 تای اول هست و فعلا اون ها رو نمیگیم.
      تو آرایه ها خیلی ساده میشد فهمید که مثلا 5امین کاراکتر رشته چی هست تو اینجا هم تابع at کمک ما میاد:
      string str;


      برای دسترسی به مثلا 5امین کاراکتر رشته مینویسیم
      c=str.at(5);

      اگه دوست دارید به روش قدیمی هم کار کنید بازم میشه
      c=str[5];


      در کل 2تا دستور بالا یه معنی میدن و معادل هم هستند.
      [hr]
      PS:
      در 2 تا تابع اول که توضیح دادم مقدار خروجی تابع *this هست.

      ادامه دارد......
      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

      دیدگاه


        #4
        پاسخ : استفاده از c++ درپروژه ها!!!

        خدا ثواب بده شاهین جان oo:
        جانم به فدای ائمه اطهار
        می دونستم تحمل مرگ اعضای خانواده خیلی سخته ولی نه تا این حد،ایکاش پدرم بیشتر می موند.روحش شاد.

        دیدگاه


          #5
          پاسخ : استفاده از c++ درپروژه ها!!!

          تابع clear
          یه موقع لازم هست که محتوای یه رشته رو کامل پاک کنیم. در این شرایط از این دستور استفاده میکنیم:
          string str="testing...";

          str.clear();

          با اجرای این دستور رشته تبدیل به یه رشته خالی میشه و سایز اون 0 میشه.(منابع اشغال شده آزاد میشه)
          خروجی این تابع هم void هست.
          [hr]
          تابع بعد empty هست.
          این تابع چک میکنه آیا رشته خالی هست یا نه.
          if(str.empty())

          خروجی این تابع true هست اگه رشته سایزش 0 باشه(خالی باشه) و false هست اگر مقداری داشته باشه.
          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

          دیدگاه


            #6
            پاسخ : استفاده از c++ درپروژه ها!!!

            تابع length
            تابع size
            این 2 تا تابع هردو یه مقدار رو به ما برمیگردونند و اون تعداد کاراکتر هایی هست که توی رشته هست. مثلا اگه رشته ما "ECA..." باشه,بعد از صدا زدن این تابع مقدار 6 رو به ما بر میگردونه.
            i=str.length();
            i=str.size();

            مقدار برگشتی این دو تابع size_t هست که یه متغیر بدون علامت صحیح هست که مقدار رو بر میگردونه.
            [hr]
            تابع max_size
            i=str.max_size();

            این تابع حداکثر مقداری که شما میتونید داخل این رشته بزارید رو برمیگردونه که فکر میکنم وابسته به مقدار رم خالی سیستم باشه.اگر بخواید بیش از این حد چیزی رو ذخیره کنید fail میشه.
            مقدار برگشتی این تابع size_t هست که یه متغیر بدون علامت صحیح هست که مقدار رو بر میگردونه.
            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

            دیدگاه


              #7
              پاسخ : استفاده از c++ درپروژه ها!!!

              از این روش میشه در کد ویژن استفاده کرد؟

              دیدگاه


                #8
                پاسخ : استفاده از c++ درپروژه ها!!!

                شاهین جان 100% مفیده که اینهمه تشکر جمع کردی دیگه :angry: ^^
                جانم به فدای ائمه اطهار
                می دونستم تحمل مرگ اعضای خانواده خیلی سخته ولی نه تا این حد،ایکاش پدرم بیشتر می موند.روحش شاد.

                دیدگاه


                  #9
                  پاسخ : استفاده از c++ درپروژه ها!!!

                  نوشته اصلی توسط علی علی پور ریکنده
                  از این روش میشه در کد ویژن استفاده کرد؟
                  نه علی جان. کدویژن از سی فقط استفاده میکنه.اینارو تو کیل تست کردم. تو IAR هم که c++ رو ساپورت میکنه باید بشه.
                  نوشته اصلی توسط ahmadpashaei
                  شاهین جان 100% مفیده که اینهمه تشکر جمع کردی دیگه :angry: ^^
                  مرسی از شما و بقیه دوستان که حمایت میکنید.الان حالم زیاد خوب نیست(یه تصادفی داشتم). به امید خدا از فردا ادامه میدیم.....
                  [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                  دیدگاه


                    #10
                    پاسخ : استفاده از c++ درپروژه ها!!!

                    نوشته اصلی توسط shahinbahari
                    مرسی از شما و بقیه دوستان که حمایت میکنید.الان حالم زیاد خوب نیست(یه تصادفی داشتم). به امید خدا از فردا ادامه میدیم.....
                    eeeee
                    جدی؟!!! ایشالا که به خیر گذشت -O<
                    جانم به فدای ائمه اطهار
                    می دونستم تحمل مرگ اعضای خانواده خیلی سخته ولی نه تا این حد،ایکاش پدرم بیشتر می موند.روحش شاد.

                    دیدگاه


                      #11
                      پاسخ : استفاده از c++ درپروژه ها!!!

                      تابع capacity
                      این تابع مقدار حافظه اشغال شده توسط رشته رو برمیگردونه.بر اساس الگوریتمی که برای مدیریت حافظه برای این ها نوشته شده مقدار بیشتر از حافظه رو اشغال میکنه که این کار برای بالابردن سرعت و بازدهی کار هست.
                      فکر میکنم مقدار حافظه ای که اشغال میکنه مانند وکتور ها باشه یعنی به این صورت:
                      در موقع تعریف 0بایت اشغال میشه. با اضافه شدن 1 کاراکتر 2 بایت از حافظه اشغال میشه.حالا اگه 1 بایت دیگه اضافه کنید چون 1 فضای خالی هست فضایی از رم اشغال نمیشه. با اضافه شدن سومین کاراکتر 4 بایت از رم اشغال میشه. با اضافه شدن 5امین کاراکتر 8 بایت.با اضافه شدن 9امین بایت16 کاراکتر و........
                      string str;
                      str.capacity();

                      مقدار برگشتی این دو تابع size_t هست که یه متغیر بدون علامت صحیح هست که مقدار رو بر میگردونه.
                      این تابع موقعی که بخواید مدیریت حافظه رو انجام بدید کاربرد داره و در حالت عادی کاربرد خاص تری نداره!
                      [hr]
                      نوشته اصلی توسط ahmadpashaei
                      eeeee
                      جدی؟!!! ایشالا که به خیر گذشت -O<
                      آره خدا رو شکر به خیر گذشت اما ماشین....
                      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                      دیدگاه


                        #12
                        پاسخ : استفاده از c++ درپروژه ها!!!

                        تابع resize
                        این تابع سایز رشته رو زیاد میکنه و اونو با یه کاراکتر خاص پر میکنه.مثلا شما اسم رو از کاربر دریافت میکنید و میخواید روی صفحه اونو نشون بدید.برای اینکه نظم چیدن روی صفحه حفظ بشه نیاز دارید تا طول رشته رو به یه مقدار خاص برسونید.با استفاده از این تابع هر تعداد که نیاز هست از یه کاراکتر خاص(مثلا A , * ,space,...) به انتهای رشته اضافه میکنید
                        مثلا در اینجا ما میخوایم که طول رشته 10 تا باشه و هر قدر که کم هست رو با '.'پر کنه.
                        string str="ECA";
                        str.resize((10-str.size()),'.'

                        یا مثلا 3 تا نقطه به ته این رشته اضافه کنیم.
                        string str="Hello";
                        str.resize(3,'.'

                        این تابع خروجی نداره.(اگه از ماکزیمم سایزی که رشته میتونه داشته باشه حجمش بیشتر بشه length_error داده میشه که تو قسمت exception باید برسی بشه)
                        [hr]
                        تابع reserve
                        این تابع باعث زیاد شدن حجم اشغال شده توسط رشته میشه.تابع capacity رو یادتون هست دیگه!؟ تو حالت عادی مینیمم حافظه که نیاز هست اشغال میشه ولی با این تابع میشه حجم اون رو زیاد کرد. این کار موقعی که میخوایم حتما مقدار خاصی از رم به یه رشته اختصاص پیدا کنه مفید میشه. مثلا شما مطمئن هستید که 100 بایت برای یه رشته نیاز هست.پس با این تابع از اول همین قدر حافظه رو درگیر میکنیم.در حالت عادی با زیاد شدن حجم رشته باید دوباره روی رم جایگذاری رو انجام بده که در مقایسه با حالتی که از اول اون سایز اشغال شده بازدهی کمتری داره.
                        string str="test...";
                        size_t ds;
                        ds=100
                        str.reserve(ds);

                        یا
                        string str="test...";
                        str.reserve(100);

                        این تابع خروجی نداره.(اگه از ماکزیمم سایزی که رشته میتونه داشته باشه حجمش بیشتر بشه length_error داده میشه که تو قسمت exception باید برسی بشه)
                        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                        دیدگاه


                          #13
                          پاسخ : استفاده از c++ درپروژه ها!!!

                          تابع erase
                          یه موقع نیاز هست که از وسط یا هر جای یه رشته مقداری از اونو پاک کنیم.تو این شرایط تابع erase به دردمون میخوره. نکته مهمی که هست خود تابع بعد از پاک کردن بقیه رشته رو میاره دنباله جایی که پاک شده و گپی به وجود نمیاد.مثلا یه رشته داریم که 10 تا کاراکتر توش هست. کاراکتر های 5و6 رو از وسط این رشته پاک میکنیم.خود این تابع خودش کاراکتر 7 رو به جای 5 , 8 رو به جای 6 ,9 به جای 7 و 10 به جای 8 میاره. بعد از اجرای تابع سایز رشته میشه 8
                          این تابع 3 شکل مختلف داره.یه رشته برای آزمایش تعریف میکنیم:
                          string str ("This is an example phrase."


                          str.erase (10,8);

                          تو این حالت از 10امین کاراکتر تا 8 تا بعد از اون پاک میشه.حاصل بعد از اجرای این تابع "This is an phrase."

                          str.erase (str.begin()+9;

                          تو این حالت کاراکتری که بهش اشاره میشه رو فقط پاک میکنه(فقط یه کاراکتر)جنس آرگومان ورودی این تابع iterator هست نه عدد. موقعی که در مورد begin , end صحبت کردیم بیشتر با iterator آشنا میشیم.مقدار رشته بعد از اجرای 2 تابع بالا "This is a phrase."

                          str.erase (str.begin()+5, str.end()-7);

                          تو این حالت هم از آرگومان اول تا آرگومان دوم پاک میشه.جنس آرگومان های این حالت هم مثل حالت قبل iterator هست.الان تا این حد با iterator آشنا میشیم که کارشون مثل اشاره گر ها تو آرایه هاست. بعد از اجرای این 3 تابع محتوای رشته میشه:"This phrase."

                          مقدار خروجی این تابع *this است. (اگر جایی که میخوایم پاک کنیم وجود نداشته باشه تابع end اجرا میشه و مقدار اون که یه iterator هست بازگشت داده میشه.به عبارت دیگه اشاره به آخرین خونه رشته میکنه.)
                          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                          دیدگاه


                            #14
                            پاسخ : استفاده از c++ درپروژه ها!!!

                            عملگر +
                            زمانی که میخواید 2 تا رشته رو به هم اضافه کنید استفاده میشه و استفاده از اون خیلی ساده هست.به مثال زیر توجه کنید.همه چیز واضح هست.

                            string name ("shahin"
                            string family ("bahari"
                            name+=' ';
                            name+=family;

                            رشته ما تو این حالت shahin bahari هست.ابتدا یه فاصله به رشته اضافه کردیم و بعد رشته فامیلی رو اضافه کردیم.


                            عملگر =
                            استفاده از این عملگر هم خیلی ساده هست. بعد از تعریف رشته هر کجا که خواستیم با = به رشته مقدار میدیم
                            string str;
                            str="salam";

                            اگر میخواستیم در لحظه ای که رشته رو تعریف کردیم مقدار بدیم باید از پرانتز استفاده میکردیم.
                            string str ("salam"


                            تا اینجا که گفتم کسی سوالی نداشته؟ یعنی اینقدر خوب گفتم که ابهامی نمونده؟ oo:
                            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                            دیدگاه


                              #15
                              پاسخ : استفاده از c++ درپروژه ها!!!

                              تابع push_back
                              توی دستورات اسمبلی دستورات push و pop رو یادتون هست؟ این دو دستور برای اضافه کردن و یا کم کردن از استک استفاده میشدند. مفهوم این ها به 30++ هم رسیده و ما از دستور push_back برای اضافه کردن یه عضو(که در اینجا کاراکتر هست) به انتهای نگه دارنده (که اینجا رشته هست) استفاده میشه.موقع استفاده از وکتور و استک و ... بیشتر قدرت این تابع رو میبینیم.

                              string str='E';
                              str.push_back('C'
                              str.push_back('A'

                              که در اینجا حروف رو دونه به دونه به رشته اضافه کردیم.
                              مقدار بازگشتی*this هست.
                              [hr]
                              در آموزش قبل فراموش کردم این نکته رو اضافه کنم که عملگر = در زمان تعریف هم قابل استفاده هست!!
                              [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                              دیدگاه

                              لطفا صبر کنید...
                              X