Struct چیست؟
در هر زبان برنامه نویسیزبان های برنامه نویسی چیست؟این مقاله عالی توضیح داده که زبان های برنامه نویسی چیست؟ و انواع زبان های برنامه نویسی و بهترین زبان برنامه نویسی برای شروع و پردرآمدترین آنها را معرفی کرده، روشهای مختلفی برای نگهداری داده وجود دارد؛ مانند آرایهآموزش آرایه در ساختمان داده به زبان ساده و از 0 تا 100در این مقاله موارد زیر بررسی شده است : 1- آرایه چیست 2- انواع اندیس گذاری در آرایه 3- انواع آرایه 4- محاسبه آدرس در آرایه 5- محاسبه شماره در آرایه 6- آرایه در برنامه نویسی 7- مزایای استفاده از آرایهها، لیستهای پیوندی و پشتهساختمان داده پشته ⚡️ پشته چیست؟ کاربرد پشته در ساختمان دادهاین مقاله عالی توضیح داده که پشته چیست و کاربرد پشته در ساختمان داده چیست، همچنین نحوه کارکرد پشته، پیاده سازی پشته و عملیات های پشته را معرفی کرده که هر کدام موارد استفاده خودشان را دارند؛ بهعنوان مثال، برای ذخیره چندین داده تحت عنوان یک نام، سادهترین راه استفاده از آرایه است ولی اگر قصد داشته باشیم چندین داده از جنسهای متخلف را تحت یک نام ذخیره کنیم، شاید آرایه دیگر گزینه مناسبی نباشد. اینجاست که میتوانیم از ساختمان داده Struct استفاده کنیم. از این ساختار میتوان به شکلهای مختلفی استفاده کرد و کمک شایانی در دسته بندی دادهها میکند. در این مقاله سعی میکنیم ابتدا با فرم کلی این دستور آشنا شویم و در مرحله بعد، Struct را در زبانهای سی (Cزبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح میدهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C میپردازد) و سیشارپ (C#سی شارپ چیست ⚡️سی شارپ به زبان سادهاین صفحه عالی بررسی کرده که سی شارپ چیست و تاریخچه سی شارپ، محیط و ابزارهای سی شارپ، ویژگی های سی شارپ، مزایای سی شارپ و کاربرد و بازار کار سی شارپ را گفته ) به تفصیل بررسی کنیم. در انتها برای آشنایی هرچه بیشتر، یک مثال را در زبانهای سی پلاس پلاسبرنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده (C++) و گولنگ (Golang) مشاهده خواهیم کرد.
چرا باید از Struct استفاده کنیم؟
در زبانهای مختلف برنامه نویسی بهدلیل مزیتهای قابل توجهی که Struct دارد، استفاده زیادی از این ساختار میشود. اگر بخواهیم چند مورد از مزیتهای این ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده است را نام ببریم، میتوانیم به موارد زیر اشاره کنیم.
- افزایش سازماندهی و خوانایی کد
- قابلیت استفاده مکرر
- صرفهجویی در مصرف حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روشهای آدرس دهی کش، نگاشت آدرس و موارد دیگر میپردازیم
- پیادهسازی دادههایی با ساختار پیچیده
تفاوت Struct و Class
شاید در ظاهر این دو ساختمان مشابه یکدیگر باشند، ولی در واقع تفاوتهای کلیدی با هم دارند که به شرح زیر است:
- وراثت (Inheritance): کلاسها از وراثتمفهوم وراثت یا ارث بری (Inheritance) در برنامه نویسیاین مقاله عالی مفهوم وراثت یا ارث بری در برنامه نویسی را گفته و انواع ارث بری در برنامه نویسی از جمله ارث بری چندگانه و مزایا و معایب ارث بری را بررسی کرده پشتیبانی میکنند، به این منظور که در زبانهای برنامه نویسی شی گرابرنامه نویسی شی گرا چیست؟ شی گرایی چیست؟این صفحه عالی به معرفی برنامه نویسی شی گرا پرداخته و توضیح داده شی گرایی یا همان object oriented یا OPP چیست؟ همچنین مزایای برنامه نویسی شی گرا را بیان کرده، یک کلاس میتواند خواص یک کلاس مجزای دیگر را به ارث ببرد در صورتی که Struct، عموماً از وراثت پشتیبانی نمیکند؛ چرا که از Struct برای تولید ساختارهایی سبک جهت گروهبندی دادهها استفاده میشود.
- تخصیص حافظه: Structها معمولاً در قسمت استک (Stack) حافظه ذخیره میشوند، در حالی که کلاسها در قسمت Heap حافظه نگهداری میگردند. دسترسی به اجزای حافظه استک سریعتر از هیپ است و باعث میشود که فراخوانی Structها سریعتر از کلاسها باشد.
- موارد استفاده: شاید مهمترین تفاوت بین این دو، موارد استفاده باشد. از Struct برای ذخیره دادههایی که میتوانند در یک گروه قرار بگیرند استفاده میشود، مانند اطلاعات مربوط به اشخاص. از طرفی کلاس علاوه بر دستهبندی دادهها، شامل رفتار و ارثبری هم میشود و میتوان اشیای پیچیده را با استفاده از آن پیادهسازی کرد.
Struct در زبان سی (C)
برای پیاده سازی ساختمان داده Struct در زبان سی، میتوان از دستور Struct به روش زیر عمل کرد:
struct structName
{
datatype member_1
datatype member_2
datatype member_3
…
datatype member_n
};
بهعنوان مثال اگر بخواهیم از Struct برای دستهبندی اطلاعات مربوط به اشخاص استفاده کنیم، خواهیم داشت:
struct person
{
char first_name[30];
char last_name[30];
int age;
};
و بهصورت زیر یک متغیر از نوع person تعریف میکنیم:
int main() {
struct person p1;
}
مقداردهی و دسترسی به عناصر
پس از تعریف Struct و متغیری از این نوع، نوبت به مقداردهی به اعضای Struct و دسترسی به آنها است. برای مقداردهی به عضوی از نوع عدد صحیح یا Integer، بهشکل زیر عمل میکنیم:
int main() {
struct person p1;
p1.age = 25;
}
نکتهای که باید به آن توجه کنیم این است که برای اختصاص دادن دادههایی از نوع رشته (Strringرشته یا String چیست ⚡️ نحوه کار با استرینگ در برنامه نویسیاین مقاله به معرفی رشته (String) یا استرینگ در برنامه نویسی، رشته در پایتون، رشته در C++ و همین طور الگوریتمهای معروف مربوط به رشته ها در برنامه نویسی پرداخته ) نمیتوان به صورت بالا عمل کرد؛ بهعنوان مثال فرض کنید قصد داریم برای شخص p1 نام و نام خانوادگی تعیین کنیم، چنانچه به شکل زیر این کار را انجام دهیم، به خطا بر خواهیم خورد:
p1.first_name = "Alice";
p1.last_name = "Anderson";
برای جلوگیری از بروز خطا، میبایست از تابع strcpy() استفاده کنیم:
strcpy(p1.first_name, "Alice");
strcpy(p1.last_name, "Anderson");
همچنین میتوانیم زمانی که متغیری را تعریف میکنیم، به اعضای آن مقداردهی کنیم که در واقع چهار قدم بالا در یک خط خلاصه میشود:
int main() {
struct person p1 = {"Alice", "Anderson", 25};
}
Struct تودرتو
شما میتوانید با استفاده از Struct، ساختارهای تودرتو طراحی کنید. با این متد میتوان ساختمان دادههای پیچیده را بدون سردرگمی از حجم بالای دادهها پیادهسازی کرد. در ادامه مثال قبل، اگر فرض کنیم که میخواهیم اطلاعات کارمندان یک شرکت را علاوه بر نام و سن آنها ذخیره کنیم، خواهیم داشت:
#include <stdio.h>
struct person {
char first_name[30];
char last_name[30];
int age;
};
struct company {
struct person emp;
int id;
int salary;
};
int main() {
struct company employee1;
employee1.id = 236;
employee1.salary = 25000;
employee1.emp.age = 29;
strcpy(employee1.emp.first_name, "Max");
strcpy(employee1.emp.last_name, "Smith");
printf("First name: %s\nlast name: %s\nage: %d\nID: %d\nSalary: %d\n",
employee1.emp.first_name, employee1.emp.last_name, employee1.emp.age,
employee1.id, employee1.salary);
return 0;
}
که خروجی کد بالا به شکل زیر خواهد بود:
Struct در زبان سیشارپ (C#)
پیاده سازی Struct در زبان سیشارپ مشابه زبان سی است و در برخی از جزئیات متفاوت است که در ادامه به این موارد میپردازیم. برای تعریف Struct در سیشارپ بهصورت زیر عمل میکنیم:
using System;
struct Person
{
public string first_name;
public string last_name;
public int age;
}
و به شکل زیر یک متغیر به نام person از ساختاری که تعریف کردهایم، ایجاد میکنیم:
class Program
{
static void Main()
{
Person person;
}
}
مقداردهی و دسترسی به عناصر
به صورت زیر عمل مقداردهی به اعضای person را انجام میدهیم که مشابه کدی است که در زبان سی پیادهسازی کردهایم (بهجز اختصاصدهی داده از نوع رشته به متغیر متغیر در برنامه نویسی چیست ⚡️انواع متغیر در برنامه نویسیاین صفحه عالی بررسی کرده متغیر در برنامه نویسی چیست و انواع متغیر در برنامه نویسی را معرفی و مراحل کار با متغیر، نحوه تعریف و قوانین نامگذاری متغیرها را گفته ).
person.first_name = "Liam";
person.last_name = "Anderson";
person.age = 36;
جهت دسترسی به مقادیر اعضای person نیز همانند توضیحات پیشین، خواهیم داشت:
Console.WriteLine("First Name: " + person.first_name); Console.WriteLine("Last Name: " + person.last_name);
Console.WriteLine("Age: " + person.age);
Struct تودرتو
زبان سیشارپ همانند زبان سی از Structهای تودرتو پشتیبانی میکند. چنانچه بخواهیم مثالی که در قسمت قبل بررسی کردیم را با زبان سیشارپ پیادهسازی کنیم، قطعه کد زیر حاصل میشود:
using System;
struct Person
{
public string first_name;
public string last_name;
public int age;
}
struct Company
{
public Person emp;
public int id;
public int salary;
}
class Program
{
static void Main()
{
Company employee1;
employee1.emp.first_name = "Benjamin";
employee1.emp.last_name = "Walker";
employee1.emp.age = 42;
employee1.id = 632;
employee1.salary = 57000;
Console.WriteLine("First Name: " + employee1.emp.first_name);
Console.WriteLine("Last Name: " + employee1.emp.last_name);
Console.WriteLine("Age: " + employee1.emp.age);
Console.WriteLine("ID: " + employee1.id);
Console.WriteLine("Salary: " + employee1.salary);
}
}
و پس از اجرا، خروجی نمایش داده شده بهشکل زیر خواهد بود:
Struct در بقیه زبانهای برنامه نویسی
در برخی از زبانها مانند پایتونزبان برنامه نویسی پایتون چیست؟ – نحوه شروع و دلایل محبوبیتزبان برنامه نویسی پایتون (Python) چیست؟ این مقاله عالی به بررسی دلایل محبوبیت پایتون، موارد استفاده از پایتون و نحوه شروع به برنامه نویسی پایتون پرداخته و جاواجاوا چیست؟ تعریف، معنی و ویژگی های جاوا (java) از 0تا100جاوا یک زبان برنامه نویسی همه منظوره، مبتنی بر کلاس و شی گرا است که برای داشتن وابستگی های پیاده سازی کمتر طراحی شده است، زبان برنامه نویسی جاوا شبیه ++C است، دستور Struct وجود ندارد و باید بهجای آن از دستور class استفاده کرد. این مورد میتواند یکی از معایب این زبانها در مقابل زبانهایی مانند سی و سیشارپ باشد (عدم بهینه بودن مصرف حافظه)؛ به عنوان مثال اگر بخواهیم مثالی که تا به اینجا بررسی کردهایم را به زبان پایتون پیادهسازی کنیم، خواهیم داشت:
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
class Company(Person):
def __init__(self, first_name, last_name, age, id, salary):
super().__init__(first_name, last_name, age)
self.id = id
self.salary = salary
employee1 = Company("Lucas", "Bennett", 41, 721, 75000)
print(f"First name: {employee1.first_name}\n"\
f"Last name: {employee1.last_name}\n"\
f"Age: {employee1.age}\n"\
f"ID: {employee1.id}\n"\
f"Salary: {employee1.salary}\n")
از زبانهای دیگری که دستور Struct را پشتیبانی میکنند، میتوان به سیپلاسپلاس (C++) و گولنگ (Golang) اشاره کرد که جهت آشنایی هرچه بیشتر، با دو مثالِ Struct در این دو زبان، مقاله را به پایان میرسانیم.
Struct در سیپلاسپلاس
#include <iostream>
#include <string>
using namespace std;
struct Person{
string first_name;
string last_name;
int age;
};
struct Company{
Person employee;
int id;
int salary;
};
int main(){
Company company;
company.employee.first_name = "John";
company.employee.last_name = "Doe";
company.employee.age = 30;
company.id = 827;
company.salary = 50000;
cout << "Employee Name:" << company.employee.first_name << " " << company.employee.last_name << endl;
cout << "Age:" << company.employee.age << endl;
cout << "ID:" << company.id << endl;
cout << "Salary:" << company.salary << endl;
Struct در گولنگ
Package main
import (
"fmt"
)
type Person struct{
first_name string
last_name string
age int
}
type Company struct{
Employee Person
id int
salary int
}
func main() {
var employee1 Company
employee1.Employee.first_name = "Alexander"
employee1.Employee.last_name = "Johnson"
employee1.Employee.age = 26
employee1.id = 169
employee1.salary = 41000
fmt.Println("First name:", employee1.Employee.first_name)
fmt.Println("Last name:", employee1.Employee.last_name)
fmt.Println("Age:", employee1.Employee.age)
fmt.Println("ID:", employee1.id)
fmt.Println("Salary:", employee1.salary)
}
جمعبندی
در زبانهای برنامه نویسی، متدهای مختلفی برای ذخیره و سازماندهی دادهها وجود دارد که هر کدام وظایف مشخصی دارند. یکی از این ساختارها، ساختمان داده Struct است که با توجه به ماهیت و قابلیتهای آن، میتوان در بخشهای متعددی از آن بهره جست و دادههایی با ساختارهای پیچیده را پیادهسازی کرد.
Struct چیست؟
Struct یا Structure ساختمان دادهای است برای گروهبندی دادههایی که از لحاظ نوع و یا منطقی به هم مرتبط هستند. مانند مشخصات مربوط به یک خودرو مثل رنگ، وزن و ...
در چه شرایطی از Struct استفاده میشود؟
از این ساختار میتوان در شرایط متنوعی استفاده کرد، ولی به صورت کلی از Struct برای گروهبندی متغیرهایی استفاده میشود که از لحاظ داده و یا مفهوم به هم مرتبط هستند. این کار باعث جلوگیری از پیچیدگی برنامه و دسترسی سریعتر به دادهها میگردد.
Struct و class چه تفاوتهایی با هم دارند؟
از تفاوتهای این دو ساختمان داده، میتوان به سه مورد اشاره کرد:
1. قابلیت وراثت در class و عدم وجود این قابلیت در Struct
2. نحوه دسترسی به حافظه
3. موارد استفاده