Форум программистов, компьютерный форум CyberForum.ru

Программа на рекурсию - Перестановка ! - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Функции языка с++ и считывание данных в массив http://www.cyberforum.ru/cpp-beginners/thread328992.html
Помогите найти ошибку в решении задачки на функции с++ и хранение данных в массиве. Программа должна запрашивать ввод данных (счета при какой-то игре) и сохранять их в массив, после чего считать средний результат. Счет данных и подсчет среднего значения должны управляться отдельными функциями. Максимальное кол-во данных - 10. У пользователя должна быть возможность прерывать ввод данных при вводе...
C++ Пмогите допилить програмку #include <iostream> using namespace std; int main() { struct list { int data; list *next; list *prev; }; list *cur=0; http://www.cyberforum.ru/cpp-beginners/thread328976.html
C++ Форматирование тексту + ошибки + лишнее
Вот задача + решение // xz.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using std::cout; using std::cin; using std::endl;
Функции языка с++ C++
Пожалуйста не поленитесь, прочитайте всё и помогите :) . Заранее СПАСИБО! Разработайте функцию calculate(), принимающую два значения типа double и указатель на функцию, которая принимает в качестве аргументов два значения типа double и возвращает значение типа double. Функция calculate() также должна иметь тип double. Она должна возвращать значение, вычисляемое функцией, на которую указывает...
C++ Считывание файла http://www.cyberforum.ru/cpp-beginners/thread328917.html
Как можно считать из файла строку 110011, как массив чисел, заранее спасибо!
C++ пожалуйста сделайте На заводе выпускается несколько наименований деталей. Сведение о деталях включают код детали, количество выпущенных деталей, номер месяца выпуска. Вывести информацию о продукции, выпущенной заданным цехом за последний месяц!!!!!!!!!!!!!!!!!!!!!!!!!! пожалуйста сделайте умоляю (((((((((((((((((((((НА Vizual C++ подробнее

Показать сообщение отдельно
Пират-Ромка
Сообщений: n/a
03.07.2011, 12:41     Программа на рекурсию - Перестановка !
Спасибо ребятки, сейчас я все ваши варианта проработаю. Заранее скажу, что вариант с #define N 8 делал уже сам, он был компактнее, но это не подходит, так как в условии сказано что данные могут быть любые входные, то есть одна и та же программа должна обрабатывать и строку 123 и строку УПЯЧКА выводя в первом случае 6 перестановок, а во втором 720 )

Компилятор кстати GCC ну он разве что на длину long long влияет, но всё таки для информации
И , о да, никакие левые файлы для чтения - записи не должны существовать.
То есть сухой ввод с клавиатуры и сухой вывод перестановок - каждая с новой строки

Добавлено через 13 минут
xAtom
хороший вариант, но вместо инициализации символьного массива при объявлении хотел бы увидеть, что-то вроде
int i;
char str[8];
for (i=0;i<8;i++)
{
scanf("%c",str[i]);
if (str[i]=='\n') break;
}

Ввод через аргумент, это я как понимаю при запуске через консоль вводить ? Запуск с параметром для этой задачи нежелателен, правильнее было сделать чтобы массив записывался через scanf

Добавлено через 1 час 48 минут
Переработал все ваши варианты. Ну через аргументы - это не подходило. Взял короче ваши функции и переделал слегка main для ввода через scanf. Вот что получилось :

Код
#include <stdio.h>
#include <stdlib.h>

void swap(char * a, char * b)
{
    char t = *a;
    *a = *b;
    *b = t;
}

void reverse(char * first, char * last)
{
    for (; first != last && first != --last; ++first)
        swap(first, last);
}

int next_perm(char * first, char * last)
{
    char * p = first;
    if (p == last) return 0;

    ++p;
    if (p == last) return 0;

    p = last;
    --p;

    for (;;)
    {
        char * q = p;
        --p;

        if (*p < *q)
        {
            char * r = last;
            while(!(*p < *--r))
                ;

            swap(p, r);
            reverse(q, last);
            return 1;
        }

        if (p == first)
        {
            reverse(first, last);
            return 0;
        }
    }
}

int char_comp(void const * a, void const * b)
{
    return *((char const *) a) - *((char const *) b);
}

void print_perms(char * first, char * last)
{
    qsort(first, last - first, 1, char_comp);

    do
    {
        puts(first);
    } while (next_perm(first, last));
}

int main()
{
    char str[8] = "12345678";
    int i=0;
    while (1)
    {
        scanf("%c",&str[i]);
        if (str[i]=='\n')
        {
            str[i]='\0';
            break;
        }
        i++;
    }
    print_perms(str, str + i);
}
Тему можно закрывать !
 
Текущее время: 14:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru