Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Две зада про массивы. одна из них с рекурсивная. 
:(
    Опции темы
ressac
Дата 3.4.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



1) дан массив (char) N-позиций. Нужно инвертировать его тойсть:

Код


было  "live"
стало "evil"



вот моё решение, но мне надо что-то лучше...

решение должно быть обязательно рекурсивным.
Код


void inv (char *cad,int x,int lmt)
{

    char aux=cad[x];

    if(x!=lmt-1)
    {

        inv(cad,x+1,lmt);
        cad[(lmt-1)-x]=aux;

    }
    else
        cad[(lmt-1)-x]=aux;

}



//---------------------------------------------------------------------------------------------------

2) дан массив (int) NxN (матрица) юзер вводит размеры и в потом мы получаем обводы из чисел которые растут ( плюс 1 если ближе к центру ) что-то вроде этого:

Код

например 5х5


 1        1        1        1        1


 1        2        2        2        1


 1        2        3        2        1


 1        2        2        2        1


 1        1        1        1        1


Добавлено через 1 минуту и 31 секунду
модератор исправь название темы smile))) там вместо "ЗАДАЧИ" написано "ЗАДА" smile))
PM MAIL   Вверх
agl
Дата 3.4.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: 3
Всего: 3



1
Код

void rev(char *str, int s, int e)
{
    if(s < e)
    {
        str[s] ^= str[e] ^= str[s] ^= str[e];
        rev(str, ++s, --e);
    }
    
}


Запускаем функцию:
Код

rev(str, 0, strlen(str)-1);


А конкретней, что во второй с рамками ободками делать надо?

Это сообщение отредактировал(а) agl - 3.4.2007, 21:27
PM   Вверх
GIK
Дата 3.4.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Два в одном, шампунь и кондиционер в одном флаконе.
Код

#include<iostream>
#include<cstdio>
#include<conio>
#include <iomanip>
#include <stdlib>

 using namespace std;

void inv(char *ch, int len, int x)
{
   
    if(x<len/2)
    {
        char ran=ch[x];
        ch[x]=ch[len-x-1]; 
        ch[len-x-1]=ran;
        x++;
        inv(ch, len, x);
    }

}

void main(int arg, char *ars){
   int n=7, i, j, g, n2;   
   int matrix[7][7];
   n2=n/2;
   for(g=0; g<n2; g++){
    for(i=g; i<n-g; i++)
     for(j=g; j<n-g; j++)
       matrix[i][j]=g+1;
   }
   for(i=0; i<n; i++){
     for(j=0; j<n; j++)
       cout<<" "<<matrix[i][j]<<" ";
   cout<<endl;
   }
  char ch[21];
  int len;
  cin>>ch;
  len=strlen(ch);
  cout<<len<<endl;
  inv(ch, len, 0);
  cout<<ch;
  getch();
}



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
GIK
Дата 3.4.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



ressac
Цитата

модератор исправь название темы ))) там вместо "ЗАДАЧИ" написано "ЗАДА" )) 

Хорошо хоть ты вторую ошибку не допустил, не написал вместо слова две, два, вот тогда можно было бы ругатся  smile 



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
ressac
Дата 3.4.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



GIK, спасибо, но мне на С надо.

а насчёт ошибки да smile))))... smile 


agl, блин не могу понять как работает твоя рекурсия а именно это

Код

str[s] ^= str[e] ^= str[s] ^= str[e];


smile не мог бы ты объяснить? smile




а на счёт второй

ну вот смотри дана например матрица 3 на 3 

первая обводка должна состоять из "1" вторая  из "2" и тд пока не дойдём до центра, понимаешь?

Код

1  1  1
1  2  1
1  1  1


или
6х4

Код

1 1 1 1 1 1
1 2 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

PM MAIL   Вверх
agl
Дата 3.4.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: 3
Всего: 3



Цитата
не мог бы ты объяснить? 

Обыкновенный обмен данных в двух ячейках строки. Вместо этого кода, можно написать следующий:
Код

char ch = str[s];
str[s] = str[e];
str[e] = ch;


Это сообщение отредактировал(а) agl - 3.4.2007, 22:05
PM   Вверх
GIK
Дата 3.4.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Цитата

или
6х4

Ты ведь вроде указал, что NxN??? 
Если так, то мой алгоритм не подходит рамочной матрицы не подходит....
А на счет того что на Снадо, дак это не проблема переделать, самое главное тебе нужен алгоритм двух задач. 


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
ressac
Дата 3.4.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



agl,  smile  спасиб ;)

вторую понял?

Добавлено @ 22:20
GIK, ну N по идее это не известное smile

Это сообщение отредактировал(а) ressac - 3.4.2007, 22:21
PM MAIL   Вверх
Dov
Дата 3.4.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



1.
Код
void reverse(char* str)
{
    if(*str)
    {
        reverse(str + 1);
        putchar(*str);
    }
}


проверяем:
Код
int main()
{
    reverse("\nqwerty");
    return 0;    
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
ressac
Дата 3.4.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



Dov, это просто пишет на оборот но не меняет местами элементы smile


PM MAIL   Вверх
agl
Дата 3.4.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: 3
Всего: 3



2
Код

#include <stdio.h>
#include <stdlib.h>

void FillMatr(int **matr, int cnt, int n)
{
    int i, j;

    for(i = cnt; i < n - cnt; i++)
        for(j = cnt; j < n - cnt; j++)
            matr[i][j] = cnt+1;
}

void PrintMatr(int **matr, int n)
{
    int i, j;

    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
            printf("%4d", matr[i][j]);
        printf("\n\n");
    }
}
void main(void)
{
    int **matr;
    int n = 0, i = 0;

    printf("Enter the N: ");
    scanf("%d", &n);

    /*Создаем динамический массив*/  
    if((matr = (int**)malloc(n*sizeof(int*))) == NULL)
    {
        printf("No memory!");
        exit(1);
    }

    for(i = 0; i < n; i++)
        if((matr[i] = (int*)malloc(n*sizeof(int))) == NULL)
        {
            printf("No memory!");
            exit(1);
        }

    /*Заполняем массив цифрами в виде рамок*/
    for(i = 0; i < n; i++)
        FillMatr(matr, i, n);
    
    /*Расспечатываем массив*/
    PrintMatr(matr, n);
    
    /*Освобождаем память*/
    for(i = 0; i < n; i++)
        free(matr[i]);
    free(matr);

}


Добавлено через 2 минуты и 48 секунд
Только для квадратной матрицы, чтобы было N*M - надо совсем дрогой алгоритм(обойти матрицу по спирали, или ещё чтонибудь сообразить)

Добавлено через 14 минут и 58 секунд
GIK, твой алгоритм для второй задачи классный, только он работает для матриц с чётным N. Его можно немного подправить?
PM   Вверх
GIK
Дата 4.4.2007, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



agl 
Цитата

GIK, твой алгоритм для второй задачи классный, только он работает для матриц с чётным N. Его можно немного подправить? 

Можно и нужно smile  
Надо просто поменять условие в for(g=0; g<=n2; g++)
А пока буду думаль как организовать такой же алгоритм для не крвадратной матрицы.

  




--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
GIK
Дата 4.4.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 4
Всего: 14



Народ проверте у кого компилер под рукой, должен работать алгоритм заполения не квадратной матрицы. 
Код


void main(int arg, char *ars){
   int n=7, m=8, i, j, g;
int matrix[n][m];
//Для заполнения допустимыми числами, нужно определить минимальный диапазон исходя из меньшей по длине стороны
if(n < m){
    nm= n/2;   
   }
   else{
    nm= m/2;
   } 
   for(g=0; g<=nm; g++){ 
    for(i=g; i<n-g; i++)
     for(j=g; j<m-g; j++) 
       matrix[i][j]=g+1; //заполняются допустимый диапазон чисел, определенный переменной nm
   }
for(i=0; i<n; i++){
     for(j=0; j<m; j++)
       cout<<" "<<matrix[i][j]<<" ";
   cout<<endl;
   }
}

Попробуйте с разными диапазонами.
Кстати решая эту задачу я только сейчас заметил одну вешь, а именно то, что деление нечетного числа в некоторых случаях дают четное число а в некоторых не четное.
К примеру: 
7/2  =3  - не четное число
9/2  =4  - четное число
11/2=5  - не четное число
Но это ни как не влияет на итог решения именно в этой задаче, когда определяетсчя допустимый диапазон чисел. 


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Dov
Дата 4.4.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(ressac @  3.4.2007,  23:02 Найти цитируемый пост)
Dov, это просто пишет на оборот но не меняет местами элементы

Извиняюсь, не доглядел. Тогда так.
Код
void reverse(char* str, int n)
{
    char tmp;
    int i;
    
    if(n <= 1)              
        return;

    tmp = str[0];            
    for(i = 1; i < n; i++)
        str[i - 1] = str[i];     
    str[n - 1] = tmp;           

    reverse(str, n - 1);        
}

int main()
{
    char str[]="qwerty abcdef";
    
    reverse(str, strlen(str));
    puts(str);
    
    return 0;
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
agl
Дата 4.4.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: 3
Всего: 3



Цитата(GIK @ 4.4.2007,  14:58)
Народ проверте у кого компилер под рукой, должен работать алгоритм заполения не квадратной матрицы. 

1 - const int n = 7, m = 8;
2 - ??? n или m, нету nm
Код

     if(n < m)
    {
        nm= n/2;   
     }
     else
     {
        nm= m/2;
      } 


Добавлено через 1 минуту и 33 секунды
да, надо вспомагателные переменные взять, или юзать всё же динамический массив.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.