آرایه دوبعدی

mahtab2009

Member
سلام . من چطور می تونم توی برنامه c++ آرایه دو بعدی از نوع char تعریف کرد که وقتی بهش مقدار میدم لازم نباشه تا آخرین مقدار سطر کاراکتر وارد کنم مثلا اگر یک آرایه 20*15 معرفی کردم و خواستم در اولین سطر بنویسم مهتاب آقایی هم فاصله رو قبول کنه و هم بعد از زدن اینتر بقیه آرایه های خالی رو بی خیال بشه و به سطر بعد برای گرفتن آرایه بعدی بره .
ممنون میشم راهنمایی ام کنید.
 

the_king

مدیرکل انجمن
سلام . من چطور می تونم توی برنامه c++ آرایه دو بعدی از نوع char تعریف کرد که وقتی بهش مقدار میدم لازم نباشه تا آخرین مقدار سطر کاراکتر وارد کنم مثلا اگر یک آرایه 20*15 معرفی کردم و خواستم در اولین سطر بنویسم مهتاب آقایی هم فاصله رو قبول کنه و هم بعد از زدن اینتر بقیه آرایه های خالی رو بی خیال بشه و به سطر بعد برای گرفتن آرایه بعدی بره .
ممنون میشم راهنمایی ام کنید.
کاراکتر فاصله جزو مجموعه کاراکتر هایی است که بهشون White-Space می گویند. بیشتر توابع C و ++C کاراکتر های
White-Space رو کاراکتر انتهایی ورودی تفسیر می کنند و اگر بهشون یک رشته ای بدهید که وسط اش کاراکتر فاصله
هست، فقط بخش اول رو دریافت می کنند.

خوشبختانه در ++C توابع استانداردی هم وجود داره که موقع دریافت کردن رشته کاراکتر فاصله رو هم
جزو رشته حساب می کنند، مثلا gets و fgets و getline . این توابع زمانی که کلید Enter رو فشار دادید دریافت کردن
ورودی رو متوقف می کنند. برای توضیحات بیشتر به مبحث زیر مراجعه کنید :

دریافت رشته با scanf بدون فاصله

در مثال زیر 5 سطر (رشته) از کاربر دریافت میشه که هر کدوم می توانند طول متفاوتی تا 25 کاراکتر داشته باشند
(محدودیتی برای وجود کاراکتر فاصله در رشته نیست) و سپس اون 5 سطر دریافت شده رو نشون میده :

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

int main()
{
    char a[5][25];
    for (int i = 0; i < 5; i++)
        gets(a[i]);

    for (int i = 0; i < 5; i++)
        cout << a[i] << endl;

    getch();
    return 0;
}
 

mahtab2009

Member
ممنون از راهنمایی تون ولی هنوز یک مشکل باقیه .من می خوام از کاربر تعداد اسامی دریافتی رو بپرسم و به تعدادی که کاربر می خواد تو حلقه for اسم دریافت کنم . دستوراتی که شما نوشتی درست اجرا میشه اگه از قبل تعداد اسامی مشخص باشه اما به محض این که من یک int n معرفی کرده و cin می کنم اولین آرایه رو بی خیال میشه و از دومی به بعد رو میگیره . لطفا یک بار این دستورات رو اجرا کنید و بگید اشکالش چیه ؟؟؟
خیلی خیلی متشکرم
#include "iostream.h"
#include "conio.h"

int main()
{
int n;
cout<<"Please enter number of collegians: \n";
cin>>n;
char name[15][20];
for(int i=0;i<n;i++)
{
cout<<"Enter name "<<i+1<<": ";
gets(name);
}
for(int i=0;i<n;i++)
{
cout<<"the name "<<i+1<<": ";
cout<<name<<"\n";
}

getch();
return 0;
}
 

the_king

مدیرکل انجمن
ممنون از راهنمایی تون ولی هنوز یک مشکل باقیه .من می خوام از کاربر تعداد اسامی دریافتی رو بپرسم و به تعدادی که کاربر می خواد تو حلقه for اسم دریافت کنم . دستوراتی که شما نوشتی درست اجرا میشه اگه از قبل تعداد اسامی مشخص باشه اما به محض این که من یک int n معرفی کرده و cin می کنم اولین آرایه رو بی خیال میشه و از دومی به بعد رو میگیره . لطفا یک بار این دستورات رو اجرا کنید و بگید اشکالش چیه ؟؟؟
خیلی خیلی متشکرم
ویرایشگر متنی فروم یک دکمه (
code.gif
)داره که مخصوص قرار دادن کد برنامه است، اگر از اون استفاده کنید متن کد بهتر
نمایش داده میشه، نیازی به چپ چین کردنش هم نیست.

اگه کامل اون تاپیکی رو که لینک اش رو نوشته بودم می خوندید اشکال کد شما در همون تاپیک توضیح داده شده بود.
باید بعد از خوندن n از cin از fflush استفاده کنید تا کد کاراکتر Enter از بافر ورودی حذف بشه. cin اینکار رو انجام نمیده :

کد:
#include <iostream>
#include "conio.h"
[COLOR="Blue"]#include "stdio.h"[/COLOR]

using namespace std;

int main()
{
    int n;
    cout << "Please enter number of collegians: \n";
    cin >> n;
[COLOR="Blue"]    fflush(stdin);[/COLOR]
    char name[15][20];
    for(int i = 0; i < n; i++)
    {
        cout << "Enter name " << i + 1 << ": ";
        gets(name[i]);
    }
    for(int i = 0; i < n; i++)
    {
        cout << "the name " << i + 1 << ": ";
        cout << name[i] << "\n";
    }

    getch();
    return 0;
}
 

mahtab2009

Member
با تشکر مجدد میشه لطف کنید این سؤالم رو هم جواب بدید ؟
برای معرفی کردن این آرایه دو بعدی به تابع مگه نمیشه مثل آرایه یک بعدی عمل کرد؟؟ چرا وقتی من آرایه رو داخل main می گیرم نمی تونم داخل یه تابع مرتب سازی از اون استفاده کنم. برای یک بعدی ها در قسمت پارمتر می نویسیم []A ولی برای دوبعدی ها وقتی می نویسم [][]A خطا می گیره چرا ؟؟
 

the_king

مدیرکل انجمن
با تشکر مجدد میشه لطف کنید این سؤالم رو هم جواب بدید ؟
برای معرفی کردن این آرایه دو بعدی به تابع مگه نمیشه مثل آرایه یک بعدی عمل کرد؟؟ چرا وقتی من آرایه رو داخل main می گیرم نمی تونم داخل یه تابع مرتب سازی از اون استفاده کنم. برای یک بعدی ها در قسمت پارمتر می نویسیم []A ولی برای دوبعدی ها وقتی می نویسم [][]A خطا می گیره چرا ؟؟

فرض کنید بهتون یک آرایه دو بعدی با ابعاد ثابت تحویل داده شده با نام [ ][ ]A، بدون اینکه
مشخص باشه چه ابعادی داره. چطوری می توانید آدرس شروع هر سطر اش و تعداد سطر هایش رو بدست بیاورید؟
باید ابعاد آرایه رو هم بهتون بدهند.

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

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

using namespace std;

[COLOR="Blue"]void print(char A[][20], int n)
{
    for(int i = 0; i < n; i++)
    {
        cout << "the name " << i + 1 << ": ";
        cout << A[i] << "\n";
    }
}[/COLOR]

int main()
{
    int n;
    cout << "Please enter number of collegians: \n";
    cin >> n;
    fflush(stdin);
    char name[15][20];
    for(int i = 0; i < n; i++)
    {
        cout << "Enter name " << i + 1 << ": ";
        gets(name[i]);
    }

[COLOR="Blue"]    print(name, n);[/COLOR]

    getch();
    return 0;
}
 

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

بالا