РефератыИнформатикаПрПрограммирование на языках высокого уровня 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','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;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=in

put();


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

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:1785
Символов:21567
Размер:42.12 Кб.