Массив заполняется числами -858993460 [закрыт]
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.
Закрыт 7 лет назад .
- Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.
- Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Задача состояла в том, что бы в каждой строке матрицы найти произведение чисел между максимальным и минимальным членами, а если нельзя высчитать (рядом стоят) — то вывести 0.
#include "stdafx.h" #include "math.h" #include "iostream" using namespace std; int main() < int k, l; int mas[12][14]; cout > l; l = 2; cout > k; k = 2; //+++++++++Ввод эл массива for (int i = 0; i < k; i++) < for (int j = 0; j < l; j++) < cin >> mas[k][l]; > > //OOOOOOOOOOOOOOOOOOOOOOOO for (int i = 0; i < k; i++)/1 итерация на 1ну строку на экране int min = mas[i][1]; //мин и макс элементы int max = mas[i][1]; // int minN = 1; //Номера мин и int maxN = 1; //макс элементов int proiz = 1; for (int j = 0; j < l; j++) < //сканирование на минимальные члены в строке(в l) if (min > mas[i][j]) < min = mas[i][j]; minN = j; >if (max < mas[i][j]) < max = mas[i][j]; maxN = j; >> for (int g = 0; g < l; g++) < cout //вывод строки cout 1) < //условие, при которм произведение существует if (minN < maxN) < for (int y = minN+1; y < maxN; y++) < //вычисление произведения proiz *= mas[i][y];>> else for (int y = maxN+1; y < minN; y++) < proiz *= mas[i][y]; >//тоже вычисление произведения > else < proiz = 0; >//0 cout return 0; >
Visual C++ 6. Руководство Разработчика [rus]
Рис. 3.11. Помечанная стрелкой строка программного кода, содержащая ошибку Продолжение отладки После того как вы внесли исправления, программа готова к новой попытке построить исполняемый файл. Перейдите в меню Project и вновь выберите команду RebuildAll. На рис. 3.12 показано обновленное окно сообщений. 41
Рис.3.12. Окно сообщений во время третьей попытки построить исполняемый файл Теперь обнаруживаем, что та же строка, которая содержала некорректное имя функции (Printf()),заключает в себе еще одну ошибку. В C/C++ все строковые значения должны браться в двойные кавычки. Значит, в нашем случае открывающие кавычки в функции printf () следует поставить сразу после открывающей круглой скобки, т.е. строка должна начинаться следующим образом: printf(«. Сохраните файл и попытайтесь еще раз построить программу. Как выглядит окно сообщений после очередного обновления, показано на рис. 3.13. 42
Рис. 3.13. Окно сообщений во время четвертой попытки построить исполняемый файл На этот раз выдается такое сообщение об ошибке: syntax error: missing ‘;’before ‘)’ В C/C++, в отличие от Pascal, символ точки с запятой используется для обозначения окончания выражения, а не в качестве разделителя. Таким образом, в конце второй проверки в цикле for необходимо ввести точку с запятой. После исправления сохраните файл и вновь выполните команду RebuildAll. Все в порядке? Судя по окну сообщений, у компилятора нет больше претензий к вашей программе, и команда RebuildAll успешно сгенерировала исполняемый файл ERROR.EXE. 43
В окне сообщений должны отсутствовать сообщения об ошибках, но присутствовать одно предупреждение, которое можно проигнорировать. Если это не так, значит, вы допустили ошибки при вводе программы. Проверьте программный код и исправьте его. Запуск программы Чтобы запустить программу, просто выберите в меню Project команду Execute. Если в ответ на запрос программы Would you like to continue(Y/N) вы нажмете клавишу [Y], а затем [Enter], на экране отобразится следующее: -858993460 0 -858993460 -858993460 -858993460 -858993460 -858993460 Welcome to a trace demonstration! Would you like to continue (Y/N)у На рис. 3.14 показано, что произойдет далее. Рис. 3.14. Сообщение об ошибке выполнения программы Использование встроенного отладчика Созданная нами программа в начале своей работы отображает на экране исходное содержимое массива данных, после чего спрашивает, хотите ли вы продолжить работу. Ответ Y (yes— да) сигнализирует о том, что вы хотите заполнить массив собственными данными и отобразить их на экране. Из рис. 3.14 можно сделать вывод о том, что хотя программный код набран совершенно правильно, т.е. в нем нет синтаксических ошибок, программа работает не так, как нам бы хотелось. Ошибки такого рода называются логическими. К счастью, встроенный в VisualC++ отладчик содержит ряд средств, которые послужат для вас спасательным кругом в подобной ситуации. Во-первых, вы можете выполнять программу пошагово, строка за строкой. Вовторых, вам предоставляется возможность анализировать значения переменных в любой момент выполнения программы. Разница между командами StepInto и StepOver Когда вы начинаете процесс отладки, появляется панель инструментов Debug. Из множества представленных на ней кнопок наиболее часто задействуются StepInto (четвертая справа в верхнем ряду) и StepOver(третья справа). В обоих случаях программа будет запущена на выполнение в пошаговом режиме, а в тексте программы выделяется та строка, которая сейчас будет выполнена. Различия между командами StepInto и StepOver проявляются только тогда, когда в программе встречается вызов функции. Если выбрать команду StepInto, то отладчик войдет в функцию и начнет выполнять шаг за шагом все ее операторы. При выборе команды StepOver отладчик выполнит функцию как единое целое и перейдет к строке, следующей за вызовом функции. Эту команду удобно применять в тех случаях, когда в программе делается обращение к стандартной функции или созданной вами подпрограмме, которая уже была протестирована. Давайте выполним пошаговую отладку нашей программы.
Как видно из рис. 3.15, в окне редактирования появилась стрелка (ее называют индикатором трассировки), указывающая на строку программы, которая будет выполнена на следующем шаге. В данный момент она указывает на функцию print_them(). Рис. 3.15. Окно редактирования после того, как трижды была выполнена команда StepInto или StepOver Имеет смысл выполнить эту функцию как одно целое. Для этого выберем команду StepOver. Функция будет выполнена, и индикатор трассировки укажет на первый вызов функции printf(). Теперь три раза нажмите клавишу [F10], пока стрелка не остановится напротив функции scanf(). В этот момент вам нужно перейти в окно программы и в ответ на приглашение Would you like to continue(Y/N) ввести Y и нажать [Enter] (рис. 3.16). Сразу после этого на экране появится сообщение об ошибке (рис. 3.17). Это сообщение было сгенерировано программой после попытки выполнит функцию scanf(). Давайте попытаемся разобраться, в чем, собственно, состоит проблема.
Рис. 3.16. Введите «Y» и нажмите [Enter], чтобы продолжить выполнение программы Рис. 3.17. Отладчик сообщает об ошибке в программе Ошибка связана с некорректным использованием функции scanf() . Функция scanf () ожидает указания адреса ячейки памяти для заполнения. Рассмотрим такое выражение: scanf(«%C», continu); Как видите, здесь указывается не адрес переменной, а сама переменная. Чтобы указать адрес, нужно поместить оператор взятия адреса (&) перед continu. Внесите исправления в выражение, чтобы оно выглядело следующим образом: scanf(«%C», &continu); Сохраните файл и вновь выберите команду RebuildAll. Дополнительные средства отладки Вы, очевидно, слышали о точках останова, которые применяются в программе при необходимости прервать ее выполнение в определенных местах. Смысл использования точек останова состоит в том, что отладчик не тратит времени на пошаговое выполнение программы вплоть до указанной точки, по достижении которой переходит в пошаговый режим. Точки останова проще всего расставлять с помощью кнопки Breakpoint (первая справа) панели инструментов Build. Для этого достаточно установить курсор на нужной строке программы и щелкнуть на указанной кнопке. Если же выделенная строка уже содержит точку останова, то после щелчка на кнопке Breakpoint она, точка останова, будет удалена. При выборе команды Go программа будет выполняться от текущего местоположения курсора до ближайшей точки останова. Обратимся к нашей программе. Мы знаем, что все строки программы до вызова функции scanf() отлично работают. Чтобы не тратить время на пошаговое выполнение всех строк, 46
которые уже были проверены ранее, поставим точку останова на 20-й строке, содержащей вызов функции scanf(). Имеется и другой способ задания точек останова — с помощью диалогового окна Breakpoints (рис. 3.18), вызываемого командой Breakpoints. из меню Edit. По умолчанию при щелчке на кнопке со стрелкой открывается контекстное меню, в котором первым пунктом указывается команда создания точки останова на той строке, где в данный момент в окне редактирования находится курсор. В нашем случае это строка 20. Рис. 3.18. Задание точки останова Работа с точками останова Предположим, что вы поставили точку останова в строке программы, содержащей вызов функции scanf<). Теперь выберите команду Go— либо из меню, либо нажав клавишу [F5]. Обратите внимание, что выполнение программы прерывается не на первой строке программы, а на строке, содержащей точку останова. Далее можно продолжить выполнение программы в пошаговом режиме либо проанализировать текущие значения переменных. Нас интересует, будет ли функция scanf() работать корректно после того, как в программный код были внесены изменения. Выберите команду StepOver, перейдите к окну программы, введите букву Y в верхнем регистре и нажмите клавишу [Enter]. (Мы применили команду StepOver для того, чтобы избежать пошагового анализа отладчиком всех операторов функции scanf(). При выборе команды StepIn появляется предложение указать местонахождение файла SCANF.C) Все отлично! Отладчик не выдал окна с сообщением об ошибке. Но означает ли это, что все проблемы разрешены? Чтобы ответить на этот вопрос, достаточно будет проанализировать текущее значение переменной continu. Окно QuickWatch Команда QuickWatch. открывает диалоговое окно QuickWatch(рис. 3.19), которое позволяет по ходу выполнения программы анализировать значения переменных. Простейший способ определить значение переменной с помощью данного окна состоит в том, что курсор помещается на имени переменной в окне редактирования, а затем нажимается комбинация клавиш [Shift+F9]. Проделайте указанную операцию с переменной continu.
Рис. 3.19. Диалоговое окно QuickWatch Теперь, когда мы определили, что переменная continu имеет правильное значение, можно продолжить выполнение программы до конца, выбрав в меню Debug команду Go(рис. 3.20). Рис. 3.20. Исправленная версия программы 48
Глава 4. Введение в С и C++ • Из истории языка С o Отличия С от других ранних языков высокого уровня o Достоинства языка С o Недостатки языка С o Язык С — не для любителей! • Стандарт ANSI С • Переход от С к C++ и объектно-ориентированному программированию • Из истории языка C++ o Эффективность объектно-ориентированного подхода o Незаметные различия между С и C++ o Ключевые различия между С и C++ • Основные компоненты программ на языках C/C++ o Простейшая программа на языке С o Простейшая программа на языке C++ o Получение данных от пользователя в языке С o Получение данных от пользователя в языке C++ o Файловый ввод-вывод Знакомство с языками программирования С и C++ мы начнем с истории. Узнать историю появления языков С и C++ будет полезно, поскольку так нам легче будет понять концепции, положенные в основу этих языков, а также ответить на вопрос, почему С на протяжении вот уже ряда десятилетий остается столь популярным среди программистов, а его более молодой «родственник» C++ не уступает ему по популярности. Приводимые далее примеры можно набирать и запускать в среде MicrosoftVisualC++. Подразумевается, что в предыдущей главе вы научились выполнять элементарные операции по компиляции и отладке программ. Из истории языка С Наше исследование происхождения языка С начнется с операционной системы UNIX, поскольку она сама и большинство программ для нее написаны на С. Тем не менее, это не означает, что С предназначен исключительно для UNIX. Благодаря популярности UNIX язык С был признан в среде программистов как язык системного программирования, который можно использовать для написания компиляторов и операционных систем. В то же время он удобен для создания многих прикладных программ. Операционная система UNIX была разработана в 1969 г. на маломощном, по современным представлениям, компьютере DEC PDP-7 в компании BellLaboratories, город Мюррей Хилл, штат Нью-Джерси. Система была полностью написана на языке ассемблера для PDP-7 и претендовала на звание «дружественной для программистов», поскольку содержала довольно мощный набор инструментов разработки и являлась достаточно открытой средой. Вскоре после создания UNIX Кен Томпсон (KenThompson) написал компилятор нового языка В. С этого момента мы можем начать отслеживать историю языка С, поскольку язык В Кена Томпсона был непосредственным его предшественником. Рассмотрим родословную языка С: Algol 60 Разработан международным комитетом в 1960 г.
CPL | Combined Programming Language — комбинированный язык программирования. Разработан в 1963 г. | |
группой программистов из Кембриджского и Лондонского университетов | ||
BCPL | BasicCombinedProgrammingLanguage — базовый комбинированный язык программирования. | |
Разработан в Кембридже Мартином Ричардсом (MartinRichards) в 1967 г. | ||
В | Разработан в 1970 | г. Кеном Томпсоном, компания BellLabs |
С | Разработан в 1972 | г. Деннисом Ритчи (DennisRitchie), компания BellLabs |
Позже, в 1983 г., при Американском институте национальных стандартов (American National Standards Institute — ANSI) был создан специальный комитет с целью стандартизации языка С, в результате чего был разработан стандарт ANSI С. Язык Algol 60 появился всего на пару лет позже языка FORTRAN. Это был значительно более мощный язык, который во многом предопределил пути дальнейшего развития большинства последующих языков программирования. Его создатели уделили много внимания логической целостности синтаксиса команд и модульной структуре программ, с чем, собственно, впоследствии и ассоциировались все языки высокого уровня. К сожалению, Algol 60 не стал популярным в США. Многие считают, что причиной тому была определенная абстрактность этого языка. Разработчики языка CPL попытались приблизить «возвышенный» Algol 60 к реалиям конкретных компьютеров. Тем не менее, данный язык остался таким же трудным для изучения и практического применения, как и Algol 60, что предопределило его судьбу. В наследство от CPL остался язык BCPL, представляющий собой упрощенную версию CPL, сохранившую лишь основные его функции. Когда Кен Томпсон взялся за разработку языка В для ранней версии UNIX, он попытался еще больше упростить язык CPL. И действительно, ему удалось создать довольно интересный язык, который эффективно работал на том оборудовании, для которого был спроектирован. Однако языки В и BCPL, очевидно, были упрощены больше, чем нужно. Их использование было ограничено решением весьма специфических задач. Например, когда Кен Томпсон закончил создание языка В, появился новый компьютер PDP-11. Система UNIX и компилятор языка В были сразу же модернизированы под новую машину. Хотя PDP-11 был, несомненно, мощнее, чем его предшественник PDP-7, возможности этого компьютера оставались все еще слишком скромными по сравнению а современными стандартами. Он имел только 24 Кб оперативной памяти, из которых 16 Кб отводились операционной системе, и 512 Кб на жестком диске. Возникла идея переписать UNIX на языке В. Но В работал слишком медленно, поскольку оставался языком интерпретирующего типа. Была и другая проблема: язык В ориентировался на работу со словами, тогда как компьютер PDP-11 оперировал байтами. Стала очевидной необходимость усовершенствования языка В. Работа над более совершенной версией, которую назвали языком С, началась в 1971 г. Деннис Ритчи, который известен как создатель языка С, частично восстановил независимость языка от конкретного оборудования, что было во многом утеряно в языках BCPL и В. Так, были успешно введены в практику типы данных и в то же время сохранена возможность прямого доступа к оборудованию — идея, заложенная еще в языке СPL. Многие языки программирования, разработанные отдельными авторами (С, Pascal, Lisp и APL), отличались большей целостностью, чем те, над которыми трудились группы разработчиков (Ada, PL/I и Algol 60). Кроме того, для языков, разработанных одним автором, характерна большая специализированность в решении тех вопросов, в которых автор разбирался лучше всего. Деннис Ритчи был признанным специалистом в области системного программирования, а именно: языков программирования, операционных систем и генераторов программ. Учитывая профессиональную направленность автора, нетрудно понять, почему С был признан прежде всего разработчиками системных программ. Язык С представлял собой язык программирования относительно низкого уровня, что позволяло контролировать каждую мелочь в работе алгоритма и достигать максимальной эффективности. Но в то же время в С заложены принципы языка высокого уровня, что позволяло избежать зависимости программ от особенностей архитектуры конкретного компьютера. Это повышало эффективность процесса программирования. Отличия С от других ранних языков высокого уровня Вам, конечно, интересно узнать, какое место занимает С в ряду других языков программирования. Чтобы ответить на этот вопрос, рассмотрим примерную иерархию языков, показанную на рис. 4.1, где точками представлены промежуточные этапы развития. К примеру,
Вывод результата -858993460
Вывод 858993460 вместо числа
Программа поиска простых множителей,вместо первой цифры выводит 858993460,после выводит остальные.
Почему при запуске выдает:-858993460
#include "pch.h" #include <iostream> #include<string> using namespace std; class test
Неинициализированая переменная принимает значение -858993460
Здравствуйте форумчане. Есть проблема. Имеется код: #include <iostream> #include <vector>.
Вывод результата
Как вывести результат этой программы в excel, чтобы , то что было в черном окошке , выводилось еще.
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
Takymi, if-ы, наверное, должны быть в цикле Такое число выводится потому что выход за границу введенных данных в массиве происходит, т.к. i = n после цикла. Да и массив тут не нужен, сразу складывайте в цикле.
Регистрация: 27.09.2016
Сообщений: 14
shvyrevvg ,спасибо огромное!Ты мне очень сильно помог , там действительно было нужно if-ы поместить в цикл , а что-то проворонил этот момент и закрыл цикл раньше)Кстати,можешь подсказать как подсчитать кол-во серий повторяющихся элементов , например :00 ,11 и тп.
Буду в двойне благодарен)
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
Сообщение от Takymi
Кстати,можешь подсказать как подсчитать кол-во серий повторяющихся элементов , например :00 ,11 и тп.
Буду в двойне благодарен)
Точнее можешь сформулировать, что на входе должно быть, а что на выходе? Если на входе 1, 2, 2, 3, 5, 2, 6, 5, то на выходе получаем 2? (три двойки и две пятерки)
Регистрация: 27.09.2016
Сообщений: 14
shvyrevvg , рассчитать кол-во серий нулевых элементов(серией считается последовательность , содержащую минимум два элемента , 00-1 серия 001200-2 серии и тд.)
Я набросал такую ветвь , но она как-то не очень работает
1 2 3 4
if ((arr[i]=0&&arr[i+1])) { count1++; }
Опять же буду рад помощи)
Регистрация: 07.09.2013
Сообщений: 63
1 2 3
series = 0; if (a[i] == 0 && a[i + 1] == 0) series++;
Регистрация: 27.09.2016
Сообщений: 14
na1l, у меня так же , но всё равно к сожалению выводит 0 серий нулевых элементов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#include #include #include #include #include #define MAX_N 100 int main() { setlocale(LC_ALL, "rus"); int n; int sum = 0,count=0, count1 = 0; printf("Введите кол-во элементов массива\n"); { scanf("%d", &n); } int arr[MAX_N]; int i; for (i = 0; i n; i++) { printf("[%d]", i + 1); scanf("%d", &arr[i]); if (arr[i] 0) { sum += arr[i]; } if (arr[i] % 2 != 0) { count++; } if ((arr[i]==0 && arr[i+1]==0)) { count1++; } } printf("Кол-во нечётных:"); printf("%d", count); printf("\n"); printf("Кол-во серий нулевых элементов:"); printf("%d", count1); printf("\n"); printf("Сумма отрицательных:"); printf("%d", sum); printf("\n"); system("pause"); return 0; }
собственно сам код , может при его полном виде , будет легче найти ошибку
Заранее благодарен)
может от count1 нужно заменить на series;но вроде бы это не должно менять суть , это же переменная
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
Ты в одном цикле for числа вводишь scanf’oм и сравниваешь if’aми,
с этими двумя if’aми это не проблема
1 2 3 4 5 6 7 8
if (arr[i] 0) { sum += arr[i]; } if (arr[i] % 2 != 0) { count++; }
а вот тут элемента arr[i+1] как такового не существует, для него ты память выделил но в нем находится мусор, вот поэтому у тебя и нули
1 2 3 4
if ((arr[i]==0 && arr[i+1]==0)) { count1++; }
с созданием массива тоже трэш получился, ты его выделяешь память для 100 элементов но потом вводишь сколько элементов из ста ты будешь вводить, если введешь число больше 100 получить ошибку, так как будешь выходить за границы, желательно создавать динамический массив вот так
int *arr = (int*)malloc(n * sizeof(int));
и так же по нему проходить
1 2 3 4 5
for (i = 0; i n; i++) { arr[i] = rand() % 50 - 30;// scanf("%d", &arr[i]); printf("[%d] = %d\n", i + 1, arr[i]); }
C 858993460 что это означает
Здравствуйте, уважаемые программисты! Приходилось ли Вам копаться в «мусоре»? Мне приходилось.
Началось всё с того, как мне захотелось написать собственную реализацию strcat() и strlen() (разумеется в собственном пространстве имён) и я столкнулся с следующей проблемой.
В программе, тестирующей эти функции я объявил три строки:
char str1[80] = "Hallo!"; char str2[] = " How are you?"; char str3[80];
Как видите, первые две строки тут же инициализированы, а третья — нет (она вводится с клавиатуры).
Вот так я реализовал strcat:
void strcat(char* str1, const char* str2)
Вот strlen:
int strlen(const char *str)
Перед определением функций есть прототипы, так что, функции видят друг друга с этим проблем нет.
Для первых двух строк strcat сработала как надо, но когда я применил её к третьей:
strcat(str3, str2);
я узнал, что такое «мусор».
Оказалось, что str3 не содержит ни одного «завершающего нуля»! При объявлении, 3-я строка содержит 80 значений -52, беззнаковое представление которых есть 204 в ASCII это русская ‘M’ или ‘╠’. При в воде в строку str3 n символов (n<80), первые n 'М' заменяются на символы, введённые с клавы, а остальные не меняются! А при инициализации первой строки все "оставшиеся" символы равны 0, поэтому с ним проблем нет. В strcat пришлось дописать
str1[pos] = '\0';
Или нужно было объявить str3 как нуль-строку
char str3[80] = "";
Теперь всё работает, но остались вопросы.
Итак, как я понял, значение -52 для char есть ничто иное как «мусор». Эксперимент даёт следующие результаты для «мусора» других типов:
char: -52 ‘М’ | short: -13108 | int: -858993460 | float: -107374176. | doule: -9.2559631349317831e+061 |
Как я понял здесь int и double расширяются до long-значений, т.к. для long и long double «мусор» идентичен соответствующим значениям для int и double.
Внимание! Bопросы:
1) Почему «мусор», который как я читал и считал должен иметь неопределённый результат имеет вполне определённые отрицательные значения?
2) Почему они именно такие?
3) Зависят ли эти значения от модели процессора, компилятора ОС или ещё чего?
Очень надеюсь на ответы. Заранее благодарен.
Последний раз редактировалось Haric_110; 06.08.2014 в 18:29 .