Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

forum.0day.kiev.ua _ Программирование _ не могу справиться с задачей по С++

Автор: maxdam Jan 15 2016, 18:27

Нужно вводить с клавиатуры числа до тех пор, пока они равны предыдущему введенному, если число уже не равно, цикл завершается.
Определить количество таких элементов последовательности. - считаем счетчиком.
Условный оператор не использовать. - if не использовать.
--
конструкция...

int n = 0, t = 0, i = 0, k = 0;
while (i == t)
{

cin >> n;
i = n;
t = n;
k++;
}
cout << "Количество попыток: " << k << endl;

--

мозг сломал уже себе на этой задаче, она и последняя из всех заданных!

Натолкните где поток мысли пошел в неправильное направление.

Автор: Криса Jan 15 2016, 20:20

(maxdam @ Jan 15 2016, 18:27) Перейти к цитате

cin >> n;
i = n;


убыточная последовательность действий - можно обойтись без лишней переменной "i" и записать 1 строкой.

(maxdam @ Jan 15 2016, 18:27) Перейти к цитате

int n = 0, t = 0, i = 0, k = 0;
while (i == t)
{

cin >> n;
i = n;
t = n;

k++;
}
cout << "Количество попыток: " << k << endl;



Так, думаю, выхода из цикла не будет никогда.

Автор: грик Jan 15 2016, 20:31


int n = 0, i = 0, k = -1;
cin >> n;
do
{
  k++;
  i = n;
  cin >> n;
} while (i == n)
cout << "Количество попыток: " << k << endl;

Автор: Carnifex Jan 15 2016, 20:33

int i = 0;
int n = 0;
int k = 1;
i = Console.ReadKey().KeyChar;
n = Console.ReadKey().KeyChar;
while (i == n)
{
i = n;
n= Console.ReadKey().KeyChar;
k++;
}
Console.WriteLine("Попытки {0}", k);
Console.ReadLine();

Автор: Phaust Jan 15 2016, 20:38

Скопируй текст задачи как он в оригинале

Автор: maxdam Jan 15 2016, 22:03

Оригинал задачи:
Дана последовательность целых чисел a1, a2, a3 ,..., an, в начале которой записано несколько равных между собой элементов.
Определить количество таких элементов последовательности. Условный оператор не использовать.


только while и логика...

Автор: грик Jan 15 2016, 22:09

(maxdam @ Jan 15 2016, 22:03) Перейти к цитате

Оригинал задачи:
Дана последовательность целых чисел a1, a2, a3 ,..., an, в начале которой записано несколько равных между собой элементов.
Определить количество таких элементов последовательности. Условный оператор не использовать.

Это совсем другая задача, чем написано в первом посте.

Автор: maxdam Jan 15 2016, 22:12

(грик @ Jan 15 2016, 22:09) Перейти к цитате

Это совсем другая задача, чем написано в первом посте.


Мне сегодня преподаватель так объяснил эту задачу!
Только while{} использовать.. do.. while и for еще нельзя..

Автор: грик Jan 15 2016, 22:15

(maxdam @ Jan 15 2016, 22:12) Перейти к цитате

Мне сегодня преподаватель так объяснил эту задачу!

Ну я рад, но про ввод там ничего не написано, а написано про массив целых чисел, который дан. Если так, как в первом посте, то решение я написал выше.

(maxdam @ Jan 15 2016, 22:12) Перейти к цитате

Только while{} использовать.. do.. while и for еще нельзя..

Тогда так, как написал человек после меня, но переделай на плюсы.

Автор: maxdam Jan 15 2016, 22:17

Console.ReadKey().KeyChar; - это я так понимаю cin >> ?

Автор: грик Jan 15 2016, 22:18

(maxdam @ Jan 15 2016, 22:17) Перейти к цитате

Console.ReadKey().KeyChar; - это я так понимаю cin >> ?

Нет, но пиши cin.

Автор: maxdam Jan 15 2016, 22:19

int i = 0;
    int n = 0;
    int k = 1;
    cin >> i;
    cin >> n;
    while (i == n)
    {
        i = n;
        cin >> n;
        k++;
    }
    
    cout << "Количество попыток: " << k << endl;



пошел разбирать что я накосячил..

Автор: Carnifex Jan 15 2016, 22:55

Console.ReadKey().KeyChar; - это я так понимаю cin >> ?

Сорри что язык не твой. Аналогию ты понял правильно. Просто создавать проект под 10 строчек я не хотел, написал там где было открыто...

Автор: Pylorama Jan 15 2016, 23:09

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: Like Jan 15 2016, 23:25

(maxdam @ Jan 15 2016, 18:27) Перейти к цитате
мозг сломал уже себе на этой задаче, она и последняя из всех заданных!
А предыдущие какие?

Автор: Phaust Jan 16 2016, 0:39

С вводом с клавиатуры то ересь какая то. Или преподаватель задачу придумал не сам, но стырил и сам толком не понял.
Моя идея такая:
1. Отсортрировать(например через std::qsort или подобное)
2. Один проход по упорядоченому масиву найти элементы попадающиеся более одного раза
Итого сложность будет n*log(n) всего лишь

Автор: maxdam Jan 16 2016, 0:55

(Like @ Jan 15 2016, 23:25) Перейти к цитате

А предыдущие какие?


вот например писавши эту задачу я написал непроизвольно на условие: вводишь подряд 2 значения и завершается ...

    int n = 1, i = 0, k = 0;
    while (!(n == i))
    {
        
        i = n;
        cin >> n;
        k++;
        
    }

    cout << "Количество попыток: " << k << endl;

Автор: Pylorama Jan 16 2016, 1:10

(Phaust @ Jan 16 2016, 0:39) Перейти к цитате

С вводом с клавиатуры то ересь какая то. Или преподаватель задачу придумал не сам, но стырил и сам толком не понял.
Моя идея такая:
1. Отсортрировать(например через std::qsort или подобное)
2. Один проход по упорядоченому масиву найти элементы попадающиеся более одного раза
Итого сложность будет n*log(n) всего лишь

Насправді це всього лиш проста як двері https://books.google.com.ua/books?id=Kb8QeZyuRnsC&pg=PA66&lpg=PA66&dq=%D0%94%D0%B0%D0%BD%D0%B0+%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C+%D1%86%D0%B5%D0%BB%D1%8B%D1%85+%D1%87%D0%B8%D1%81%D0%B5%D0%BB+%D0%B2+%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9+%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%BE+%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE&source=bl&ots=rtGPreDfHu&sig=3mUsd7C9oPrg8yooG3T1DlczGVA&hl=ru&sa=X&ved=0ahUKEwjW0dei86zKAhUDlSwKHfBeDccQ6AEIHTAB#v=onepage&q=%D0%94%D0%B0%D0%BD%D0%B0%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D1%86%D0%B5%D0%BB%D1%8B%D1%85%20%D1%87%D0%B8%D1%81%D0%B5%D0%BB%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%BE%20%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE&f=false для вивчення азів роботи з циклами.
http://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html
PS: сортувати не треба. Максимум один прохід - складність N.

Автор: Like Jan 16 2016, 1:35

Код выше после первого ввода заходит в цикл, ждёт ещё один ввод цифры и выходит, гордо выставляя счетчик на 1, типо, совпало.
Цифры могут быть одинаковыми или разными.

Автор: Phaust Jan 16 2016, 1:35

В общем виде для N элементной последовательности без ограничений на данные O(N) решения нет

Автор: Like Jan 16 2016, 1:45

К тому же, здесь в коде сравниваются пары чисел, а не их последовательность.
Насколько я понял, мы забиваем ряд чисел и счетчик должен показать сколько раз числа совпали, а цикл быть бесконечным. Тут же программа отрабатывает два ввода значений и завершается.
Причем не закциклишь наскоком в мейн, поскольку за счет инициализации второй переменной значением первой мы каждый раз в цикл будем встревать, а счётчик от этого тикать.

Недавно попадалась задачка похожего плана, если склероз не подкачает попробую вспомнить.
Но не ночь глядя.

Автор: Pylorama Jan 16 2016, 4:13

(Phaust @ Jan 16 2016, 1:35) Перейти к цитате

В общем виде для N элементной последовательности без ограничений на данные O(N) решения нет

1. Можна припустити, що на початку є декілька послідовно розташованих однакових елементів і потрібно порахувати їх кількість. Тоді достатньо пройтись по послідовності до зустрічі з першим інакшим елементом. Кількість ітерацій у найгіршому випадку (усі елементи однакові) становитиме N.
2. Можна припустити, що на початку є декілька послідовно розташованих однакових елементів і потрібно порахувати кількість елементів рівних першому у всій послідовності. Якщо послідовність: 3 3 2 1 3 5, як сортування допоможе O_o.gif Без умовного оператора то буде страшний монстр Франкенштейна.

А можна не парити собі мізки.

Автор: Like Jan 16 2016, 10:39

Цикл бесконечный, счетчик реагирует на все случаи, когда новое введенное число равно предыдущему.
Для выхода из цикла по совпадению адаптируйте под себя.

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

ЗЫ Хотя задачка и позволяет разобраться с функционалом отдельного инструмента, но все-равно из категории "у вас есть 5 передач и 4 колеса, но пользоваться вам можно только передачей заднего хода и только одной парой из колес по вашему усмотрению". Это при всех то возможностях с++ на минуточку.

Автор: dimich Jan 16 2016, 10:46

(maxdam @ Jan 15 2016, 18:27) Перейти к цитате

int n = 0, t = 0, i = 0, k = 0;
while (i == t)
{

cin >> n;
i = n;
t = n;
k++;
}
cout << "Количество попыток: " << k << endl;


Подсказка: переменные i и t должны вводиться в цикле с клавиатуры. А n тебе вообще не нужна. Под спойлером решение.
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: maxdam Jan 16 2016, 13:45

(dimich @ Jan 16 2016, 10:46) Перейти к цитате

Подсказка: переменные i и t должны вводиться в цикле с клавиатуры. А n тебе вообще не нужна. Под спойлером решение.
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «



Мысля крутилась в приблизительно правильном направлении...
два ввода.. сравнение - правда - ввод - сравнение...

Автор: Carnifex Jan 16 2016, 17:58

while (true && i !=0)

Не делай так больше wink.gif Это все равно что написать: ПОКА(true ИЛИ true ИЛИ false) - зачем два раза писать true...

Автор: Like Jan 16 2016, 18:23

Спасибо, поправил.
Оно хоть и не мешает, но там лишнее.

Автор: Pylorama Jan 16 2016, 21:24

(dimich @ Jan 16 2016, 10:46) Перейти к цитате

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


шось зовсім не працює. абсолютно

Автор: maxdam Jan 17 2016, 1:32

(Pylorama @ Jan 16 2016, 21:24) Перейти к цитате

шось зовсім не працює. абсолютно


працює

Автор: Pylorama Jan 17 2016, 12:57

(maxdam @ Jan 17 2016, 1:32) Перейти к цитате

працює

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Автор: maxdam Jan 17 2016, 13:08

Я думал у тебя код не запускается..

Кстати да ....

Автор: Carnifex Jan 17 2016, 19:01

шось зовсім не працює. абсолютно

Просто старые значения не сохраняются. Цепочки нет. Сравнивается каждое первое с каждым вторым и все. Пока не попадешь в пару разных чисел - цикл не закончится. Как по мне, так внутри цикла стоит делать только одну оперцию считывания из консоли. Все останое вынести в начальное заполнение.

Автор: Phaust Jan 17 2016, 22:09

Я не могу это читать.

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: Pylorama Jan 18 2016, 0:40

Open in new window

Автор: dimich Jan 18 2016, 8:26

(maxdam @ Jan 17 2016, 13:08) Перейти к цитате

Я думал у тебя код не запускается..

Кстати да ....


Под этим "Определить количество таких элементов" я понял определить количество одинаковых пар чисел.

Автор: Garry89 Jan 28 2016, 21:23

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: Bartimeus Feb 10 2016, 16:11

Коллеги, читайте внимательно условие задачи.

Оригинал задачи:
Дана последовательность целых чисел a1, a2, a3 ,..., an, в начале которой записано несколько равных между собой элементов.
Определить количество таких элементов последовательности. Условный оператор не использовать.


Тоесть у нас на вход есть масив, все что нам нухно это узнать количество одинаковых элементов в начале последовалельности. Тоесть по факту у нас есть случай 1111134967, и я должен почитать количество единиц в начале и вывести его. Если даже заморочится вводом для проверки то будет что-то вроде отдельной функции


int arraySize = 0;
int counter = 0;
cout<<"Input array size"
cin>>arraySize;
int inputedArray[arraySize];

while(counter<arraySize) {
    cin>>inputedArray[couner]
}

Это даст нам начально заполненый масив в соответствии с условием, далее нам необходимо проверить сколько начальных элементов из него иквалы, тоесть


int firstElement = inputedArray[0];
int result = 1; //так как один элемент у нас точно есть начальным

while((result<inputedArray.size)&&(firstElement==inputedArray[result])) {
    result++;
}
return result;

Можно сделать отдельных 2 метода, но где то так, как итог на выходе будем видеть количество елементов что задваиваются в начале, так же генерацию масива можно сделать рендомайзом. Сори если ошибки в синтаксисе, компилятора нет под рукой а на С писал очень давно..)

Автор: maxdam Feb 12 2016, 21:49

Вот новая задачка...
В зрительном зале 25 рядов, в каждом из которых 36 мест (кресел).
Информация о проданных билетах хранится в двумерном массиве, номера строк которого соответствуют номерам рядов, а номера столбцов - номерам мест. Если билет на то или иное место продан, то соответствующий элемент массива имеет значение 1, в противном случае - 0. Составить программу, определяющую число проданных билетов на места в 12-м ряду.

Вопрос: Как правильно сравнить значение в элементе if ((i == zapros) && (a[i][j] == 1))?

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: Like Feb 12 2016, 23:40

Два сообщения, одно с практическим аспектом и побуждает интерес разбираться, второе - желание послать тему куда подальше. Это ж занятие какое интересное, в цифрах сухих копаться...

Автор: maxdam Feb 13 2016, 0:40

a[i][j] = rand() % 2;

Найдена ошибка, снимаю вопрос ((

Автор: Rut Aug 16 2016, 2:04

условный оператор не использовать...
ниче шо while, for и do это тоже условные операторы? crazy.gif
или имеется ввиду только if не использовать, а например while в качестве if можно? gy.gif

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


(Pylorama @ Jan 16 2016, 2:10) Перейти к цитате

Насправді це всього лиш проста як двері https://books.google.com.ua/books?id=Kb8QeZyuRnsC&pg=PA66&lpg=PA66&dq=%D0%94%D0%B0%D0%BD%D0%B0+%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C+%D1%86%D0%B5%D0%BB%D1%8B%D1%85+%D1%87%D0%B8%D1%81%D0%B5%D0%BB+%D0%B2+%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9+%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%BE+%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE&source=bl&ots=rtGPreDfHu&sig=3mUsd7C9oPrg8yooG3T1DlczGVA&hl=ru&sa=X&ved=0ahUKEwjW0dei86zKAhUDlSwKHfBeDccQ6AEIHTAB#v=onepage&q=%D0%94%D0%B0%D0%BD%D0%B0%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D1%86%D0%B5%D0%BB%D1%8B%D1%85%20%D1%87%D0%B8%D1%81%D0%B5%D0%BB%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%BE%20%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE&f=false для вивчення азів роботи з циклами.
http://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html
PS: сортувати не треба. Максимум один прохід - складність N.

забавная книжица
1. В каких случаях используются операторы цикла с условием?

И внезапный! ответ от Рута - во всех rofl.gif кроме случаев когда требуется бесконечный цикл crazy.gif

Автор: Sawjkee Jun 14 2018, 0:57

(maxdam @ Jan 15 2016, 21:03) Перейти к цитате

Оригинал задачи:
Дана последовательность целых чисел a1, a2, a3 ,..., an, в начале которой записано несколько равных между собой элементов.
Определить количество таких элементов последовательности. Условный оператор не использовать.
только while и логика...


При условии что массив будет не пустой:

int[] arr = {8, 8, 8, 8, 6, 5, 9};
int count = 1;
int firstElement = arr[count - 1];
while (count < arr.length && firstElement == arr[count]) {
count++;
}
System.out.println(count);

Invision Power Board
© Invision Power Services