پر کردن آرایه دو بعدی

para2x

Member
سلام به دوستان من با زبان C
(Turbo C) کار می کنم
آقا من دخلم اومده ، فقط می خوام یه آرایه دوبعدی رو از اطلاعات کاربر پر کنم ، ولی نمی خوام این کار رو تویه تابع main انجام بدم ، می خوام تویه یه تابع دیگه باشه
حالا می دونم که باید آرایه رو بصورت اشاره گر تویه main تعریف کنم ، بعد اونو بفرسم به تابع تا اون تابع مقدار ها رو بگیره بریزه تویه این آرایه
این تیکه کد من هست ، لطفا اشکال هاشو بگیرین یا مثال بدین خلاصه یه کمکی بکنین :
فعلا هم بصورت خیلی ساده اونو نوشتم تا روش کار بیاد دستم ، یعنی فقط یه عنصر این آرایه پر میشه

کد:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void getdata(int *);

void main() {
	int *num_row[10][10];
		clrscr();
getdata(&num_row);
printf("\n  %d ",num_row);
getch();
}



void getdata(int *num_row) {
scanf("%d",num_row[0][0]);
printf("\n  %d ",*num_row);

}
 

the_king

مدیرکل انجمن
لطفا این موارد رو در نظر بگیرید :

1) اگر شما یک آرایه را بصورت *int به یک تابع ارسال کنید، تبدیل به یک آرایه تک بعدی خواهد شد و برای
دسترسی به یک اندیسی همانند [2][3] ناچار به محاسبه اندیس تک بعدی 2 + 10 * 3 خواهید بود.

اگر آرایه دو بعدی تان تعداد ستون های ثابتی دارد، آنرا در مشخصات تابع وارد کنید تا چنین مشکلی نداشته باشید :
کد:
void getdata(int [][10]);

2) نام هر آرایه ای خود یک اشاره گر است، مثلا در تعریف [int a[10 خود a یک اشاره گر است که به اولین خانه
آرایه اشاره می کند، اگر شما * را به ابتدای آن اضافه کنید، بجای یک آرایه شامل تعدادی int یک آرایه شامل
تعدادی اشاره گر خواهید ساخت، چیزی که قطعا مقصود شما نیست.
کد:
	int *num_row[10][10];

3) همانگونه که در مورد 2 اشاره گردید، نام آرایه خود یک اشاره گر است، به همین دلیل برای ارسال آن به یک تابع
نیازی به ایجاد اشاره گر دیگری نیست، مخصوصا که نتیجه اش پیچیده و نامفهوم است.

مثلا کد زیر در واقع آدرس اشاره گری که به مقدار اشاره گری که به اولین اندیس آرایه اشاره می کند را به عنوان
پارامتر ارسال می کند :
کد:
getdata(&num_row);

4) محتویات یک آرایه بایستی اندیس به اندیس چاپ شوند، قابلیتی وجود ندارد که اینکار را بصورت خودکار انجام دهد،
همچنین برای نمایش مقدار یک اندیس از آرایه بایستی اندیس ها مشخص شوند مثلا [0][0]
کد زیر در واقع مقدار اشاره گر یعنی آدرس حافظه ای که اولین اندیس آرایه در آن ذخیره شده را چاپ می کند،
نه مقدار اندیس را :
کد:
printf("\n  %d ",num_row);

5) برای دریافت یک اندیس آرایه توسط scanf به آدرس آن اندیس نیاز دارید، پس & پیش از نام آرایه فراموش نشود :
کد:
scanf("%d",num_row[0][0]);

کد را بدین نحو ویرایش کردم :

کد:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void getdata(int [][10]);

void main() {
	int num_row[10][10];
	clrscr();
	getdata(num_row);
	printf("\n  %d ",num_row[0][0]);
	getch();
}



void getdata(int num_row[][10])
{
	scanf("%d", &num_row[0][0]);
	printf("\n  %d ", num_row[0][0]);
}
 

para2x

Member
آقا واقعا دمت گرم
خیلی چیز یاد گرفتم
البته مورد 4و5 رو سوتی داده بودم تو سورس اصلی خودم رعایت کرده بودم
ولی واقعا دس خوش
 

flashMASTER

New Member
کد:
//fill array and print it from func
#include <stdio.h>
#include <conio.h>
const int size=3;

void getdata(int m1[][size],int);
void printdata(int m1[][size],int);
int main()
{
  int i,j;
 clrscr();
  int m1[size][size]={0};
  getdata(m1,size);
  printf("\n-------------------------\n");
  printdata(m1, size);

  getch();
  return 0;

}
void getdata(int m1[][size],int size)
{
  int i,j;
  for (i=0;i<size;i++)
    for (j=0;j<size;j++)
      {
        printf("m1[%d][%d] =",i,j);
        scanf("%d",&m1[i][j]);
      }


}
void printdata(int m1[][size],int size)
{
  int i,j;
  for (i=0;i<size;i++)
    {
   	for (j=0;j<size;j++)
      printf("%-3d",m1[i][j]);
      printf("\n");

    }

}
 

para2x

Member
سلام
عذر می خوام ، وقتی می خوام عدد های اعشاری وارد کنم ، برنامه به هم می خوره
آرایه رو هم که float یا double تعریف می کنم بازم اصلا اینبار برنامه بالا نمیاد
چی کار کنم ؟
 

flashMASTER

New Member
نوع آرایه اعشاری

کد:
//fill array and print it from func
//float
#include <stdio.h>
#include <conio.h>
const int size=3;

void getdata(float m1[][size],int);
void printdata(float m1[][size],int);
int main()
{
  int i,j;
// clrscr();
  float m1[size][size]={0};
  getdata(m1,size);
  printf("\n-------------------------\n");
  printdata(m1, size);

  getch();
  return 0;

}
void getdata(float m1[][size],int size)
{
  int i,j;
  for (i=0;i<size;i++)
    for (j=0;j<size;j++)
      {
        printf("m1[%d][%d] =",i,j);
        scanf("%f",&m1[i][j]);
      }


}
void printdata(float m1[][size],int size)
{
  int i,j;
  for (i=0;i<size;i++)
    {
   	for (j=0;j<size;j++)
      printf("%-7.2f",m1[i][j]);
      printf("\n");

    }

}
 

پیوست ها

  • ejra.GIF
    ejra.GIF
    3.9 کیلوبایت · بازدیدها: 2
آخرین ویرایش:

para2x

Member
بازم سلام
آقا ببخشید من وقتی همه چیز رو تبدیل می کنم به float یعنی نوع ارایه ارسال به تابع ، ورودی و خروجی رو برنامه یه پیغام میده
" Ab Normal Termin Program " و بعد برنامه تویه حلقه بی پایان میوفته
من از Turbo C 2استفاده می کنم ، شاید کامپایلر هامون متفاوته ،
چرا ماله من اینجوری ؟ به نظرتون چی کار کنم ؟
 

the_king

مدیرکل انجمن
بازم سلام
آقا ببخشید من وقتی همه چیز رو تبدیل می کنم به float یعنی نوع ارایه ارسال به تابع ، ورودی و خروجی رو برنامه یه پیغام میده
" ab normal termin program " و بعد برنامه تویه حلقه بی پایان میوفته
من از turbo c 2استفاده می کنم ، شاید کامپایلر هامون متفاوته ،
چرا ماله من اینجوری ؟ به نظرتون چی کار کنم ؟

لطفا یک نمونه از کدی که با این مشکل مواجه میشه رو قرار بدهید.
 
بازم سلام
آقا ببخشید من وقتی همه چیز رو تبدیل می کنم به float یعنی نوع ارایه ارسال به تابع ، ورودی و خروجی رو برنامه یه پیغام میده
" ab normal termin program " و بعد برنامه تویه حلقه بی پایان میوفته
من از turbo c 2استفاده می کنم ، شاید کامپایلر هامون متفاوته ،
چرا ماله من اینجوری ؟ به نظرتون چی کار کنم ؟

سلام
ی چک کلی کن تو برنامه ای که نوشتی ببین فاصله ای اضافی یا کارکتری اضافی تو برنامه نگذاشتی
بعضی مواقع به خاطر فاصله های اضافی برنامه دچار مشکل می شه
:-?
 

para2x

Member
اینم کد کوچیک شدش :
کد:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void getdata(float [][10]);

void main() {
	float num_row[10][10];
	clrscr();
	getdata(num_row);
	printf("\n  %f ",num_row[0][0]);
	getch();
}



void getdata(float num_row[][10])
{
	scanf("%f", &num_row[0][0]);
	printf("\n  %f ", num_row[0][0]);
}

تویه این حالت توربو اصلا اون رو اجرا نمی کنه
فایل exe ای که ازش می سازم ، تا روش کلیک می کنم ، می پره بیرون از برنامه
thx
 

para2x

Member
والا فاصله اضافی فک نمی کنم ، نه نیس
ولی یه چیزی برام واضحه اونم اینکه تا scanf تا از d% تبدیلش کردم به f% این مشکل پیش اومد
یعنی با d% کار می کنه ، ولی خوب می دونین که مشکلی ...
 

flashMASTER

New Member
بفرما کد تست شده در توربو سی نسخه 3 ---------
Turbo c v3.0
نکته : بعد اول آرایه را مقدار دهی کن [10][10]

کد:
//fill array and print it from func
//float
#include "stdio.h"
#include "conio.h"
const int size=3;
void getdata(float m1[3][3],int);
void printdata(float m1[3][3],int);
int main()
{
  int i,j;
  float m1[3][3]={0};
//  clrscr();
  getdata(m1,size);
  printf("\n-------------------------\n");
  printdata(m1, size);

  getch();
  return 0;

}
void getdata(float m1[3][3],int size)
{
  int i,j;
  for (i=0;i<size;i++)
    for (j=0;j<size;j++)
      {
	printf("m1[%d][%d] =",i,j);
	scanf("%f",&m1[i][j]);
      }
}

void printdata(float m1[3][3],int size)
{
  int i,j;
  for (i=0;i<size;i++)
    {
	for (j=0;j<size;j++)
      printf("%-7.2f",m1[i][j]);
      printf("\n");

    }

}
 
آخرین ویرایش:

the_king

مدیرکل انجمن
دلیل اش می تونه این باشه که کامپایلر تون کمی خنگه و متوجه نیاز برنامه به لینک کردن توابع ممیز اعشاری
scanf نشده، به همین جهت لازمه که روی وجود scanf در برنامه کمی بیشتر تاکید کنید :
کد:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

extern unsigned _floatconvert;
#pragma extref _floatconvert


void getdata(float [][10]);

void main()
{
   float num_row[10][10];
[B]   float f;[/B]
   clrscr();
[B]   f = 1;[/B]
[B]   if (f > 2)
       scanf("%f", &f);
[/B]   getdata(num_row);
   printf("\n  %f ",num_row[0][0]);
   getch();
}

void getdata(float num_row[][10])
{
    scanf("%f", &num_row[0][0]);
    printf("\n  %f ", num_row[0][0]);
}
 

para2x

Member
با عرض پوزش ، با turbo C 3 هم نمیشه
این یه تیکه از کد منه
قسمت اول تابع main تعریف توابع و متغیر هست
قسمت دوم تابعی که قراره متغیر رو پر کنه

1_51.png


وقتی این رو اجرا می کنم ، همون بک گراند سیاه توربو سی و با دوتا اینتر هم از برنامه میاد بیرون
 

para2x

Member
دوستان اگه میشه یه نگاه دیگه ای بندازین ، شاید یه چیزی به ذهنتون رسید یه کمکی شد!!!
 

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

بالا