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

Тема в разделе "C/C++/C#", создана пользователем Orion4ik, 29 ноя 2010.

Статус темы:
Закрыта.
  1. Orion4ik

    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.
     
  2. Araneus

    Araneus Гость

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

    flashkpi Гость

    Пиши, сделаем
    icq: 588002847
    email: flash_1989@ukr.net
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

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

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

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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 КБ
      Просмотров:
      9
    • File2.txt
      Размер файла:
      1,7 КБ
      Просмотров:
      9
    • filesort.jpg
      filesort.jpg
      Размер файла:
      295,9 КБ
      Просмотров:
      58
  6. Araneus

    Araneus Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Там смысл найти максимальную последовательность равных элементов (находящихся в любом месте двух массивов)
    тоесть
    Код (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
      Размер файла:
      34,2 КБ
      Просмотров:
      39
  8. Araneus

    Araneus Гость

    А что тогда означает эта фраза?
    Раз уж 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">
    Код (Text):
    //---------------------------------------------------------------------------
    /*Разработать программу для вывода нп экран компьютера треугольника Паскаля,
    имеющего 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">
    Код (Text):
    //---------------------------------------------------------------------------
    /*Вычислить значения функции У=(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, то из-за большой длины значений всредине строки происходит дополнительный сдвиг, как это можно исправить?
     
  9. Orion4ik

    Orion4ik Гость

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

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

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

    Orion4ik Гость

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

Поделиться этой страницей