اشاره گر به اشارهگر
int* p;
int x=167;
p=&x;
p جایی در حافظه قرار میگیرد و آدرسی دارد آدرس p را میتوان در یک اشاره به اشاره گر قرار داد.
int** q;
q میتواند آدرس متغیری را نگه دارد که آن متغیر آدرس یک integer را نگه می دارد.
q=&p;
cout<<*p;è167
cout<<**q;è167
cout<<q;è p آدرس
cout<<*q;è x آدرس
cout<<**q;è x
آرایه ای از اشاره گرها
int* p[10];
آرایه فوق شامل 10 عنصر است که محتویات آن آدرس متغیرهایی از نوع int است.
|
|
|
|
|
|
|
|
آدرس اعداد صحیح |
ساختار (struct)
نوعی است که توسط کاربر تعریف میشود و شامل فیلدهایی است که نوع فیلد و نام فیلد کاربر مشخص می کند.
شکل کلی یک ساختار:
struct نام ساختار
}
نوع فیلد1 نام فیلد1;
نوع فیلد2 نام فیلد2;
......
{;
ساختار دانشجو
struct student{
int ID;
char name[30];
char family[40];
float avg;
};
ساختار زمان:
struct time
{
int hour;
int minute;
int second;
};
تعریف متغیری از نوع ساختار همانند تعریف یک متغیر از انواع داده های موجود است.
student s1;
student st[10];
|
|
|
|
|
|
|
|
|
|
اگر بنویسیم st[0].ID=123;
آرایه ای از نوع دانشجو تعریف شده است.
برای دسترسی به فیلدهای نوع دانشجو از نقطه به همراه نام فیلد استفاده کرد.
student s1;
s1.ID=1234;
strcpy(s1.name,"ali");
strcpy(s1.family,"asadi");
s1.avg=11.99;
ID |
name |
family |
avg |
کدی بنویسید که اطلاعات 10 دانشجو را از کاربر دریافت کنیم.
Student ST[10];
for(int i=0;i<10;i++)
{
cout<<”\nenter info student “<<i+1<<”:”;
cin>>ST[i].ID;
gets(ST[i].name);
gets(ST[i].family);
cin>>ST[i].avg;
}
|
|
|
|
|
|
|
|
|
|
ساختاری برای دانشجو شامل شماره دانشجویی و نام و فامیلی و معدل بسازید و اطلاعات 4 نفر را از کاربر دریافت کنید و تابعی به نام IsMashroot بنویسید که یک ساختار از نوع student دریافت کرده و در صورتی که دانشجو مشروط باشد 1 و در غیر این صورت صفر را برگرداند. پس از نوشتن تابع فوق وضعیت مشروطی هر 4 نفر را از طریق تابع IsMashroot بررسی کنید.
struct student
{
int stid;
char stname[30];
char stfamily[30];
float stavg;
};
int IsMashroot(student s1)
{
if (s1.stavg<12)
return 1;
else
return 0;
}
void main()
{
student ST[4];
for(int i=0;i<4;i++)
{
cout<<”\nenter id,name,family,avg student “<<i+1<<”:”;
cin>>ST[i].stid;
gets(ST[i].stname);
gets(ST[i].stfamily);
cin>>ST[i].stavg;
}
// نمایش وضعیت مشروطی افراد
for(int i=0;i<4;i++)
if (IsMashroot(ST[i])==1)
cout<<”\n”<<ST[i].stname<<” “<<ST[i].stfamily<<” mashroot ast”;
else
cout<<”\n”<<ST[i].stname<<” “<<ST[i].stfamily<<” mashroot nist”;
}//main
تابعی بنویسید که همانند یک منوی انتخاب عمل کند و کاربر بتواند با انتخاب یکی از مقادیر کار مربوط به آن گزینه را انجام دهد:
1…..input student info
2…..show info
3…..show student with max avg
4..…change avg
5..…exit
جواب:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
struct student
{
int stid;
char stname[30];
char stfamily[30];
float stavg;
};
void showinfo(student [],int ) ;
void showMaxAvg(student [],int ) ;
void changeAvg(student [],int ) ;
void input(student [],int );
int menu();
void main()
{
student Students[10];
int num_of_student;
cout<<"\nenter # of students:";
cin>>num_of_student;
while (1)
{
int k=menu();
switch (k)
{
case 1:
input(Students,num_of_student);
break;
case 2:
showinfo(Students ,num_of_student);
break;
case 3:
showMaxAvg(Students ,num_of_student);
break;
case 4:
changeAvg(Students ,num_of_student);
break;
case 5:
abort();
}
}
}
void input(student ST[],int num)
{
for(int i=0;i<num;i++)
{
cout<<"\nenter id,name,family,avg student "<<i+1<<":";
cin>>ST[i].stid;
gets(ST[i].stname);
gets(ST[i].stfamily);
cin>>ST[i].stavg;
}
}
void showMaxAvg(student ST[],int num)
{
int maxindex=0;
for(int i=1;i<num ;i++)
if(ST[i].stavg>ST[maxindex].stavg)
maxindex=i;
cout<<"\n\n show info student with max average:\n";
cout<<"\n"<<ST[maxindex].stid<<"\t"<<ST[maxindex].stname;
cout<<"\t"<<ST[maxindex].stfamily<<"\t"<<ST[maxindex].stavg;
}
void showinfo(student ST[],int num)
{
cout<<"\nID"<<"\t"<<"Name"<<"\t"<<"family"<<"\t"<<"average";
for(int i=0;i<num;i++)
cout<<"\n"<<ST[i].stid<<"\t"<<ST[i].stname<<"\t"<<ST[i].stfamily<<"\t"<<ST[i].stavg;
}
int menu()
{
cout<<"\n1…input student info";
cout<<"\n2…show info";
cout<<"\n3…show student with max avg ";
cout<<"\n4…change avg";
cout<<"\n5…exit";
cout<<"\n select 1...5\n";
int x;
cin>>x;
return x;
}
void changeAvg(student ST[],int num)
{
int stid;
float newavg;
cout<<"\nenter id of student for change avg:";
cin>>stid;
cout<<"\nenetr new avg:";
cin>>newavg;
for(int i=0;i<num;i++)
if (ST[i].stid== stid)
ST[i].stavg=newavg;
}
اشارهگر به ساختار می توانیم داشته باشیم
student* p;
p میتواند آدرس یک متغیر از نوع student را نگه دارد.
student st1;
st1.stid=1234;
strcpy(st1.name,”ali”);
strcpy(st1.family,”akbari”);
st1.stavg=15.99;
p=&st1;
p به st1 اشاره میکند. اگر بخواهید به فیلدهای یک ساختار از طریق اشاره گر به ساختار، دسترسی پیدا کنید باید به جای نقطه از فلش -> استفاده کنید.
cout<<st1.name;èali
cout<<p->name;èali
اگر بخواهیم تعداد دانشجویان را کاربر مشخص کند (اندازه آرایه ST توسط کاربر مشخص شود)
int num;
cout<<”\nenter num:”;
cin>>num;
student ST[num];
کد فوق جوابگو نیست.
int num;
cout<<”\n enter num:”;
cin>>num;
student* ST;
ST=new student[num];
|
|
|
|
|
|
|
|
|
آرایه ST دارای num خانه است که هر خانه به اندازه یک student فضا اشغال می کند.
for(int i=0;i<num;i++)
{
cout<<"\nenter id,name,family,avg student "<<i+1<<":";
cin>>ST[i].stid;
gets(ST[i].stname);
gets(ST[i].stfamily);
cin>>ST[i].stavg;
}
و یا کد زیر را بنویسیم
student * p;
p=ST;//p=&ST[0]
for(int i=0;i<num;i++,p++)
{
cout<<"\nenter id,name,family,avg student "<<i+1<<":";
cin>>p->stid;
gets(p->stname);
gets(p->stfamily);
cin>> p->stavg;
}
دانلود فایل مثال ها
(*.cpp)