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

z.ghayoumi

New Member
به نام پروردگار
با سلام .

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

برنامه ای -به زبان سی یا سی ++ -که 15 عدد رو ازورودی دریافت کند واون اعداد روصعودی به نزولی-بزرگ به کوچک - مرتب کنه .

* مساله مهم برنامه اینه که می بایست بدون استفاده از آرایه ها نوشته بشه .*

فکر می کنم باید از یک چیز جدیدی برای نوشتن این برنامه استفاده کنیم .
نمی دونم چطور میشه این اعداد رو در حافظه کامپیوتر ذخیره کرد وبا هم مقایسه شون کرد. آیا میشه با استفاده از چندین "if"
در برنامه اعداد را از بزرگ به کوچک مرتب کرد.

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


z.ghayoumi with best whishes
 
آخرین ویرایش:

z.ghayoumi

New Member
یه چند نکته . . .؟

آهان ...یه چند نکته یادم رفت بگم :
1.خوب معلوم هست که نمی خواهم از فایل در برنامه استفاده بکنم .
2.خودم فکر می کنم با استفاده از " if " ،برنامه خیلی خیلی طولانی میشه ...شما نظرتون چیه ؟
3.نمی دونم ...دارم به این فکر می کنم که آیا میشه از استفاده تو در توی تابع max (ماکزیمم) ،کاری کرد !
 

saalek110

Well-Known Member
سلام. آیا اجازه دارید از تابع بازگشتی استفاده کنید.
اگر اجازه دارید فکر کنم بشه باهاش حل کرد. البته امتحان نکردم. ولی تابع بازگشتی و کلا هر تابعی وقتی درش متغیری بوجود می آید در استک ذخیره می شود.
ایده من اینه که تابع بازگشتی حاوی متغیری باشد که اولش با صفر مقدار دهی شده باشد و استاتیک باید باشه فکر کنم . بعد وقتی عددی بهش ارسال میشه نگاه می کنه ببینه که اون عدد از متغیر خودش بزرگتر است یا نه . اگر بزرگتر بود در متغیر خودش می ریزد و عدد خودش را به تابع بعدی(که مشخصه تابع بعدی باز خودشه در تابع بازگشتی) ارسال می کند. موقع بازگشت از تابع هم هر تابع عدد خود را چاپ می کند.
نقل از :
http://forum.persiantools.com/t32403-page19.html

ساده ترين تابع بازگشتي كه فكر كنم بشه نوشت اين باشه.

کد:
#include <iostream.h>
#include <conio.h>

[color=blue]void my_function(int a);[/color]

void main(void)
{
  clrscr();
	   [color=red] my_function(7); [/color] //ehzare tabeye_baz gashti
     getch();
}

[color=blue]void my_function(int a)  
{
		  cout<<"a="<<a<<endl;
	    a=a-1;
		 if (a>0)  my_function(a);
}[/color]

تابع بازگشتي ، تابعي است كه خود را صدا مي كند. طبيعي است كه بايستي شرطي بگذاريم كه تا ابد ، اين صدا كردن ادامه نداشته باشه.


a4.gif


یه تابع بازگشتی خوب چهار شرط داره

1. حتما خودش رو یه جایی فرخوانی کنه
2. یه شرط خاتمه یا حالت پایه ای داره که جوابش از قبل معلومه و لازم به فراخوانی مجدد تابع نیست
3. به تمام ورودی ها پاسخ بده
4.از نتایج بدست اومده در مراحل قبلی استفاده کنه و ماسبات قبلی رو تکرار نکنه

با تشكر از توضيحات كامل و خوب شما.
در برنامه زير چگونگي رفت و برگشت تابع بازگشتي را نشان داده ام.

کد:
#include <iostream.h>
#include <conio.h>

void my_function(int a);
void main(void)
{
  clrscr();
	    my_function(7);  //ehzare tabeye baz_gashti
     getch();
}

void my_function(int a)
{
	cout<<"a="<<a<<endl;
	    a=a-1;
		 if (a>0)  my_function(a);
	 cout<<"a+10="<<a+10<<endl;
}


a6.gif

 

arash_j13

Member
این 15 تا متغیر کجا ذخیره بشن؟
اگه منظورتون اینکه تو 15 متغییر جدا ذخیره بشن می شه از این روش استفاده کرد
کد:
#include<iostream>
#include<cstdlib>

void sort(int,...);

using namespace std;
int main()
{
	int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15;
	cin>>a1;
	cin>>a2;
	cin>>a3;
	cin>>a4;
	cin>>a5;
	cin>>a6;
	cin>>a7;
	cin>>a2;
	cin>>a8;
	cin>>a9;
	cin>>a10;
	cin>>a11;
	cin>>a12;
	cin>>a13;
	cin>>a14;
	cin>>a15;
	sort(15,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10,&a11,&a12,&a13,&a14,&a15);

	cout<<a1<<endl;
	cout<<a2<<endl;
	cout<<a3<<endl;
	cout<<a4<<endl;
	cout<<a5<<endl;
	cout<<a6<<endl;
	cout<<a7<<endl;
	cout<<a8<<endl;
	cout<<a9<<endl;
	cout<<a10<<endl;
	cout<<a11<<endl;
	cout<<a12<<endl;
	cout<<a13<<endl;
	cout<<a14<<endl;
	cout<<a15<<endl;

    system("pause");
	return EXIT_SUCCESS;
}

void sort(int count,...)
{
    int **p=reinterpret_cast<int**>(&count);
    ++p;
    bool b=true;
    for(int **j=p; b && j < p+count ;++j)
    {
        b=false;
        for(int **i=p ; i < p+count-1 ; ++i)
        {
            if(**i < **(i+1))
            {
                int tmp=**i;
                **i=**(i+1);
                **(i+1)=tmp;
                b=true;
            }
        }
    }
}

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

z.ghayoumi

New Member
با سلام

سالک جان ، از توضیحات کاملت واقعا ممنوم ،دارم می خونمش .
mahmma1d ، فکر می کنم لیست پیوندی مربوط به ساختمان داده ها باشه . . ! در هر صورت نه از لیست پیوندی
نباید بهره برد .

***arash_j13 ،میشه چند خط پایانی برنامه رو کمی توضیح بدهید . . . و اگر ممکنه این روش "مرتب سازی سریع" رو فقط کمی راهنمایی بفرمایید .

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

arash_j13

Member
تابع سورت رو به یا کلک کوچیک جوری نوشتم که بشه از پارامتراش مثل یه ارایه استفاده کرد امروز صبح امتان دارم بعدا کاملا در مورد توابع با تعداد پارمتر های نامعلوم توضیح می دم

در مورد مرتب سازی سریع هم یه روش مرتب سازی هست که زمان نسبتا خوبی داره O(n logn)
 

z.ghayoumi

New Member
به نام پروردگار

با سلام .
arash-j13 , ان شا الله امتحانتون رو بخوبی پشت سر بگذارید .
البته من هم عجله ندارم ، دوست دارم بیشتر و بیشتر یاد بگیرم .

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


با سپاس فراوان . . . . z.ghayoumi
 
آخرین ویرایش:

emad_67

Member
شما بفرمایید که مجاز به استفاده از اشاره گر هستید یا نه؟(منظورم آرایه های اشاره گره)
با اشاره گر میشه نوشت اگه مجاز باشید
 
آخرین ویرایش:

arash_j13

Member
برای کامپایل کردن اون کد احتیاج به یه کامپایلر سی++ دارید نه یه کامپایلر سی
 

z.ghayoumi

New Member
با سلام .

emad_67 ، نه از اشاره گر ها هم نباید بهره گرفت .

اما دوستان : من برنامه مورد نظر رو تا حدود زیادی نوشتم ،اما باز هم کار داره .
به نظر خودم جالبه ، برنامه فقط با یک for و چندین if نوشته می شه ، و البته بدون آرایه . !

اما من این هفته خیلی خیلی سرم شلوغه .
ولی حتما تا یه هفته، 10 روز دیگه برنامه رو می ذارم این جا .
کمی فرصت لازم دارم .

از همه شما دوستان هم بی نهایت ممنوم ، راهنمایی های شما خیلی خوب بود .
پس فعلا . . . . z.ghayoumi:)
 

babak43

New Member
تو رو خدا اگه پيدا كردي به منم بده . استادمون خواسته اين برنامه رو.
خيلي ممنون
 

جدیدترین ارسال ها

بالا