علی گنجی زاده

ali ganj zadeh

علی گنجی زاده

ali ganj zadeh

مشخصات بلاگ
علی گنجی زاده

Ali Ganji Zadeh
علی گنجی زاده

دراینجا برای شما سورس های که در دانشکده خوارزمی ملایر ارائه شده است میگوییم...

----------------------------------------------------------------------------------------------------------


For

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

 

فرمت کلی حلقه ی شرطی به صورت زیر می باشد:

for(مقدار اولیه شمارنده  ; شرط ادامه ; گام حلقه)
{
}

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

 

برنامه­ی زیر ده ستاره را در خروجی نمایش می­دهد:


main()
{
    for(int i = 1 ; i <= 10 ; i++)
    {
       cout << "*";
    }
    getch();
}


برنامه­ی زیر از یک تا صد را در خروجی نمایش می­دهد:


main()
{
    for(int i = 1 ; i <= 10 ; i++)
    {
       cout << i;
    }
    getch();
}

با دقت به این دو برنامه متوجه می­شویم که متغیر شمارنده تعداد دفعات اجرای حلقه را کنترل می­کند و لازمه­ی یک حلقه­ی شمارشی می­باشد. اما در برنامه­ی دوم از متغیر شمارنده بهره برده­ایم و با نمایش مقدار آن در واقع اعداد یک تا ده را نمایش داده­ایم. در واقع شماره­ی دورهای حلقه را چاپ کرده­ایم.

در ادامه به حل چند تمرین از حلقه­ی شمارشی می­پردازیم.

 

مثال 1: برنامه ای بنویسید که ده بار در صفحه عبارن Hello World را نمایش دهد: 


main()
{
    int i;
    for( i = 1 ; i <= 10 ; i++)
    {
        cout << "Hello World! \t";
    }
    getch();
}
خروجی : 


مثال 2: برنامه ای بنویسید که در صفحه خروجی اعداد یک تا 100 را نمایش دهد: 


main()
{
    int i;
    for( i = 1 ; i <= 100 ; i++)
    {
        cout << i << "\t";
    }
    getch();
}



مثال 3: برنامه ای بنویسید که در گرافیک، 20 دایره ی متحدالمرکز را با افزایش شعاع رسم کند: 


main()
{
    int x = 300,y = 300, r = 50;
    initwindow(600, 600);
    
    for(int i = 1 ; i <= 20 ; i++)
    {
        setcolor(i % 16);
        circle(x, y, r);
        r = r + 10;
    }
    
    getch();
}



لقه ی تو در تو تمرینهای پیچیده تر

ادامه ی تمرینها تا حدودی پیچیده تر است. اما لازم است آنها را به صورت کامل یاد بگیرید! 


7- برنامه ای بنویسید که شکل زیر را نمایش دهد: 

*********
 *******
   *****
    ***
      *
برای تحلیل این سوال باید توجه کنیم که 5 خط داریم و در خط صفرم، صفر فاصله و 9 ستاره، در خط یکم، یک فاصله و 7 ستاره، در خط دوم، دو فاصله و 5 ستاره، در خط سوم، سه فاصله و 3 ستاره و در خط چهارم ، چهار فاصله و یک ستاره داریم. 
پس واضح است که حلقه ی بیرونی که تعداد خطوط را نشان میدهد 5 بار تکرار میشود. اما حلقه های درونی( برای فاصله ها و ستاره ها) را چه جور تفسیر کنیم؟

حلقه ی درونی اول که برای رسم فاصله هاست، به تعداد i بار تکرار خواهد شد. ( کافی است به توضیحات بالا کمی توجه کنیم) 
حلقه ی درونی دوم که برای رسم ستاره هاست را می توان به صورت روبه رو با استفاده از یک متغیر کمکی نوشت. به این صورت که متغیر a اول 9 باشد و هر بار 2 تا از آن کم شده و در حلقه ی درونی دوم هر بار a تا ستاره رسم بشود. 
برنامه ی آن به صورت زیر خواهد بود: 
#include <conio.h>
#include <iostream.h>

int main()
{   int a=9;
    for(int i=0;i<5;i++)    //dar kol 5 khat darim
    {
        for(int j=0;j<i;j++)    //rasme fasele ha
        {
            cout<<' ';
        }
        
        for(int j=0;j<a;j++)    //rasme a ta setare
        {
            cout<<'*';
            
        }
        a=a-2;                  // az a 2 ta kam mikonim baraye khate badi
        cout<<endl;
    }
        getch();
        return 0;
}
۲۵ سوالموافقین ۲ مخالفین ۰۱۶ آذر ۹۱ ، ۱۸:۰۳
سارا نازاری

حلقه های تو در تو

 فرض کنید می خواهیم برنامه ای بنویسیم که یک کاراکتر * را در خروجی نمایش دهد. برای این کار به صورت زیر عمل میکنیم:

main()
{
    cout<<"*";
    cout<<endl;
    getch();
}

خب در این برنامه دستور cout تنها یک بار اجرا می شوند. حال فرض کنیم بخواهیم برنامه­ی بالا را به این صورت تغییر دهیم که یک عدد n را از ورودی گرفته و به تعداد آن یعنی n بار کاراکتر * را در خروجی پشت سر هم در یک خط نمایش دهیم.

برنامه بالا به صورت زیر تغییر خواهد یافت:

main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
       cout<<"*";
    }
    cout<<endl;
    getch();
}

تنها تفاوت این برنامه با برنامه ی قبلی در این است که کل کارهای برنامه ی اول را در یک حلقه قرار دادیم که این حلقه به تعداد n اجرا خواهد شد. پس از نمایش n کاراکتر * در خروجی، به ابتدای خط بعدی ( با استفاده از دستور cout<<endlمی رویم.

خب، حالا فرض کنید میخواهیم دو عدد n و m را از ورودی گرفته و این بار n ستاره را در یک خط نمایش داده و همان خط راm بار تکرار کنیم. یعنی می خواهیم m خط را که در هر خط n ستاره وجود دارد، رسم کنیم.

خب با توجه به برنامه ی قبلی به این نتیجه می رسیم که باید برنامه ی بالا( که کشیدن یک خط از n ستاره است) را mبار تکرار کنیم. تا m خط که هر خط متشکل از n ستاره است را رسم کنیم.

 

برنامه ی بالا به صورت زیر تغییر خواهد کرد:

 main()
{
    int n,m;
    cin>>n>>m;
    for(int j=1;j<=m;j++)
    {
        for(int i=1;i<=n;i++)
        {
           cout<<"*";
        }
        cout<<endl;
    }
    getch();
}

در واقع ما در این برنامه از حلقه ی تو در تو استفاده کرده ایم!

 

توجه کنید که همیشه حلقه ی تو در تو از دو حلقه ی for تشکیل نشده است و می توان به جای for از while  هم استفاده کرد!

 

main()
{
    int n,m,j=0;
    cin>>n>>m;
    while(j<m)
    {
        for(int i=1;i<=n;i++)
        {
           cout<<"*";
        }
        cout<<endl;
        j++;
    }
    getch();
}

در برنامه ی بالا حلقه ی بیرونی را از for به while تغییر داده ایم!

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

 

برای مثال چند نمونه از حلقه های تو در تو را با هم حل خواهیم کرد.

 

 برنامه ای با استفاده از حلقه ی تو در تو بنویسید که شکل زیر را نمایش بدهد:


برنامه به صورت زیر نوشته می شود:

main()
{
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cout<<'*';
        }
        cout<<endl;
    }
    getch();
}


برنامه ای بنویسید که شکل زیر را نمایش دهد:


برنامه به صورت زیر نوشته می شود:

main()
{
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=11-i;j++)
        {
            cout<<'*';
        }
        cout<<endl;
    }
    getch();
}


برنامه ای بنویسید که شکل زیر را نمایش دهد:






برنامه به صورت زیر نوشته می­شود:

main()
{
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=i-1;j++)
        {
            cout<<" ";
        }
        for(int j=1;j<=11-i;j++)
        {
           cout<<"*";
        }
        cout<<endl;
    }
    getch();
}
 

این برنامه را به صورت زیر هم میتوان نوشت( چرا؟)

main()
{
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=i-1;j++)
        {
            cout<<' ';
        }
        for(int j=i;j<=11;j++)
        {
            cout<<'*';
        }
        cout<<endl;
    }
    getch();
}

 

برنامه ای بنویسید که شکل زیر را نمایش دهد:


برنامه به صورت زیر نوشته خواهد شد:

main()
{
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=10-i;j++)
        {
            cout<<' ';
        }
        for(int j=1;j<=i;j++)
        {
            cout<<'*';
        }
        cout<<endl;
    }
    getch();
}

برنامه ی بالا را می توان به صورت زیر هم نوشت. ( چرا؟)

main()
{
    for(int i=1;i<=10;i++)
    {
        for(int j=i;j<=10;j++)
        {
            cout<<' ';
        }
        for(int j=1;j<=i;j++)
        {
            cout<<'*';
        }
        cout<<endl;
    }
    getch();
}

 برنامه ای بنویسید که شکل زیر را نمایش دهد:



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

برنامه ی آن به صورت زیر نوشته می شود:

main()
{
    for(int i=1;i<=19;i++)   
    {
        if(i<=10)    //rasme 10 khate aval
        {
            for(int j=1;j<=10-i;j++)
            {
                cout<<' ';
            }
            for(int j=1;j<=i;j++)
            {
                cout<<'*';
            }
        }
        else    //rasme 9 khate ba'di
        {
            for(int j=1;j<=i-10;j++)
            {
                cout<<' ';
            }
            for(int j=1;j<=20-i;j++)
            {
                cout<<'*';
            }
        }
        cout<<endl;
    }
    getch();
}

 برنامه ای بنویسید که شکل زیر را نمایش دهد:


جواب سوال به صورت زیر خواهد بود:

int main()
{
    for(int i=1;i<=19;i++)   
    {
        if(i<=10)        //rasme 10 khate aval
        {
            for(int j=1;j<=i;j++)
            {
                cout<<'*';
            }
        }
        else        //rasme 9 khate ba'di
        {
            for(int j=1;j<=20-i;j++)
            {
                cout<<'*';
            }
        }
        cout<<endl;
    }
    getch();
}

 

امتحان آبان ماه( دو بعدی و رشته ها)1-  فرض کنید در یک مســابقه ی ورزشی ده تیم مختـلف شرکت کرده باشند. پس از مسابقه میخواهیم بدانیم تـیم Nام ( 0<N<11)  در چه رتبه ای قرار گرفته است.

برای این کار شما برنامه­ای بنویسید که امتیازات را از ورودی گرفته و عدد N ( 0<N<11) را نیز از ورودی بگیرد و امتیاز تیمn را در خروجی چاپ کند. 


پاسخ 


#include <conio.h>
#include <iostream.h>

main()
{
    int n=10;
    int a[n];
    for(int i=0;i<9;i++)
        cin>>a[i];
        
    for(int i=1;i<n;i++)        
    {
        int j;
        int key=a[i];
        
        for(j=i-1;j>=0;j--)
        {
            if(key>a[j])
            {
                a[j+1]=a[j];
            }
            else
                break;
        }
        a[j+1]=key;
    }
    int f;
    cin>>f;
    cout<<a[f+1];
    getch();
    
}

تمرین رشته ها

مثال 8- برنامه ای بنویسید که یک رشته از ورودی بگیرد و چک کند که همه ی خانه های آن بین حروف a تا z کوچک باشند، اگر این شرط برقرار بود عبارت معتبر و  اگر این گونه نباشد عبارت نامعتبر را نمایش دهد: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    
    string a;
    cin>>a;
    int flag=1;
    int n=a.length();
    for(int i=0;i<n;i++) 
    {
        int asc=(int)a[i];
        if(asc>=97 && asc<=122)
            flag=0;
        else
        {   flag=1;
            break;
        }
    }
    if(flag==0)
        cout<<"Motabar";
    else
        cout<<"Namotabar";
    
    getch();
    return 0;
}

string یا رشته


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

برای این که عبارتی از کاراکترها را به صورت یکباره از ورودی بگیریم می توانیم از نوع دیگری استفاده کنیم که به رشته یا string معروف است. 

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


string name;

or

string name(10,'a');

در تعریف نوع اول طول string محدودیتی ندارد. اما در نوع دوم طول string  یا رشته را مشخصا 10 خانه تعریف کرده ایم و مقدار پیشفرض تمام خانه ها را کاراکتر A قرار داده ایم. 

در حالت دوم باز هم طول رشته می تواند بیشتر از 10 خانه بشود. 

برای پر کردن یک رشته می توانیم از فرمت زیر استفاده کنیم: 

string a;
cin>>a;

برای نمایش یک رشته می توانیم از فرمت زیر استفاده کنیم: 

string a;
cout<<a;
برای اندازه گیری طول رشته از دستور زیر استفاده میکنیم: 
int n=a.length();
توجه کنید برای استفاده از رشته در برنامه مان باید حتما تابع کتابخانه ای string را در بالای برنامه include کنیم، به صورت زیر: 
#include<string>

using namespace std;


برای آشنایی با رشته ها در ابتدا سعی می کنیم ابتدا با آنها مثل آرایه رفتار کنیم. یعنی برای پر کردن و یا نمایش آنها از حلقه استفاده کنیم. 


مثال 1- برنامه ای بنویسید که یک رشته را از ورودی گرفته و آن را پس از دریافت کامل نمایش دهد: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a(10,'a');
    for(int i=0;i<10;i++)
    {
        cin>>a[i];
    }
    for(int i=0;i<10;i++)
    {
        cout<<a[i];
    }
    getch();
    return 0;
}
برای برنامه ی بالا شرط کرده ایم که طول رشته 10 خانه باشد. 

مثال 2- برنامه ای بنویسید که یک رشته را از ورودی گرفته و آن را پس از دریافت کامل در یک رشته بریزد و رشته دوم را نمایش دهد: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a,b;
    cin>>a;
    int n=a.length();
    b=a;        //b ra barabar ba a gharar midahim ke tuleshan yeki beshavad!
for(int i=0;i<n;i++) { b[i]=a[i]; } cout<<b; getch(); return 0; }

مثال 3- برنامه ای بنویسید که یک رشته را از ورودی گرفته و آن را پس از دریافت کامل به صورت وارونه در خروجی نمایش دهد: 

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

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a,b;
    cin>>a;
    int n=a.length();
    b=a;        //b ra barabar ba a gharar midahim ke tuleshan yeki beshavad!
    for(int i=0;i<n;i++)
    {
        b[i]=a[n-i-1];
    }
    cout<<b;
    getch();
    return 0;
}
مثال 4- برنامه ای بنویسید که دو رشته را از ورودی گرفته و آنها را در رشته ی سومی به هم بچسباند و رشته ی سوم را نمایش دهد: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a,b;
    cin>>a>>b;
    int n=a.length();
    int m=b.length();
    string c(n+m,' ');     //tule s barabare majmue n+m ast. 
    for(int i=0;i<n;i++)
    {
        c[i]=a[i];
    }
    for(int i=n;i<n+m;i++)
    {
        c[i]=b[i-n];
    }
    cout<<c;
    getch();
    return 0;
}
این برنامه را به صورت ساده ی زیر نیز میتوان نوشت: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a,b;
    cin>>a>>b;
    string c=a+b;
    cout<<c;
    getch();
    return 0;
}

مثال 5- برنامه ای بنویسید که یک رشته ار از ورودی گرفته و از خانه ی 4 تا خانه ی 7ام آن را با کاراکتر * عوض کند: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a;
    cin>>a;
    for(int i=4;i<8;i++)
    {
        a[i]='*';
    }
    cout<<a;
    getch();
    return 0;
}
مثال 6- برنامه ای بنویسید که یک رشته را از ورودی گرفته و خانه های 4 تا 7 ام آن را با رشته ی 6893 پر کند: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a;
    cin>>a;
    string b="6893";
    for(int i=4;i<8;i++)
    {
        a[i]=b[i-4];
    }
    cout<<a;
    getch();
    return 0;
}
مثال 7- برنامه ای بنویسید که یک رشته را از ورودی گرفته و خانه های 4 تا 7 ام آن را واروونه کند و سپس آ ن را نمایش بدهد: 

#include <conio.h>
#include <iostream>
#include <string>

using namespace std;
int main()
{
    string a;
    cin>>a;
    string b;
    for(int i=7;i>3;i--)  //varune kardane a[4-7] dar b[0-3]
    {
        b[7-i]=a[i];
    }
    for(int i=4;i<8;i++)  //gharar dadane b be jaye a[4-7]
    {
        a[i]=b[i-4];
    }
    cout<<a;
    getch();
    return 0;
}

تمرین آرایه دوبعدی

مثال 5- برنامه ای بنویسید که mو n را از ورودی بگیرد و آرایه ای به طول و عرض n و m بسازد و آن را از ورودی گرفته، سپس عناصر سطرهای آرایه را در شماره سطر ضرب کند و دوباره آن را چاپ کند: 


#include <conio.h>
#include <iostream.h>

int main()
{
    int a[10][5],b[10][5];
    for(int i=0;i<10;i++)   //daryaft araye
    {
        for(int j=0;j<5;j++)
        {
            cin>>a[i][j];
        }
    }
     for(int i=0;i<10;i++)   //zarb dar i
    {
        for(int j=0;j<5;j++)
        {
            b[i][j]=i*a[i][j];
        }
    }
     for(int i=0;i<10;i++)   //chape araye varun
    {
        for(int j=0;j<5;j++)
        {
            cout<<b[i][j]<<"\t";
        }
        cout<<endl;
    }
    getch();
    return 0;
}