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

Int main(void){

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

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

char c;

int tot_cnt=0,i,j,n;

memset(cnt,0,sizeof(cnt));//обнуляет массив cnt

while(1){

c=getc(in);

if(feof(in)) break;

if(c=='\n') continue;//игнорируем переводы строки. но если мы этого не хотим, то строчку надо УДАЛИТЬ

cnt[(unsigned)c]++;//символ с встретился еще раз. фиксируем

tot_cnt++;//увеличиваем количество считанных символов на 1

}

j=0;

for(i=0;i<256;i++){//перебираем все 256 символов и записываем в массив а только те, которые встречаются не нулевое число раз

if(cnt[i]==0) continue;

a[j++]=i;

}

n=j;

sort(a,0,n-1);

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

fprintf(out,"%c %d %.2lf\n",a[i],cnt[(unsigned)a[i]],((double)cnt[(unsigned)a[i]])/tot_cnt * 100.0);

return 0;

}

№17. #include <stdio.h>

#include <stdlib.h>

#include <string.h>

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

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

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

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

} node;

typedef struct list{

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

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

} list;

void swap(char s[],char t[]){//поменять местами 2 строки

char buf[MAXS];//вспомогательная переменная

strcpy(buf,s);//копируем в buf s

strcpy(s,t);//в s t

strcpy(t,buf);//в t buf

}

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,char s[]){//добавление элемента в список

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

strcpy(e->s,s);//копирование строчки s в элемент списка

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

}

char is_num16(char s[]){

int x=0,i,n=strlen(s);

if(n>5) return 0;

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

if(s[i]<'0'||s[i]>'9') return 0;//елси s[i] не цифра, то вернуть 0 и прекратить работу функции

else{

x*=10;

x+=s[i]-'0';

}

}

if(x!=0 && s[0]=='0') return 0;//если число не 0, то в начале не должно быть ни одного нуля

if(x==0 && n > 1) return 0;//если число 0 записывается РОВНО одним нулем. 00 - некорректная запись

return x>=0 && x < (1<<16);//16 разрядное число x Е [0,2^16). (1<<16) = 2^16

}

void find_num16(char s[],FILE *out){

int n=strlen(s),i,j;

char *t=(char*)malloc(n+1);//строка, с которой будет хранится текущая подстрока s

//перебираем все построки s

for(i=0;i<n;i++)//начинающиеся с i-го символа

for(j=0;s[i+j];j++){//длины j+1.

t[j]=s[i+j];

t[j+1]=0;//полноценная строка в С должна завершаться 0.

if(is_num16(t)) //если подстрока является 16-ти битным числом без знака - выведем ее.

fprintf(out,"%s\n",t);

else break;//иначе все подстроки, содержащие ее не будут являться дестичными записями таких чисел. прекращаем работу для текущего i

}

}

char s[MAXS];