Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2013, 23:57   #1
BlackTea
Новичок
Джуниор
 
Регистрация: 07.02.2013
Сообщений: 4
Вопрос Решить задачи для С++

Ребята, очень срочно нужно решить две задачи
Буду ооочень благодарен!!!


1. Описать функцию, определяющую индекс первого элемента
целочисленного массива из n элементов, значение которого равно
заданному числу x. Если такого элемента в массиве нет, то считать номер
равным –1.

2. Дан двумерный массив 9х9. Получить последовательность чисел, получающуюся при чтении этого массива по спирали, по часовой стрелке начиная с края массива.

Решить, т.е. составить программный код
(Я работаю на Qt Sdk, но это среда С++)
Просто никак не успеваю, а время поджимает (
BlackTea вне форума Ответить с цитированием
Старый 08.02.2013, 00:37   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

BlackTea

Просто никак не успеваю, а время поджимает

А чем ты таким важным занят, что вместо подготовки и сдачи зачетов рискуешь пополнить ряды вооруженных сил?

Ps. Я, к сожалению, тоже очень сильно занят крайне важным и ответственным делом, поэтому никак не могу отвлечься, ибо надо пройти еще пару уровней...

Rififi вне форума Ответить с цитированием
Старый 08.02.2013, 00:38   #3
BlackTea
Новичок
Джуниор
 
Регистрация: 07.02.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
BlackTea

Просто никак не успеваю, а время поджимает

А чем ты таким важным занят, что вместо подготовки и сдачи зачетов рискуешь пополнить ряды вооруженных сил?

Ps. Я, к сожалению, тоже очень сильно занят крайне важным и ответственным делом, поэтому никак не могу отвлечься, ибо надо пройти еще пару уровней...

хех)
да не, там еще задачи есть
вот их и делаю
BlackTea вне форума Ответить с цитированием
Старый 08.02.2013, 00:40   #4
BlackTea
Новичок
Джуниор
 
Регистрация: 07.02.2013
Сообщений: 4
По умолчанию

Может кто-нибудь хотя бы проверить первую?

#include <iostream>

using namespace std;

int find(int *a, int n, int x) {
for (int c = 0; c < n; ++c) if (a[c] == x) return c;
return -1;
}

int main() {
int a[] = { 1, 5, 2, 4, 3 }, sz = sizeof(a) / sizeof(a[0]);
cout << find(a, sz, 4) << endl << find(a, sz, 0) << endl;
}
BlackTea вне форума Ответить с цитированием
Старый 08.02.2013, 00:46   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

А-а..
ну тогда можно и подмогнуть (:

вот первая на C++

Код:
#include <algorithm>

template <typename T, size_t N>
int index(const T (&arr)[N], T val)
{
    const T* i = std::find(arr, arr + N, val);
    return i == arr + N ? -1 : i - arr;
}
пример использования

int arr[] = {1,2,3,4,5};
int i = index(arr, 5);
i = index(arr, -5);
Rififi вне форума Ответить с цитированием
Старый 08.02.2013, 00:48   #6
BlackTea
Новичок
Джуниор
 
Регистрация: 07.02.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
А-а..
ну тогда можно и подмогнуть (:

вот первая на C++

Код:
#include <algorithm>

template <typename T, size_t N>
int index(const T (&arr)[N], T val)
{
    const T* i = std::find(arr, arr + N, val);
    return i == arr + N ? -1 : i - arr;
}
пример использования

int arr[] = {1,2,3,4,5};
int i = index(arr, 5);
i = index(arr, -5);
Ты понимаешь, что, если я покажу такую задачу - мне никто в жизни не поверит? Слишком это сложновато для тех, кто с++ осваивает первый месяц.

Я на этом форуме вот что нашел http://www.programmersforum.ru/showthread.php?t=158517
Там вроде код проще
Только разница в том, что у него до 10
У меня надо n-значений

Можешь исправить тот код, пожалуйста?
BlackTea вне форума Ответить с цитированием
Старый 08.02.2013, 10:48   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Можешь исправить тот код, пожалуйста?
Зачем? Ваш лучше.
Код:
#include <iostream>

//using namespace std; На самом деле, не очень хорошая привычка включать весь std
//В данном случае я квалифицировал std::cout напрямую, но можно также писать
//using std::cout;
//using std::endl;

//Желательно обозначить, что элементы a мы менять не собираемся
int find(const int *a, int n, int x) { 
  for (int c = 0; c < n; ++c) if (a[c] == x) return c;
  return -1;
}

int main() {
  int a[] = { 1, 5, 2, 4, 3 }, sz = sizeof(a) / sizeof(a[0]);
  std::cout << find(a, sz, 4) << std::endl << find(a, sz, 0) << std::endl;
}

Последний раз редактировалось Abstraction; 08.02.2013 в 10:51.
Abstraction вне форума Ответить с цитированием
Старый 08.02.2013, 11:09   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
2. Дан двумерный массив 9х9. Получить последовательность чисел, получающуюся при чтении этого массива по спирали, по часовой стрелке начиная с края массива.
По сути, нам нужна функция, которая принимает указатель на двумерный массив (как он там у Вас реализован), его размеры (явно через аргумент или через глобальную константу) и индекс от 0 до 80 и возвращает соответствующий элемент при отсчёте "по спирали". Это неоптимально по времени, но задание дурацкое, а такая функция позволяет придать ему подобие смысла. Как вариант:
Код:
int GetSpiralElement(const int** array2D, size_t sz, size_t index){
  size_t ring = 0; //"кольцо" в массиве, которому принадлежит наш элемент
  //Первое кольцо содержит 4*(N-1) элементов, каждое следующее на 4 меньше
  size_t rest;
  for(rest = index; rest>=4*(sz-1-ring); rest-=4*(sz-ring)) ++ring;
  //Теперь выясняем, в какой части кольца находится наш элемент
  if(rest < (sz-1-ring)) return array2D[rest+ring][0+ring];
  rest -= (sz-1-ring);
  if(rest < (sz-1-ring)) return array2D[sz-1-ring][rest+ring];
  rest -= (sz-1-ring);
  if(rest < (sz-1-ring)) return array2D[sz-1-rest-ring][sz-1-ring];
  rest -= (sz-1-ring);
  if(rest < (sz-1-ring)) return array2D[0+ring][sz-1-rest-ring];
  //А сюда мы попасть не должны никогда
  assert(false);
}

//...
for(size_t i=0; i<N*N; ++i) std::cout << GetSpiralElement(a, N, i) << " ";
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решается судьба.. Надо решить две задачи.Мне задачи, вам практика и мое уважение) romichj Общие вопросы C/C++ 3 30.03.2012 00:33
Очень нужно решить задачи для зачета. Будьте любезны) Александро Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 06.01.2010 14:23
решить задачи Марийка Microsoft Office Excel 2 11.10.2009 20:30
Люди помогите решить 3 "простейших" для вас задачи!! Duzen Паскаль, Turbo Pascal, PascalABC.NET 4 01.06.2009 00:53