• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Задачи: Последовательности,функции, массивы, файлы

  • Автор темы Orion4ik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
O

Orion4ik

Вот они:
a. Разработать программу для вывода нп экран компьютера треугольника Паскаля, имеющего N строк. Треугольник строить только в случае, если N – нечетное число.
b. Вычислить значения функции У=(10sin x)/(1+log10(X в квадрате)) , если х изменяется от a до b с шагом h. Результаты получить в виде таблицы.
c. Даны две последовательности A=(ai) , i=1..n, (n,<=10) и В=(bj), j=1..m, (m<=10) целых чисел. Найти максимальную длину последовательности, являющейся подпоследовательностью обеих последовательностей. Количество операций порядка n*k.
d. Задан текстовый файл prog.cpp. Упорядочить (***написать универсальную сортировку для любых типов данных***) слова в строках этого файла по алфавиту, удалив все разделители между словами, слова разделить одним пробелом. Результаты записать в новый файл SortSlova.txt.
 
A

Araneus

А собственные наработки будешь выкладывать?
И еще, чёт я не понял задание №3
 
D

DarkKnight

2 Orion4ik : Хотелось бы увидить Ваши мысли или наработки по данным задачам... Может какие то идеи есть....
P.S. Но по 4 задачи в топе я еще не видел что бы постили...
Сразу вопрос, чем вы в семместре занимались ;-)))

Если честно, вон, хотелось Вас сразу к flashkpi отправить ;-)
Но так как считаю файловый ввод-вывод более менее сложным в понимании с 4ой я Вам помогу...
А вот про остальные хочется сначало увидитить ваш код....

З.Ы. Но может конечно кто-то из постояльцев форума будет более лоялен..
 
D

DarkKnight

d. Задан текстовый файл prog.cpp. Упорядочить (***написать универсальную сортировку для любых типов данных***) слова в строках этого файла по алфавиту, удалив все разделители между словами, слова разделить одним пробелом. Результаты записать в новый файл SortSlova.txt.

C++:
/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>
#include <fstream>
#include <ctype.h>

using namespace std;


void main(void)
{
setlocale(LC_ALL,"Russian"); //Подгрузим локаль

ifstream filein("File.txt"); //Входной файл
ofstream fileout("File2.txt");

char buffer[4096]={0}; //Буферная переменная на считывания строки из файла
char word[1024]={0}; //Буферная переменная для слова
char **Arr; // Динамический массив для слов
int CoutWord = 0; //Счетчик слов

filein.seekg(0,ios::end); //Установим позицию курсора в файле на конец, что бы найти его размер
Arr = new char*[filein.tellg()]; //Выделим память с запасом (как будто каждый символ в файле - это слово)
filein.seekg(0,ios::beg); //Установим курсор в файле в начало, что бы подготивить его для чтения

cout<<"Результат до сортировки :" << endl;
while (!filein.eof()) //Пока не достигнут конец файла
{
filein.getline(buffer,4096); //Читаем построчно
char *ptr = word; //Установим указатель на буферную переменную для слова
for (int i = 0; i<strlen(buffer); i++) //Обойдем полученную строку
{
if (!isspace((unsigned char)buffer[i]) && !ispunct((unsigned char)buffer[i]) && !iscntrl((unsigned char)buffer[i])) //Если нам не встретился символ пробел, знак пунктуации или любой управляющий то
{
*ptr++ = buffer[i]; //Пишим символ в буферную переменную слова и сдвигаем указатель
}
else //Если же все же встретился, то
{
if (strlen(word) != 0) //Проверим не равна ли длина слова 0 (вдруг 2 пробела подряд идут)
{
cout<< word << " ";
Arr[CoutWord] = new char[512]; //Выделим память под слово (макс. длина слова 512 байт)
strncpy(Arr[CoutWord], word, 512); //Скопируем в массив слов наше слово
memset(word,0,1024); //Обнулим память буферной переменной слово
ptr = word; //Установим указатель на начало буферной переменной
CoutWord++; //Увеличиваем счетчик слов
}
}
}
}

//Отсортируем массив слов
for (int i = 0; i<CoutWord; i++) //Обойдем весь массив слов
{
for (int j = i; j<CoutWord; j++) 
{
if (strcmp(Arr[i],Arr[j])>0) //Смысл в том то меняем слова местами если первое слово > предыдущего
{
strcpy(word,Arr[i]);
strcpy(Arr[i],Arr[j]);
strcpy(Arr[j],word);
}
}
}

cout<< endl <<"Результат после сортировки :" << endl;
//Выведим на экран и запишим в файл
for (int i = 0; i<CoutWord; i++)
{
fileout<<Arr[i]<< " "; //пишим в файл
cout<<Arr[i]<< " "; //выводим на экран
delete[] Arr[i]; //Сразу почистим за собой
}
fileout.close(); //Закроем файловые дискрипторы
filein.close();
delete[]Arr; //Удалим массив указателей
}
*Добавил : Я там еще знаки пунктуации убрал, не знаю нужны они или нет по заданию
 

Вложения

  • File.txt
    1,7 КБ · Просмотры: 574
  • File2.txt
    1,7 КБ · Просмотры: 536
  • filesort.jpg
    filesort.jpg
    167,2 КБ · Просмотры: 477
A

Araneus

Пожалуйста, обьясните мне смысл третьей задачи.
Я вообще-то сам еще учусь програмерству, поэтому такие задачи для меня нечто вроде учебного пособия.
первые 2 я сделал без напряга
1.jpg
2.jpg
а вот у третей я не могу понять само условие.
 
D

DarkKnight

а вот у третей я не могу понять само условие.
Там смысл найти максимальную последовательность равных элементов (находящихся в любом месте двух массивов)
тоесть
Массив 1: 1 2 3 4 5
Массив 2: 4 8 1 2 3
Макс последов = 3 (1 2 3)
C++:
#include <iostream>
#include <time.h>

using namespace std;

void main(void)
{
setlocale(LC_ALL,"Russian"); //Установка локали
srand(time(NULL));
int MaxCount = 0; //Кол-во максимальной послед. (в эл.)
int Count = 0; //Текущий счетчик макс. послед.
//Это доп. характеристики не исп. в усл. задачи
int StartElA1 = 0; //Индекс начала послед. в массиве 1
int StartElA2 = 0; //Индекс начала послед. в массиве 2
int StartElA1Res = 0; //Индекс начала максим. послед. в массиве 1
int StartElA2Res = 0; //Индекс начала максим. послед. в массиве 2
int Arr1[10],Arr2[10]; //Наши массивы 

//Заполним массивы рандомно и выведим их на экран
for (int i = 0; i<10; i++)
{
Arr1[i] = rand()%10;
Arr2[i] = rand()%10;
cout<<Arr1[i]<<"\t"<<Arr2[i]<<endl;
}

//Ищим макс. последовательность
for (int i = 0; i<10; i++) //Цикл по кол-ву элементов перебираем позицию
{
for (int j = i; j<10; j++) //Цикл смещения второго массива
{
if (Arr1[j-i] == Arr2[j]) //Проверям равность элементов 
{
if (Count == 0) //Если первое равенство
{
StartElA1 = j-i; //То запишим индексы
StartElA2 = j; 
}
Count++; //Увеличим счетчик
}
else 
{
if (Count > MaxCount) //Если текущее кол-во эл. равной последовательности > MaxCount то перезапишим 
{
MaxCount = Count; //MaxCount
StartElA1Res = StartElA1+1; //И результирующие индексы
StartElA2Res = StartElA2+1;
}
Count = 0;//Обнулим счетчик тек. послед.
}
}
}
//Вывод инфы на экран
cout<< "Максимально совпадающая последовательность : "<< MaxCount<< " чисел"<< endl;
cout<< "Начало этой последовательности в массиве 1: "<< StartElA1Res << endl;
cout<< "Начало этой последовательности в массиве 2: "<< StartElA2Res << endl; 

}
 

Вложения

  • maxposled.jpg
    maxposled.jpg
    19,5 КБ · Просмотры: 501
A

Araneus

А что тогда означает эта фраза?
Количество операций порядка n*k.
Раз уж DarkKnight125 выкладывает коды, то выложу и я свои:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Задача 1</div></div><div class="sp-body"><div class="sp-content">
Код:
//---------------------------------------------------------------------------
/*Разработать программу для вывода нп экран компьютера треугольника Паскаля,
имеющего N строк. Треугольник строить только в случае, если N – нечетное число.
*/
//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------
void main ()
{
int N;
cout<<"Enter the nonpair amount of lines in Pascal's triangle\t";
cin >>N;
for (;(N%2)==0;)
{
clrscr();
cout<<"WRONG AMOUNT!!!!\n";
cout<<"Enter the amount of lines in Pascal's triangle\t";
cin >>N;
}
int** PT = new int*[N];
for (int i = 0; i < N; i++)
{
PT[i]= new int[i+1];
for (int j= 0; j <=i; j++)
{
PT[i][j]=((i==j)||(j==0)?1:(PT[i-1][j-1]+PT[i-1][j]));
}
};
clrscr();
for (int i = 0; i < N; i++)
{
if (i%2==0) {	 for (int k= 0; k <=((N-i)/2); k++) {cout<<"\t";};};
if (i%2==1) {	 for (int k= 0; k <=((N-i)/2-1); k++) {cout<<"\t";};};
for (int j= 0; j <=i; j++)
{
if (i%2==0) {cout<<PT[i][j]<<"\t";};
if (i%2==1) {cout<<"	"<<PT[i][j]<<"\t";};
}
cout<<"\n";
};
getch();
}
//---------------------------------------------------------------------------
и
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">задача 2</div></div><div class="sp-body"><div class="sp-content">
Код:
//---------------------------------------------------------------------------
/*Вычислить значения функции У=(10sin x)/(1+log10(X в квадрате)) , если х
изменяется от a до b с шагом h. Результаты получить в виде таблицы.*/
//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
void main ()
{
float min, max, step;
cout<<"Enter the minimum of calculating interval\t";
cin>>min;
cout<<"\nEnter the maximum of calculating interval\t";
cin>>max;
cout<<"\nEnter calculating step\t";
cin>>step;
cout<<"---------------------------------\n\tX\t|\tY\t\n---------------------------------\n";
for (;min<=max;)
{
cout<<"\t"<<min<<"\t|\t"<<((10*sin(min))/(1+log10(min*min)))<<"\n";
min=min+step;
}
getch();
}
//---------------------------------------------------------------------------
Правда родился еще один вопрос: в задаче с треугольником Паскаля хотелось, чтоб выводилось именно треугольником, в принципе это получилось, и в коде видно как это задавалось, но если рядов больше 15, то из-за большой длины значений всредине строки происходит дополнительный сдвиг, как это можно исправить?
 
O

Orion4ik

Всем спасибо большое! Я вам очемь блашодарен.

Хочу разъеснить ситуацию: У меня проблемы со здоровьем поэтому я очень много времени потерял, когда лежал в больнице, блы на обследованиях, и сдавал анализы. И теперь я отстаю по программе. Если мои одногруппники сейчас уже на 16 дне либерти и прочитали около 100 стр. Димедовича, то я только на 7 дней и прочитал около 40.

Ещё раз очень благодарен за задачи.
 
O

Orion4ik

только небольшая просьба к задаче 1 и 2 добавить описания строк. Если не трудно, а то хотелось бы ещё и вникнуть в код
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!