Программирование на языках высокого уровня 3
СОДЕРЖАНИЕ: Программирование на языках высокого уровня ч2 Лабораторная №1 Задача 1 Составить программу на языке С/С++, содержащую: - объявления и инициализацию указателей на различные типы объектов:Программирование на языках высокого уровня ч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 с помощью указателя
coutEu\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\nCeleron\tCeleron-proc\tCeleron-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; //указатель на объект вещественного типа
coutA\t(void*)char_\tint_\tfloat_\n;
coutA\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;i7;i++) cout*(px+i)\t;
coutpch\n;
for(i=3;i=0;i--) cout*(pch1+i)\t;
cout\n;
for(i=0;i4;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,\0};
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;i3;i++)
for (int j=0;j2;j++)
{
cout\n;
for(int k=0;k4;k++)
{
sum+=*(*(*(C+i)+j)+k);
cout*(*(*(C+i)+j)+k)\t;
}
}
cout\nsum;
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 (f0) 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=%s\tweight=%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 x0?x:-x;}
void main(void)
{
int d[100]={1,2,300,-4,-50,6,7},L=7;
int max = 0;
//максимальный по модулю элемент
for (int i=0;iL;i++)
if(abc(d[i])abc(d[max])) max=i;
printf(MAX element= |%d|,d[max]);
//добавление нового элемента за МАХ элеме
for (int j=L-1; jmax; j--)
d[j+1]=d[j];
d[max+1]=-d[max]; L++;
//исключить первый элемент списка
for (j=0; jL; j++)
d[j]=d[j+1];
L--;
//новый список
cout\n;
for (i=0;iL;i++) coutd[i]\t;
cerr ;
}
Задача 2
Создать связанный числовой список. Распечатать его. Выполнить следующие операции со связанным списком:
а) найти максимальный по модулю элемент;
б) вставить за ним новый элемент, равный по величине, но противоположный по знаку;
в) исключить первый элемент списка. Новый список распечатать.
*/
#include stdio.h
#include conio.h
#include iostream.h
int abc (int x) {return x0?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;isizeof(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\nspisok\n;
while(p!=NULL)
{
coutp-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;isizeof(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(number0number5) 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;i2;i++) getdelel();
break;
}
case 4: exit(0); break;
default: exit(0);
}
printf(\nnew spisok\n);
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=%p\tvalue=%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((ipos)(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(pos0) 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((ipos)(previous!=NULL))
{
previous=previous-next;
i++;
}
if(i!=pos) return;
list *next_item=previous-next-next;
free(previous-next);
previous-next=next_item;
}
}
*/
16