Реферат: Программирование на языках высокого уровня 3 - Refy.ru - Сайт рефератов, докладов, сочинений, дипломных и курсовых работ

Программирование на языках высокого уровня 3

Рефераты по информатике » Программирование на языках высокого уровня 3

Программирование на языках высокого уровня ч2


Лабораторная №1


Задача 1


Составить программу на языке С/С++, содержащую:

- объявления и инициализацию указателей на различные типы объектов:

переменные, массивы, структуры;

- объявления и инициализацию указателей с различными модификаторами (const, near, far, huge);

- преобразования указателей различных типов, в том числе типа void.


#include <stdio.h>

#include <conio.h>

#include <iostream.h>


void main(void)

{

//переменные

const double Eu=8.1;

double *pEu=(double*)&Eu;

*pEu=4.6;

//изменения константы Eu с помощью указателя

cout<<Eu<<"n";


//массивы

float Y[]={1,2,3,4,5,6}; //указатель на масив вещественного типа

float *pY=Y; //pY указывает на начало массива y[]


//структуры

struct komp

{

char proc [20];

int memory;

};

komp *Celeron=NULL; //инициализированный указатель на объект типа komp

komp MStar[]={"Celeron2000",512,"Pentium2500",512};

Celeron=&MStar[0];

cout<<"n"<<Celeron<<"t"<<Celeron->proc<<"t"<<Celeron->memory;


//модификаторами (const, near, far, huge)


double St[]={8.1,3.3,1.4};

double *const pSt=&St[2]; //инициализированный константный указатель

//на элемент массива типа float


//преобразования указателей различных типов


unsigned long A=12345678;

char *char_=(char*)&A; //указатель на объект типа char

int *int_=(int*)&A; //указатель на объект целого типа

float *float_=(float*)&A; //указатель на объект вещественного типа

cout<<A<<"t"<<(void*)char_<<"t"<<int_<<"t"<<float_<<"n";

cout<<A<<"t"<<*char_<<"t"<<*int_<<"t"<<*float_;

cerr<<" ";


void *vp;

int i=77;

float f=2.7;

vp=&i;

cout<<"*(int*)vp="<<*(int*)vp;

vp=&f;

cout<<"*(float*)vp="<<*(float*)vp;


cerr<<" ";

getch();

}


Задача 2

Составить программу на языке С/С++, содержащую:

- простейшие действия с одномерными массивами (как числовыми, так и символьными),

используя указатели, методы доступа к элементам массивов через указатели;

- простейшие действия с многомерными массивами (как числовыми, так и символьными),

используя указатели, методы доступа к элементам массивов через указатели;

- всевозможные операции с указателями.

*/


#include <stdio.h>

#include <conio.h>

#include <iostream.h>


void main(void)

{


//одномерные массивы

int x[]={4,5,6,7,2,4,6};

char ch[]="ABCD";

char ch1[]={'A','B','C','D'};

int *px=x;

char *pch=ch;

char *pch1=ch1;


for(int i=0;i<7;i++) cout<<*(px+i)<<"t";

cout<<pch<<"n";

for(i=3;i>=0;i--) cout<<*(pch1+i)<<"t";

cout<<"n";

for(i=0;i<4;i++) cout<<*(pch1++)<<"t";


//многомерные массивы

int A[3][3]={1,2,3,4,5,6,7,8,9};

char B[3][3]={'A','B','C','D','E','F','G','H',''};


cout<<*(*(A+1))<<"n";


int C[3][2][4]=

{ 0, 1, 2, 3,

10, 11, 12, 13,

100, 101, 102, 103,

110, 111, 112, 113,

200, 201, 202, 203,

210, 211, 212, 213

};

cout<<***C<<"n";

cout<<*(*(*(C+1)+1)+3)<<"n";

int sum=0;

for(int i=0;i<3;i++)

for (int j=0;j<2;j++)

{

cout<<"n";

for(int k=0;k<4;k++)

{

sum+=*(*(*(C+i)+j)+k);

cout<<*(*(*(C+i)+j)+k)<<"t";

}

}

cout<<"n"<<sum;


cerr<<" ";


}


Задача 3

Составить программу на языке С/С++, содержащую:

- объявления указателей на функции и передачи аргументов с помощью указателей;

- доступ к содержимым по указателям.

*/


#include <stdio.h>

#include <conio.h>

#include <iostream.h>


void f1(int *x)

{

cout<<*x;

}


int** f2(int *x)

{

int **z= new int*[*x];

for (int i=0;i<*x;i++) z[i] = new int[*x];

for (i=0;i<(*x);i++)

for (int j=0;j<(*x);j++)

*(*(z+i)+j)=i+j;

return z;

}


void main(void)

{

int A=5;

void (*fun)(int*);

fun=f1;

int *pa=&A;

(*fun)(pa);


int **pf=NULL;


int (**(*fun1)(int*));

fun1=f2;

pf=(*f2)(pa);


cout<<"n"<<**pf;


for (int i=0;i<(*pa);i++)

{

cout<<"n";

for (int j=0;j<(*pa);j++)

cout<<*(*(pf+i)+j)<<"t";

}

cerr<<" ";

}


Задача 4

Составить программу на языке С/С++, содержащую:

- динамическое размещение массивов;

- интерпретацию составных описателей.


11


Задача 1

а) Создать программу определения факториала числа n, использующую цикл (любой - for или while).

б) Составить описание рекурсия математическими терминами.

в) Разработать схему рекурсивных вызовов.

г) Составить программу определения факториала числа n, использующую рекурсию.

д) Проанализировать работу рекурсивной функции с помощью отладчика.

е) Сделать сравнительный анализ работы двух программ.

*/


а)

#include <iostream.h>


void main()

{

int i;

cout << "Введите число:";

cin >> i;

// расчет факториала

int j, fact=1;

for (j=i; j>=1; j--) fact*=j;

cout << "Факториал равен:" << fact;


}


г)

#include <iostream>


long fact(int f)

{

if (f<0) return (0);

if (f==0) return (1);

return (f*fact(f-1));

}


Задача 2

Написать программу рекурсивной функции Аккермана с использованием основной функции ackr и

вспомогательной функции smacc. Составить описание рекурсия математическими

терминами. Разработать схему рекурсивных вызовов. Проанализировать работу рекурсивной

функция с помощью отладчика.

*/


#include <stdio.h>

#include <conio.h>


void main(void)

{

//clrscr();

int x,y,n;

long t;

int ackr(int,int,int);

printf("nВведите 3 целых положительных числа:n");


n=3,x=3,y=3;

//scanf("%d%d%d",&n,%x,&y);

t=ackr(n,x,y);

printf("Результат вычисления функции Акермана = %ld",t);

getch();


}


int smacc (int n, int x)

{

switch (n)

{

case 0: return (x+1);

case 1: return (x);

case 2: return (0);

case 3: return (1);

default: return (2);

}

}


int ackr(int n, int x, int y)

{

int z;

int smacc(int,int);

if(n==0||y==0)z=smacc(n,x);

else

{

z=ackr(n,x,y-1);

z=ackr(n-1,z,x);

}

return z;

}


Задача З

Подобрать собственный пример, иллюстрирующий работу рекурсивной функции.

Составить программу, выполнить ее анализ.

*/


Рекурсивный ввод и печать списка.


#include <stdlib.h>

#include <stdio.h>


struct cell

{

char sign[10];

int weight;

struct cell *pc;

};


struct cell* input(void)

{

struct cell *p;

p=(struct cell *)malloc(sizeof(struct cell));

printf("Sign=");

scanf("%s",& p->sign);

printf("Weight=");

scanf("%d",& p->weight);

if(p->weight==0)

{

free(p);

return NULL;

}

p->pc=input();

return p;

}


void output(struct cell *p)

{

if (p==NULL)

{

printf("nEND");

return;

}

printf("nsign=%stweight=%d",p->sign,p->weight);

output(p->pc);

}


void main(void)

{

struct cell *beg=NULL;

beg=input();

printf("nBegin");

output(beg);

}


12


Задача 1

Создать несвязанный числовой список в виде массива. Распечатать его.

Выполнить следующие операции с несвязанным списком:

а) найти максимальный по модулю элемент;

б) вставить за ним новый элемент, равный по величине, но противоположный по знаку;

в) Новый список распечатать.

*/


#include <stdio.h>

#include <conio.h>

#include <iostream.h>


int abc (int x) {return x>0?x:-x;}


void main(void)

{


int d[100]={1,2,300,-4,-50,6,7},L=7;

int max = 0;


//максимальный по модулю элемент

for (int i=0;i<L;i++)

if(abc(d[i])>abc(d[max])) max=i;

printf("MAX element= |%d|",d[max]);


//добавление нового элемента за МАХ элеме

for (int j=L-1; j>max; j--)

d[j+1]=d[j];

d[max+1]=-d[max]; L++;


//исключить первый элемент списка

for (j=0; j<L; j++)

d[j]=d[j+1];

L--;


//новый список

cout<<"n";

for (i=0;i<L;i++) cout<<d[i]<<"t";


cerr<<" ";

}


Задача 2

Создать связанный числовой список. Распечатать его. Выполнить следующие операции со связанным списком:

а) найти максимальный по модулю элемент;

б) вставить за ним новый элемент, равный по величине, но противоположный по знаку;

в) исключить первый элемент списка. Новый список распечатать.

*/


#include <stdio.h>

#include <conio.h>

#include <iostream.h>


int abc (int x) {return x>0?x:-x;}


struct ND

{

int val;

struct ND * n;

} *dl=NULL, *r, *p=NULL;


void main(void)

{

int mas[]={1,2,3,-50,6,30,1,2,3};

for(int i=0;i<sizeof(mas)/sizeof(mas[0]);i++)

{

r=new ND;

r->val=mas[i];

r->n=NULL;

if(dl==NULL)

{

dl=r;

p=r;

}

else

{

p->n=r;

p=r;

}

}

//максимальный по модулю элемент

p=dl;

int MAX=dl->val;

while((p->n)!=NULL)

{

p=p->n;

if(abc(p->val)>abc(MAX)) MAX=p->val;

}

cout<<"n";

printf("MAX element= |%d|",MAX);


//добавление нового элемента за МАХ

p=dl;

while((p->n)!=NULL)

{

p=p->n;

if(p->val==MAX)

{

r=new ND;

r->n=p->n;

r->val=-MAX;

p->n=r;

}

}


//исключить первый элемент списка

p=dl;

dl=dl->n;

delete (p);


//новый список


p=dl;

cout<<"nspisokn";

while(p!=NULL)

{

cout<<p->val<<"t";

p=p->n;

}

cerr<<" ";

}


Задача 3

Создать связанный числовой список типа очередь из 5 объектов. Распечатать его. Выполнить следующие операции со связанным списком:

а) добавить два новых объекта в очередь. Распечатать очередь;

б) поменять местами первый и последний объект в очереди. Распечатать очередь;

в) удалить из очереди первых три объекта. Распечатать очередь.

*/


#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#include <stdlib.h>


struct elem {

int inf;

struct elem *link;

} *begq=NULL, *endq=NULL;


void addel(int val)

{

struct elem *p= new struct elem;

p->inf=val;

p->link=NULL;

if(endq==NULL) begq=p;

else endq->link=p;

endq=p;

}


int getdelel(void)

{

struct elem *p;

int temp;

temp=begq->inf;

p=begq;

begq=p->link;

if(begq==NULL) endq=NULL;

delete p;

return temp;

}


void output(struct elem *p)

{

if (p==NULL)

{

printf("nEND");

return;

}

printf("tinf=%i",p->inf);


output(p->link);

}


void main(void)

{


int mas[]={10,20,30,1,2,3};

for (int i=0;i<sizeof(mas)/sizeof(mas[0]);i++) addel(mas[i]);

output(begq);


int number;

while (1)

{

printf("n 1 - добавить два новых объекта в очередь");

printf("n 2 - поменять местами первый и последний объект в очереди");

printf("n 3 - удалить из очереди первых три объекта");

printf("n 4 - Exit");

while (1)

{

printf("n Menu:");

scanf("%d",&number);

if(number>0&&number<5) break;

printf("n Error menu");

while (getchar()!='n');

}

switch (number)

{

case 1:

{

//а) добавить два новых объекта в очередь. Распечатать очередь;


scanf("%d",&number);

addel(number);

scanf("%d",&number);

addel(number);

break;

}


case 2:

{

//б) поменять местами первый и последний объект в очереди. Распечатать очередь;

int temp = getdelel();

int endelement= endq->inf;

while (begq->inf != endelement) addel(getdelel());

addel(temp);

break;

}

case 3:

{

//в) удалить из очереди первых три объекта. Распечатать очередь.

for (i=0;i<2;i++) getdelel();

break;

}


case 4: exit(0); break;

default: exit(0);

}


printf("nnew spisokn");

output(begq);

cerr<<" ";

getch();

}

}


/*

struct cell* input(void)

{

struct cell *p;

p=(struct cell *)malloc(sizeof(struct cell));

printf("Sign=");

scanf("%s",& p->sign);

printf("Weight=");

scanf("%d",& p->weight);

if(p->weight==0)

{

free(p);

return NULL;

}

p->pc=input();

return p;

}


Задача 4

Создать связанный числовой список типа стек из 5 объектов. Распечатать его. Выполнить следующие операции со связанным списком:

а) добавить два новых объекта в стек. Распечатать стек;

б) поменять местами первый и последний объект в стека. Распечатать стек;

в) удалить из стека первых три объекта. Распечатать стек.


15


/*

struct list

{

int value;

struct list *next;

};

list *hear=NULL;

int count=0;


//void show


void show(struct cell *p)

{

if (p==NULL)

{

printf("nEND");

return;

}

printf("nadress=%ptvalue=%d",p,p->value);

output(p->pc);

}


void add_head (long value)

{

count++;

list *old_head=head;

head=(struct list *)malloc(sizeof(struct list));

head->next=old_old_head;

head->value=value;

}


void insert (int pos,long value)

{

list *target;

list *old_next;

int i=0;

if(head!=NULL)

{

target=head;

while((i<pos)&&(target!=NULL))

{

target=target->next;

i++;

}

if(i!=pos) return;

old_next=target->next;

target=target->next=(struct list *)malloc(sizeof(struct list));

target->value=value;

target->next=old_next;

count+;

}

else

{

target=head=(struct list *)malloc(sizeof(struct list));

target->next=NULL;

target->value=value;

count+;

}

}


void delete_any (int pos)

{

if(pos<0) return;

list *previous;

int i=0;

if(head!=NULL)

{

if(pos==0)

{

list *next_item=head->next;

free(head);

head=next_item;

}

else

{

previous=head;

pos--;

while((i<pos)&&(previous!=NULL))

{

previous=previous->next;

i++;

}

if(i!=pos) return;

list *next_item=previous->next->next;

free(previous->next);

previous->next=next_item;

}

}

*/


16