سلام دوستان . راستش یک حلقه میخوام بنویسم که مثلا از aaaaaa تا zzzzzz تمام حالات ممکن رو برام چاپ کنه . کسی فکری به ذهنش میرسه ؟
یک روشی که به ذهن خودم رسید این بود که اول حروف الفبا رو داخل یک آرایه تعریف کنم بعد داخل آرایه حرکت کنم . البته باز نوشتن این حلقه رو بلد نیستم . کسی از دوستان اگر اطلاعاتی داره ممنون میشم یک مددی برسونه .
در پناه حق
ببخشید، من بیسوادم و php بلد نیستم. با ++C و Visual Basic و #C پیاده سازی کردم.
صرفا نیاز به یک حلقه while و یک حلقه داخلی for دارید. یک حلقه اولیه for هم برای مقدار دهی اولیه رشته
مورد نیاز است. این الگوریتم برای رشته های 100 رقمی هم بدون جواب می دهد.
کد به زبان ++C :
کد:
#include <stdio.h>
#include <conio.h>
void main()
{
int i, n = 6;
char *s = new char[n + 1];
for (i = 0; i < n; i++)
s[i] = 'a';
s[i] = 0;
do
{
puts (s);
for (i = 0; i < n; i++)
{
s[i]++;
if (s[i] <= 'z')
break;
s[i] = 'a';
}
} while (i < n);
delete[] s;
}
شرح کد ++C :
ابتدا با متغیر n طول رشته را مشخص می کنیم، متغیر i برای حلقه کاربرد خواهد داشت :
یک رشته string به طول لازم ایجاد می کنیم (n + 1 چون انتهای رشته های ++C نیاز به یک کاراکتر 0 (null) دارد).
کد:
char *s = new char[n + 1];
یک حلقه می سازیم که تمامی کاراکتر های رشته (به طول n) را برابر a قرار دهد، مثلا aaaaaa :
کد:
for (i = 0; i < n; i++)
s[i] = 'a';
انتهای رشته را با کاراکتر 0 (null) مشخص می کنیم، برای چاپ رشته ها در ++C این عمل مورد نیاز است :
حلقه do ای می سازیم که اول رشته را چاپ می کند :
حلقه ای می سازیم که رشته را از کاراکتر اول تا آخر پیمایش کند (فرض کردم که تغییر کاراکتر ها از چپ به راست انجام شود) :
کد:
for (i = 0; i < n; i++)
{
کاراکتر اندیس i را یک واحد افزایش می دهیم، مثلا کاراکتر f تبدیل به g می شود :
اگر کاراکتر مورد نظر z یا کوچکتر از آن باشد، رشته آماده است، پس از حلقه با break خارج می شویم :
وگرنه کاراکتری که از z گذشته را به a برمی گردانیم و حلقه برای تغییر کاراکتر بعدی ادامه می یابد :
حلقه while تا زمانی ادامه پیدا می کند که آخرین کاراکتر رشته هم تمامی حالاتش را پیمایش نکرده باشد :
کار تمام شده، پس رشته s را از حافظه حذف می کنیم (رشته با new ایجاد شده، پس با delete حذف می شود) :
به زبان ویژوال بیسیک :
کد:
Private Sub Form_Load()
Dim i As Long, n As Long
Dim s() As Byte
n = 6
s = StrConv(String(n, "a"), vbFromUnicode)
Do
Debug.Print StrConv(s, vbUnicode)
For i = 0 To n - 1
s(i) = s(i) + 1
If s(i) <= Asc("z") Then Exit For
s(i) = Asc("a")
Next
Loop While i < n
End Sub
به زبان #C :
کد:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int i, n = 6;
char[] s = new char[n + 1];
for (i = 0; i < n; i++)
s[i] = 'a';
s[i] = '\0';
do
{
Console.WriteLine(s);
for (i = 0; i < n; i++)
{
s[i]++;
if (s[i] <= 'z')
break;
s[i] = 'a';
}
} while (i < n);
}
}
}