PDA

View Full Version : تکرار بینهایت مقادیر یک آرایه



mahdi_armed
سه شنبه 05 فروردین 1399, 19:14 عصر
سلام دوستان
من یک آرایه دارم به صورت زیر
string[] name = new string[]{"a","b","c","d","e"}

میخوام با استفاده از timer مقدایر این آرایه رو دونه دونه توی یک label چاپ کنه
و این موضوع بینهایت بار تکرار بشه

و خروجی به صورت زیر باشه
a b c d e a b c d e a b c d e a b c d e ...

یعنی به عبارتی هر ثانیه یکی از این حروف چاپ شه و تا بینهایت تکرار بشه

ASHKANLAEI
سه شنبه 05 فروردین 1399, 22:28 عصر
خب باید یک متغیر بسازید که از 0 تا 4 بره بعد دوباره 0 بشه.
بعد هم هر بار باید خونه ای که اون شماره رو داره از توی آرایه برداره بنویسه توی لیبل.
البته
فکر میکنم یه حدی بیشتر نشه وارد کرد.

mahdi_armed
چهارشنبه 06 فروردین 1399, 11:15 صبح
خب باید یک متغیر بسازید که از 0 تا 4 بره بعد دوباره 0 بشه.
بعد هم هر بار باید خونه ای که اون شماره رو داره از توی آرایه برداره بنویسه توی لیبل.
البته
فکر میکنم یه حدی بیشتر نشه وارد کرد.


خب من توی کد زدنش مشکل دارم

Salar Ashgi
جمعه 08 فروردین 1399, 11:35 صبح
سلام دوستان
من یک آرایه دارم به صورت زیر
string[] name = new string[]{"a","b","c","d","e"}

میخوام با استفاده از timer مقدایر این آرایه رو دونه دونه توی یک label چاپ کنه
و این موضوع بینهایت بار تکرار بشه

و خروجی به صورت زیر باشه
a b c d e a b c d e a b c d e a b c d e ...

یعنی به عبارتی هر ثانیه یکی از این حروف چاپ شه و تا بینهایت تکرار بشه

سلام. هدفتون از این کار چیه ؟ تا بی نهایت که نمیشه این کار رو تکرار کرد اونم توی Label.

taghvajou
جمعه 08 فروردین 1399, 16:09 عصر
سلام دوستان
من یک آرایه دارم به صورت زیر
string[] name = new string[]{"a","b","c","d","e"}

میخوام با استفاده از timer مقدایر این آرایه رو دونه دونه توی یک label چاپ کنه
و این موضوع بینهایت بار تکرار بشه

و خروجی به صورت زیر باشه
a b c d e a b c d e a b c d e a b c d e ...

یعنی به عبارتی هر ثانیه یکی از این حروف چاپ شه و تا بینهایت تکرار بشه

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

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

صورت مسئله: یه آرایه ای از اسامی داریم که میخوایم در هر ثانیه یکیش به متن لیبل اضافه بشه. چطور با استفاده از تایمر هر ثانیه متنی که نوبتشه رو انتخاب کنیم و پشت سر قبلی نمایش بدیم؟ (اگر درک بنده از سوال اشتباه بود، لطفا خودتون دقیقتر بپرسین)

فرض اول: البته شما گفتی تو یک لیبل چاپ بشه ، فعلا فرض میکنیم منظور شما اینه تو یه کنترل لیبل تو فرم نمایش داده بشه. (یه حالت هم اینه که روی لیبل کاغذی چاپ بشه)

و اما بعد:

ابتدا تو کلاس اصلی فرم یه نمونه ویندوز تایمر بسازین.
private Timer printerTimer = new Timer();
تو بخش اماده سازی فرم:
1- ویژگی وقفه رو هزار میلی ثانیه (یک ثانیه) مقدار دهی کنین
2- رویداد اتمام تایمر رو بسازین
3- تایمر رو استارت کنین

printerTimer.Tick += printerTimer_Tick;
printerTimer.Interval = 1000;
printerTimer.Start();




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

پس حالا بریم تو رویداد تیکش، دو تا کار باید بکنیم.
1- متن رو چاپ کنیم.
خب باید یه اندیس چندم اون آرایه رو هم نگه داریم که بعد از نمایش، ترتیب رو گم نکنیم. لذا تو کانستراکتور فرم یه اینت بذاریم :
private int toPrintIndex = 0;



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


uxNamesLabel.Text += string.Format("{0}, {1}", names[toPrintIndex], new string(' ', 1));
toPrintIndex++;
if (toPrintIndex == names.Length)
toPrintIndex = 0;




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


نهایتا به صورت کل میشه این:

public partial class TestForm : Form
{
private Timer printerTimer = new Timer();
private string[] names = new string[] { "Ali", "Amir", "Reza", "Naser", "Mahdi" };
private int toPrintIndex = 0;
public TestForm()
{
InitializeComponent();
uxNamesLabel.Text = string.Empty;
printerTimer.Tick += printerTimer_Tick;
printerTimer.Interval = 1000;
printerTimer.Start();
}


void printerTimer_Tick(object sender, EventArgs e)
{
uxNamesLabel.Text += string.Format("{0}, {1}", names[toPrintIndex], new string(' ', 1));
toPrintIndex++;
if (toPrintIndex == names.Length)
toPrintIndex = 0;
printerTimer.Start();
}
}

محمد آشتیانی
یک شنبه 10 فروردین 1399, 01:46 صبح
سلام
به نظر بنده ، خیلی سریع و دم دستی از Queue استفاده کن و تمام (صد البته که راه حلی که خدمتتون میگم برای صورت مسئله شماست که عجیب هم هست:متفکر: )


using System;
using System.Collections.Generic;
using System.Windows.Forms;


namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private readonly Queue<string> stringsQueue;
public Form1()
{
InitializeComponent();

var names = new [] {"a", "b", "c", "d", "e"};
stringsQueue = new Queue<string>(names);
}


private void timer1_Tick(object sender, EventArgs e)
{
var queueItem = stringsQueue.Dequeue();
label1.Text += queueItem;
stringsQueue.Enqueue(queueItem);
}
}
}