Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
задачи на экзамен по эвм.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
53.6 Кб
Скачать

Int main(void){

FILE *in=fopen("input.txt","r");

FILE *out=fopen("output.txt","w");

int n,i;

double *a;

fscanf(in,"%d",&n);

a=(double*)malloc(sizeof(double)*(n));

for(i=0;i<n;i++)

fscanf(in,"%lf",&a[i]);

hsort(a,n);

for(i=0;i<n;i++)

fprintf(out,"%.2lf ",a[i]);

fprintf(out,"\n");

fclose(in);

fclose(out);

return 0;

}

№12. #include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAXL 256//максимальное количество элементов в строке

typedef struct elem{

char s[MAXL];

int x;

} elem;

typedef struct node{//элемент списка

struct node *next,*prev;//следующий и предыдущий элемент

elem val;//данные текущего элемента (в 4 задаче - строчка длины MAXS)

} node;

typedef struct list{

node *head;//выделенный элемент списка

int n;//количество элементов в списке

} list;

void swap(elem *a,elem *b){//поменять местами 2 строки

elem t;

t=(*a);

(*a)=(*b);

(*b)=t;

}

void init(list *lst){//инициализация списка

lst->head=0;//создается пустой список. совсем пустой

lst->n=0;

}

void link(node *u,node *v){//связать элементы списка u и v

u->next=v;

v->prev=u;

}

void ins(list *lst,elem x){//добавление элемента в список

node *e=(node*)malloc(sizeof(node));//выделение памяти под 1(!!) элемент типа "node". никаких массивов здесь нет

e->val=x;

// a->b = (*a).b

if(lst->n==0){//если список пустой

lst->head=e;//выделенный элемент (а других и нет :D) пусть будет равен только что созданному

e->next=e;//закольцовываем список. e<-e->e

e->prev=e;

lst->n++;

return;//завершаем выполнение функции

}

//если в списке естьэлементы, вставляем вновь созданный элемент списка после элемента head

link(lst->head->prev,e);// head->prev -> e

link(e,lst->head);//e -> head

lst->n++;

}

void rotate(list *lst){//перемещение головы списка на позицию вперед

lst->head=lst->head->next;

}

void print(list *lst,FILE *out){

int i;

for(i=0;i < lst->n; rotate(lst),i++){

fprintf(out,"%s\n%d\n\n",lst->head->val.s,lst->head->val.x);//выводим то, что под головой

}

}

void sort(list *lst){//cортировка списка

int i,j,n=lst->n;

node *e;

for(i=0;i<n;rotate(lst),i++){//начинаем двигаться по списку, сдвигая голову n раз

e=lst->head->next;//просматриваем все элементы, начиная со следующего за головой

for(j=1;j<n-i;e=e->next,j++)//все, кроме тех, которые уже были головой

if(e->val.x > lst->head->val.x)//елси там храниться строчка, которая меньше, чем то, что в текущей голове

swap(&e->val,&lst->head->val);//меняем строчки местами

}

}

char buf[MAXL];

Int main(void){

freopen("input.txt","r",stdin);// считывай из файла как из стандартного потока!

FILE *out=fopen("output.txt","w");

elem e;

list lst;

init(&lst);

while(gets(e.s)){

scanf("%d",&e.x);

gets(buf);

ins(&lst,e);

}

sort(&lst);

print(&lst,out);

return 0;

}

№13. #include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAXL 256

#define MAXN 10000

void sort(char* a[],int lt,int rt){

int i=lt,j=rt;

char *x=(char*)malloc(MAXL);

char *t;

t=(char *) malloc(MAXL);

strcpy(x,a[(lt+rt)/2]);

do{

while(strlen(a[i]) < strlen(x)) i++;

while(strlen(a[j]) > strlen(x)) j--;

if(i<=j){

strcpy(t,a[i]);

strcpy(a[i],a[j]);

strcpy(a[j],t);

//когда встретимся (i==j, а этот момент обязвтельно наступит), то удобно сделать i++ и j-- [ключевое слово: обрезать]

i++;j--;

}

}while(i<=j);

if(lt < j) sort(a,lt,j);//сортируем первую половину

if(i < rt) sort(a,i,rt);//сортируем одну половину

//в двух половинах суммарно уже как минимум на 1 элемент меньше!

}

char *s[MAXN];

char buf[MAXL];

char *t[MAXN];

int m;

char bad(char s[]){

int i;

for(i=0;i<m;i++)

if(strstr(s,t[i])) return 1;//если хотя бы одна из строк t[i] входит в s как подстрока, то s плохая

return 0;//иначе она хорошая

}