X
تبلیغات
رایتل

برنامه نویسان کامپیوتر

این وب سایت به منظور استفاده دانشجویان دانشگاه شهید بهشتی کرج ایجاد شده

جلسه دهم

اشاره گر به اشاره­گر

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];

 

id

name

avg

family

 

id

name

avg

family

 

 

 

 

 

 

 

 

اگر بنویسیم 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;

}

ID

name

family

avg

ID

name

family

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)