Консультация № 177620
03.04.2010, 01:31
0.00 руб.
0 3 1
Уважаемые эксперты, прошу оказать помощь в написании следующих программ:
1)Написать программу, которая вычисляет формулу читая 10 значений Х из файла number.txt : S=x/1!+x/2!+...+x/32!
2)Написать функцию бинар-ного поиска на С++ с использованием потоко-вого ввода/вывода и прог-рамму вызывающую эту функцию.
Прошу уделить внимание еще комментариям к программам.
Заранее спасибо.

Обсуждение

Неизвестный
03.04.2010, 07:43
общий
1) Не надо давать две задачи в одном вопросе.
2) По первой: то есть, нужно 10 раз вычислить выражение?
3) Второй вопрос просто супер: "бинар-ный поиск с использованием потоко-вого ввода/выввода". Это анекдот какой-то. И еще С++ бывает разный. Вам в какой среде нужно писать? И еще еще: С++ отличает от С наличие классов и широкое применение шаблонов. С ними как?
Неизвестный
03.04.2010, 14:37
общий
1) значения Х можно вообще убрать. Так что просто решить уравнение;
2) если это анекдот, то для меня несмешной. Дали такое задание, в котором больше ничего не написано. Писать надо в Borland С v.3.1. Большей информацией не владею=)
Неизвестный
06.04.2010, 19:09
общий
это ответ
Здравствуйте, Xrom1989.
По первой задаче: вычисления производятся для всех найденных в файле Х, файл открывается через поток ifstream, всё должно быть ясно из комментариев.
По второй задаче. У меня была демонстрационная программа с 6-ю видами поиска, в том числе, с бинарным. Выкладываю всю, возможно, пригодится, а если нет - просто удалите лишние методы. Про сам двоичный поиск почитайте здесь.
Удачи!

Приложение:
1 задача
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <fstream>
using namespace std;

//Написать программу, которая вычисляет формулу читая 10 значений Х из файла number.txt : S=x/1!+x/2!+...+x/32!

void main()
{
setlocale (LC_ALL, "russian"); //для отображения русского в консоли
ifstream input ("c:\\in.txt"); //открываем входной файл
double s, x, f; //сумма, х и факториад
int step = 1; //номер шага (по номеру считанного х)
if (!input) { //если файл не открылся - выходим
cout << "Не могу открыть файл c:\\in.txt";
_getch();
}
while (input >> x) { //пока можно считать очередной х
s = x; f = 1; //инициализируем сумму и факториал
for (int i=2; i<=32; i++) { //делаем 32 шага, начиная со 2-го
f*=i; //наращиваем факториал
s = s+x/f; //прибавляем новое значение к сумме
}
cout << "Шаг " << step << " S = " << s << endl; //выводим результат
step++; //наращиваем шаг
}
input.close (); //закрываем файл
_getch(); //ждём реакции пользователя
}

2 задача

#include <string.h>
#include <conio.h>
#define alphsz 27
#include <iostream>
using namespace std;

int LineSearch (int *a, unsigned int n, int k); //линейный поиск
int LineSearchLim (int *a, unsigned int n, int k); //линейный поиск с барьером
int BinarySearch (int *a, unsigned int n, int k); //бинарный (двоичный) поиск
int LineSearchStr (char *str, char *ps); //прямой поиск
void PreWatch (char *ps, int kmp[], int m); //вспомогательная функция для KMP поиска
int KMPSearch (char *str, char *ps); //KMP поиск
int BMSearch (char *str, char *ps); //BM поиск

int LineSearch (int *a, unsigned int n, int k)
{
for (int i=0; i<n; i++)
if (a[i]==k) return i;
return -1;
}
int LineSearchLim (int *a, unsigned int n, int k)
{
int *buf = new int [n+1];
int i;
for (i=0; i<n; i++) buf[i]=a[i];
buf[n]=k;
i=0;
while (buf[i]!=k) i++;
delete [] buf;
if (i!=n) return i; else return -1;
}
int BinarySearch (int *a, unsigned int n, int k) //бинарный поиск в сортированном массиве а размерностью n числа k
{//массив должен быть отсортирован по возрастанию
int h, l, s;
h = 0; l = n-1;
while (!(h>l)) { //рассматриваем массив
s = h + (l-h)/2; //выбираем средний элемент
if (a[s]==k) //если нашли - возвращает индекс
return s;
else if (k<a[s]) //иначе сравниваем с элементом и решаем, какую половину массива рассматривать
l = s-1;
else
h = s+1;
}
return -1;
}
int LineSearchStr (char *str, char *ps)
{
int n = strlen (str);
int m = strlen (ps);
int j;
for (int i=0; i<n; i++)
if (str[i]==ps[0]) {
for (j=1; j<m; j++)
if (str[i+j]!=ps[j]) break;
if (j==m) return i;
}
return -1;
}
void PreWatch (char *ps, int kmp[], int m)
{
int i = 0;
int j = kmp[0] = -1;
while (i<m) {
while (j>-1 && ps[i]!=ps[j])
j = kmp[ j ];
i++;
j++;
if (ps[i]==ps[j]) kmp[i] = kmp[j];
else kmp[i] = j;
}
}
int KMPSearch (char *str, char *ps)
{
int n = strlen (str);
int m = strlen (ps);
int *kmp = new int [m];
PreWatch (ps, kmp, m);
int i=0; int j=0;
while (i<n) {
while (j>-1 && ps[j]!=str[i]) j = kmp[j];
i++;
j++;
if (j>= m)
return i-j;
}
return -1;
}
int BMSearch (char *str, char *ps) //только маленькие латинские буквы
{
int sd [alphsz];
int n = strlen (str);
int m = strlen (ps);
int i, j, k;
for (i=0; i<alphsz; i++) sd[i]=m;
for (i=0; i<m-1; i++) sd[ps[i]-97]=m-i-1;
i = m;
do {
j = m; k = i;
do {
k--; j--;
} while (j>=0 || ps[j]==str[k]);
i+=sd[str[i-1]-97];
} while (j>=0 || i<=n);
if (j<0) return k+1;
else return -1;
}

int _tmain(int argc, _TCHAR* argv[])
{
int *a;
int n, k, l, pos;
char str [255];
char ps [200];
while (true) {
system("cls");
cout << "1. Lineinii poisk\n";
cout << "2. Lineinii poisk s barierom\n";
cout << "3. Dvoichnii poisk (tolko otsortirovannii massiv)\n";
cout << "4. Priamoi poisk v stroke\n";
cout << "5. KMP poisk\n";
cout << "6. BM poisk\n";
cout << "7. Vihod\n";
cin >> k;
if (k==7) break;
if (k<4) {
cout << "\nRazmernost massiva?\n";
cin >> n;
a = new int [n];
cout << "\nElementi?\n";
if (k==3) cout << "Massiv doljen bit otsortirovan po vozrastaniu\n";
for (int i=0; i<n; i++) cin >> a[i];
cout << "\nIskat?\n";
cin >> l;
} else {
cout << "\nStroka (max 255)?\n";
cin >> str;
cout << "\nIskat (max 200)?\n";
cin >> ps;
}
switch (k) {
case 1:
if ((pos=LineSearch (a, n, l))<0)
cout << "\nNet!\n";
else cout << "\nEst: " << pos << "\n";
break;
case 2:
if ((pos=LineSearchLim (a, n, l))<0)
cout << "\nNet!\n";
else cout << "\nEst: " << pos << "\n";
break;
case 3:
if ((pos=BinarySearch (a, n, l))<0)
cout << "\nNet!\n";
else cout << "\nEst: " << pos << "\n";
break;
case 4:
if ((pos=LineSearchStr (str, ps))<0)
cout << "\nNet!\n";
else cout << "\nEst: " << pos << "\n";
break;
case 5:
if ((pos=KMPSearch (str, ps))<0)
cout << "\nNet!\n";
else cout << "\nEst: " << pos << "\n";
break;
case 6:
if ((pos=BMSearch (str, ps))<0)
cout << "\nNet!\n";
else cout << "\nEst: " << pos << "\n";
break;
}
_getch ();
if (k<4) delete [] a;
}
return 0;
}

5
Verena, большое спасибо, особенно за вторую часть. Там все что мне надо для следующих задач=)
Форма ответа