Задача
Выяснить наиболее часто встречаемую начальную букву слов. Построить график расположения начальных букв слов. Вывести таблицу начальных букв слов в файл.
Выбор алгоритма решения задачи
Выбор алгоритма решения задачи был именно таким поскольку, я считаю что он пусть лучше подходит к условию задачи и есть последовательным и универсальным. Также есть легким для чтения и выполнение компилятором.
Описание алгоритма решения задачи
Программа должна считывать из текстового файла все символы (путь к файлу прописывается в самой программе без возможности изменения его пользователем), программа определяет первую букву слов и изменяет соответствующий счетчик. После определения всех начальных букв выводит график по количеству найденных букв, также в программе мается сортировка для более удобного просмотра результата. После окончания всех операций, программа записывает таблицу в файл.
Схема алгоритма решения задачи
Функция scan
Функция main
Описание программы
Функция scan
Эта функция открывает файл для чтения и по строкам считывает символы, после считывания каждого строке она проверяет и находит первые буквы в словах и изменяет соответствующий счетчик на 1. Для того чтобы программа смогла увеличить соответствующий счетчик используется два массива, первый заполненный всеми буквами алфавита (как малыми так и большими) и второй для хранения информации в найденных букв (т.е. счетчиков).
Функция sort
Для более удобного просмотра графику, используется сортировка по трем критериям, а именно: по алфавиту, по росту и по спаданию количества найденных букв.
Функция graf
Эта функция выводит график по количеству найденных букв, она используется после сортировки и дает возможность наглядно увидеть изменение количества букв, а для более детального просмотра слева выводит после соответствующей буквы сам счетчик (т.е. точное количество букв).
Текст программы
stdafx.h
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
const int SYMB=219;
void add(int *sm);
void scan(int *sm, int *kl);
int maxx(int max, int *kl);
void sort(int *sm, int *kl);
void graf(int max, int *sm, int *kl);
void print (int *sm, int *kl);
Func.cpp
#include "stdafx.h"
void add(int *sm)
{
int x;
for (x=0;x<26;x++)
{
sm[x]=65+x;
sm[x+26]=97+x;
}
}
void scan(int *sm, int *kl)
{
char ch[80];
int n,x;
FILE *fp;
if((fp=fopen("D:\TEXT.txt", "r"))==NULL)
{
printf("Nevozmogno otkrit\nRazmestite fail TEXT.txt на диске D:\\");
getch();
exit(1);
}
rewind(fp);
while (!feof(fp))
{
fgets(ch,79,fp);
printf(ch);
for (n=0;n<79;n++)
{
if (n==0 | ch[n-1]==' ')
{
for (x=0;x<52;x++)
{
if (ch[n]==sm[x])
kl[x]++;
}
}
}
for (n=0;n<79;n++) ch[n]=0;
}
cout<<endl;
fclose(fp);
}
int maxx(int max, int *kl)
{
int x;
for (x=0;x<52;x++)
{
if (kl[x]>max)
max=kl[x];
}
return max;
}
void sort(int *sm, int *kl)
{
int i=0,x,a,b;
char ch;
cout<<"Sortirovka po:\n";
cout<<"1. Vozrostaniu\n";
cout<<"2. Ybuvaniu\n";
cout<<"3. Alfavity\n";
ch=getch();
switch (ch)
{
case '1':
a=0;
b=1;
i=1;
break;
case '2':
a=1;
b=0;
i=1;
break;
case '3':
a=b=i=0;
}
while (i==1)
{
i=0;
for (x=0;x<51;x++)
{
if (kl[x+a]>kl[x+b])
{
int y,z;
y=kl[x];
z=sm[x];
kl[x]=kl[x+1];
sm[x]=sm[x+1];
kl[x+1]=y;
sm[x+1]=z;
i=1;
}
}
}
}
void graf(int max, int *sm, int *kl)
{
int x,i=1;
while (max>67)
{
max/=2;
i*=2;
}
for (x=0;x<52;x++)
{
if (kl[x]!=0)
{
int a,b;
printf("%2c = %4d - ",sm[x],kl[x]);
for (a=-1;a<(kl[x]/i);a++)
printf("%c",SYMB);
cout<<endl;
}
}
}
void print (int *sm, int *kl)
{
FILE *fp;
int x;
if((fp=fopen("D:\TEXT - TABL.txt", "w"))==NULL)
{
printf("Nevozmogno otkrit");
getch();
exit(1);
}
fprintf(fp," ------------------\n");
fprintf(fp,"|Simvol|Kolichestvo|\n");
fprintf(fp," ------------------\n");
for (x=1;x<52;x++)
{
if (kl[x]!=0)
{
fprintf(fp,"|%5c | %-9d |\n",sm[x],kl[x]);
}
}
fprintf(fp," ------------------\n");
fclose(fp);
}
Laba4.1.cpp
#include "stdafx.h"
void main()
{
int x,max=0;
int sm[52]={0}, kl[52]={0};
add(sm);
scan(sm,kl);
max=maxx(max,kl);
sort(sm,kl);
cout<<"\n================================================================================\n";
graf(max, sm,kl);
cout<<"\n================================================================================\n";
cout<<"Maksimal'noe kolichestvo simvolov = ";
for (x=0;x<52;x++)
{
if (kl[x]==max)
printf("%c - %d, ",sm[x],kl[x]);
}
print(sm,kl);
getch();
}
Результат работы программы