Търсене на числа от поредица

автор: Веселин Димитров

Програмата е създадена с цел намирането на числа от поредица такива, които са по-големи от сбора на всички предхождащи го числа. Програмата позволява да се четат числа както от клавиатурата, така и от файл, посочен от потребителя. Управлението на програма става чрез специално създадено меню. При избиране на опция се предоставя възможност за изпълнението й. При избор за въвеждане на числа от клавиатурата  програмата изписва надпис за готовност. Въвеждането на букви не е позволено на това място. Отделните числа се разделят с шпация, а за край на въвеждането служи знакът за нов ред. Няма ограничение в броя на въвежданите числа.

При избор за четене от файл потребителя трябва да посочи името на файла. Той трябва да бъде в директорията на изпълнимия файл (програмата). Форматът е както при четене от клавиатурата, с разликата, че числата могат да бъдат и на различни редове. При избор за търсене програмата търси сред последно въведените стойности числата, които са по-големи от предхождащите ги. При намирането на такива се извеждат на екрана. Добавена е и възможност за сортиране на числата.

Функции, използвани в програмата

Namфункция без входни параметри и не връща резултат. Използва динамичния масив. Обхожда се и при намерено число, което е по-голямо от сумата на предходните, се извежда на програмата.
Izveфункция без входни параметри. Извежда последователно всички въведени числа (т.е. тези, които са в масива). При опит за извеждане на празен масив връща 1 (сигнал за грешка, обработвана на по-горно ниво). При успех извежда 0.
Vkluchфункция за включване на елемент в масива. Елемента го получава като входен аргумент от по-горно ниво. Ако е първи елемент в масива, го инициализира, а ако не – отделя памет за още един елемент. При грешка връща 1 (сигнал за грешка ) и функцията прекъсва функцията си. Ако е заделена памет, се включва елемента и връща 0 (сигнал за успех)
Sort - без входно – изходни параметри. Сортира елементите на масива по метода на пряката селекция.
Klavфункция без входни параметри. Използва се за въвеждането на числа. При извикването и се чете символ по символ от клавиатурата. Ако е цифра се извежда на екрана и се обработва за текущото въвеждано число. При срещането на шпация се извиква функцията vkluch с параметър текущото число. Ако функцията върне 1 се запаметява. Функцията продължава до прочитането на символ за нов ред. Ако всичко е минало добре, връща 0, а ако не (функцията vkluch е върнала 1), то връща 1.
Failфункция за четене на числа от файл. При извикването се пита потребителя за името на файла, който се отваря. При грешка връща 1. самото четене е по същия начин като четенето от клавиатурата, с единствената разлика, че се чете от файла.
Menuфункция без входно – изходни параметри. Използва се за извеждането на екрана на възможностите за избор от потребителя.
Menu_i функция, която обработва заявките на потребителя. Използва за входен параметър символ и в зависимост от това какъв е, извиква съответната функция да обработи заявката. При грешка в обработването се извежда съобщение (различно при всяка функция). Не връща резултат.
Главна функция – изчиства екрана от предишни съобщения. Извиква функцията menu да изведе възможните опции и чака реакцията на потребителя. При натискане на бутон от клавиатурата проверява дали е символ между ‘1’ и ‘6’ и ако е  извиква функцията menu_i с входен параметър съответния символ. Ако въведения символ не е между 1 и 6, то се дава възможност да повторно въвеждане. Програмата се изпълнява до натискане на символа ‘6′ (символа за изход).

Код на програмата

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//#include <io.h>
int i,i1,*a;
void nam()
{
int b;
for (i1=1,b=a[0];i1<i;i1++)
{
if (a[i1]>b) {printf(“%d “,a[i1]);}
b+=a[i1];
}
}

int izve()
{
if (a!=NULL)
{
for (i1=0;i1<i;i1++)
{
printf(“%d “,a[i1]);
}
printf(“\n”);
return 0;
}
return 1;
}

int vkluch(int x)
{
int *a1;
if (a==NULL) {a=(int*)malloc(sizeof(int));i=1;}
else {a1=a;
i++;
a=(int*)realloc(a,sizeof(int)*i);
if (a1!=a){free(a1);}
}
if (a==NULL) {return 1;}
a[i-1]=x;
return 0;
}

void sort()
{
int k,k1,k2;
for (k=0;k<i;k++)
{for (k1=k;k1<i;k1++)
{if (a[k1]<a[k])
{k2=a[k1];
a[k1]=a[k];
a[k]=k2;
}//if
}//for k1
}//for k
}//krai funkciq

int klav()
{
char c=’a';
int f=0,f1=0,f2=0,f3=0;
if (a!=NULL)
{
free(a);
i=0;
}
printf(“gotovnost za vuvejdane:\n”);
while (c!=’\r’)
{
c=getch();
if ((c<=’9′)&&(c>=’0′))
{f=f*10+atoi(&c);
f3=1;
putc(c,stdout);
}
if (c==’ ‘) {putc(c,stdout);}
if (((c==’\r’)||(c==’ ‘))&&(f3!=0)) {f1=vkluch(f);f=0;}//==
if (f1==1) {f2=1;}
}
return f2;
}

int fail()
{
char c1[255];
char c=’a';
int f=0,f1,f2=0,f3=0;
FILE *fa;
if (a!=NULL)
{
free(a);
i=0;
}
printf(“vuvedi ime na fail”);
scanf(“%s”,c1);
fa=fopen(c1,”r”);
if (fa==NULL) {return 1;}
while (!eof(fa))
{
c=fgetc(fa);
if ((c<=’9′)&&(c>=’0′))
{f=f*10+atoi(&c);
f3=1;
}
if ((c==’ ‘)&&(f3!=0)) {f1=vkluch(f);}
if (f1==1) {f2=1;}
if (fa!=NULL) fclose(fa);
}
return f2;
}

void menu()
{
printf(“\n1:chetene ot klaviaturata;\n”
“2:chetene ot fail;\n”
“3:tursene\n”
“4:sortirane\n”
“5:izvejdane na elementite\n”
“6:izhod\n”);
}

void menu_i(char c)
{
int k;
switch(c){
case ‘1′:if(k=klav()!=0) {printf(“greshno vuvejdane!”);break;
case ‘2′:if(k=fail()!=0) {printf(“greshka pri cheteneto!”);break;
case ‘3′:nam();break;
case ‘4′:sort();break;
case ‘5′:if(k=izve()!=0) {printf(“ne sa vuvedeni chisla”);}break;
default: printf(“greshka pri izbora!”);
}
}
}
}

int main()
{
char c;
clrscr();
do{
do
{
menu();
c=getch();
}while((c<’1′)||(c>’6′));
menu_i(c);
}while (c!=’6′);
if (a!=NULL) {free(a);}
return 0;
}

Сходни статии:

  1. Програма за умножение на еднобайтови числа без алгебричен знак Програма за умножение на еднобайтови числа без алгебричен знак Алгоритъм на умножението Нека е дадено множимото 1101 и множителя1001. Алгоритъмът за умножение на десетични и двоични числа е един и...
  2. Програма за събиране на четирибайтови числа с алгебричен знак Програма за събиране на четирибайтови числа с алгебричен знак В следващия пример подпрограмата за обработване на знака е извикана три пъти. При първия път е зададен адресът на първия операнд...
  3. Програма за преобразуване на четирибайтови числа в допълнителен код Програма за преобразуване на четирибайтови числа в допълнителен код Зададеното число се разполага в четири последователни клетки от паметта. И тук е прието най-старшият байт да е с най-малък адрес....
  4. Програма за събиране не еднобайтови BCD числа В тази програма не би трябвало да има нещо особено. Двата операнда се задават в BCD код в клетките 0х0060 0х0061. След това се извършва сумирането им по познатия начин....
  5. Програма за деление на еднобайтови числа Да се разделят две числа означава, да се установи, колко пъти делителя се нанася в делимото. Това може да стане най-просто, като се изважда делителят от делимото циклично и се...

Новини за технологии и джаджи – Актуална информация за най-яките лаптопи, компютри, телфони и фотоапарати
Comments are closed.