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

Лабораторная по массивам - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
17.11.2011, 23:41     Лабораторная по массивам #1
Здравствуйте. Нам задали лаб. работу по массивам, даже не знаю как должен выглядеть код программы.. Помогите...
Условие:
Пользователь вводит число с плавающей точкой (меньше 10 элементов)
Вывести на экран номер ошибки.
ошибка №1 - В числе не одна точка
ошибка №2 - В числе присутствуют символы, не являющиеся цифрами.
Например:
Я ввожу 6.454.543? мне должно вывести на экран "ошибка №1" и т.д.
Помогитее =(((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2011, 23:41     Лабораторная по массивам
Посмотрите здесь:

По массивам... C++
Лабораторная по массивам C++
Вопросы по массивам C++
Подскажите по массивам C++
Учебник по массивам C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
17.11.2011, 23:51     Лабораторная по массивам #2
Цитата Сообщение от b0n4b Посмотреть сообщение
Помогитее =(((
"Спасение утопающих - дело рук самих утопающих".
Расскажите ваши мысли по поводу задачи. Абстрагируйтесь от программирования и продумайте логически, как бы вы решили эту задачу, используя элементарные действия. Лучше всего, если вы по пунктам распишите для себя логику всей задачи, дабы иметь представление о том, что Вам собственно говоря нужно будет делать.
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 00:04  [ТС]     Лабораторная по массивам #3
Может быть моя логика покажется Вам бредом, но я бы сделал так:
Из введенного числа "выбросил" символы ".", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0".
Потом рассматривал бы символы, которые остались.
Если бы там присутствовали символы не являющимися цифрами, то вывел бы номер соответствующей ошибки.
Только я не знаю как верны ли мои рассуждения.
Так же мне не хватает навыков и умений, чтобы написать код.
amor1k
Студент
 Аватар для amor1k
147 / 147 / 24
Регистрация: 18.01.2011
Сообщений: 469
18.11.2011, 00:08     Лабораторная по массивам #4
есть такой вариант, как делать через строки и проверять каждый элемент, то ли на буквы, то ли на точки
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 00:10  [ТС]     Лабораторная по массивам #5
А как сделать, чтобы введённое число разложить на строки?
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
18.11.2011, 00:12     Лабораторная по массивам #6
Цитата Сообщение от b0n4b Посмотреть сообщение
Может быть моя логика покажется Вам бредом, но я бы сделал так
Будьте смелее и не стесняйтесь в рассуждениях, мыслях и любознательности. Я нахожусь здесь отнюдь не для того, чтобы как-то вас оскорблять или что-то подобное.
Итак, давайте подумаем над Вашим вариантом. Вы выбросите из числа точки и все цифры. Как вы думаете можно ли тогда выполнить первое задание "Ошибка №1 - В числе не одна точка". Ведь у нас совсем не останется точек для проверки на данную ошибку, не так ли?
amor1k
Студент
 Аватар для amor1k
147 / 147 / 24
Регистрация: 18.01.2011
Сообщений: 469
18.11.2011, 00:12     Лабораторная по массивам #7
например...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
using namespace std;
 
void main()
{
    setlocale(LC_CTYPE, "rus");
    char s[80];
    cin >> s;
    int k = 0;
    for(int i = 0; i < strlen(s); i++)
    {
        if(s[i] == '.')
            k++;
        if(k == 2)
        {
            cout << "Ошибка №1";
            break;
        }
        if(!(s[i] >= '0' && s[i] <= '9') && s[i] != '.')
            cout << "Ошибка №2";
    }
}
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
18.11.2011, 00:33     Лабораторная по массивам #8
вот ещё вариант
достаточно неуклюжий
C++
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
#include <iostream>
#include <cctype>
 
int main()
{
        const int arraySize = 10;
        char massiv[arraySize] = { 0 };
        int point = 0;
 
        bool gate = true;
 
        std::cin >> massiv;
 
        for(int i = 0; i < arraySize; i++)
        {
                if(isalpha(massiv[i]) && massiv[i] != '.')
                {
                        std::cout << "Ошибка №2 - В числе присутствуют символы, не являющиеся цифрами.";
                        gate = false;
 
                }
                if(massiv[i] == '.')
                {       point++;
                        if(point == 2)
                        {
                                std::cout << "ошибка №1 - В числе не одна точка";
                                gate = false;
                        }
                }
        }
 
        if(gate)
                for(int i = 0; i < arraySize; i++)
                        std::cout << massiv[i];
 
        std::cout << std::endl;
 
        return 0;
}
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
19.11.2011, 23:27  [ТС]     Лабораторная по массивам #9
amor1k, R136a1, а можно ли написать более простой код? Просто многие функции и команды мне не известны, и соответственно не понятны.

greshnikk, Может быть тогда такой алгоритм?
1. Пользователь вводит якобы число с плавающей точкой.
2. Компьютер проверяет, есть ли в этом числе символы, которые не являются числами. Если присутствуют такие символы то это считается ошибкой.
3. Компьютер подсчитывает количество точек (.). Если их более 1, то это считается ошибкой.
4. Компьютер выводит на экран номер ошибки.
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
20.11.2011, 00:17     Лабораторная по массивам #10
Цитата Сообщение от b0n4b Посмотреть сообщение
1. Пользователь вводит якобы число с плавающей точкой.
Возникает вопрос, как конкретно пользователь будет вводить данные ? Ведь в компиляторе не существует типа данных "якобы число с плавающей точкой".
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
20.11.2011, 00:44     Лабораторная по массивам #11
b0n4b, с комментариями яснее?
C++
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
#include <iostream>
#include <cctype>
 
int main()
{
        const int arraySize = 10; // Размер массива
        char massiv[arraySize] = { 0 }; // Заполняем массив нулями
        int point = 0;
 
        bool gate = true;
 
        std::cin >> massiv; // Вводим число
 
        for(int i = 0; i < arraySize; i++) // Проверка на ошибки
        {
                /* isalpha возвращает true если встречается символ, но не точка
                   проверка на ошибку №2
                */
                if(isalpha(massiv[i]) && massiv[i] != '.')
                {
                        std::cout << "Ошибка №2 - В числе присутствуют символы, не являющиеся цифрами.";
                        gate = false;
 
                }
                /* Проверка на ошибку №1
                   Если встречается точка, счетчик point инкрементируется
                   Если point == 2 выводится ошибка
                */  
                if(massiv[i] == '.')
                {       point++; // счетчик точек
                        if(point == 2)
                        {
                                std::cout << "ошибка №1 - В числе не одна точка";
                                gate = false;
                        }
                }
        }
        /* Если ошибок нет, gate = true, массив выводится
           Если ошибки были обнаружены gate = false, цикл пропускается, массив не выводится
        */
        if(gate)
                for(int i = 0; i < arraySize; i++)
                        std::cout << massiv[i];
 
        std::cout << std::endl;
 
        return 0;
}
А лучше напиши что тебе не понятно
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
20.11.2011, 00:52  [ТС]     Лабораторная по массивам #12
Цитата Сообщение от greshnikk Посмотреть сообщение
Возникает вопрос, как конкретно пользователь будет вводить данные ? Ведь в компиляторе не существует типа данных "якобы число с плавающей точкой".
Через массив. В нашем случае это будет к примеру
C++
1
a[10]
Я прав?

Добавлено через 6 минут
R136a1, мне не разу не приходилось иметь дело с таким типом данных как
C++
1
bool
. А так же
C++
1
point
, и ещё некоторые моменты.
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
20.11.2011, 00:57     Лабораторная по массивам #13
Цитата Сообщение от b0n4b Посмотреть сообщение
Через массив.
В языке C++, необходимо объявить тип данных, хранимых в массиве. Просто объявить a[10] нельзя, поскольку неизвестно, сколько отводить под массив памяти, ведь разные типы данных занимают разное количество места. Вопрос остается в силе, какой же тип данных нам следует использовать?
Цитата Сообщение от b0n4b Посмотреть сообщение
мне не разу не приходилось иметь дело с таким типом данных как
C++
1
bool
. А так же
C++
1
point
, и ещё некоторые моменты.
В языке C++ хоть и есть такой тип данных как булевский, но я не рекомендую им пользоваться. Вместо него используют целочисленный тип. Все что не ноль это истина. Соответственно 0 это ложь. Чтоже касается типа данных point, то такого типа данных не существует в языке C++. Но даже, если он и есть, он означает совершенно не то, что нам необходимо.
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
20.11.2011, 01:02  [ТС]     Лабораторная по массивам #14
Ну для начала так объявлю массив.
C++
1
char a[10];
Потом введу число?
C++
1
scanf ("%d", a);
Правда не уверен что так

Долее пойдёт цикл фор
C++
1
for (int i=0; i<10; i++)
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
20.11.2011, 01:10     Лабораторная по массивам #15
Цитата Сообщение от b0n4b Посмотреть сообщение
Ну для начала так объявлю массив.
C++
1
char a[10];
Итак, получается, что вначале пользователь будет вводить не "якобы число с плавающей точкой", а абсолютно любую последовательность символов. И даже не важно, есть в ней цифры или нету. Теперь можно идти дальше по предложенному Вами алгоритму. У меня есть такое предложение - почему бы не объединить пункты 2 и 3. То есть проходя по нашему массиву не по отдельности искать сначала не допустимые символы, затем подсчитывать количество точек, а одновременно смотреть и символы и точки считать. Тем самым будет сокращено время выполнения программы, не так ли ? Ну и на основе результата, уже выводить код ошибки, если необходимо. Логика программы полностью описана:
1. Ввести строку
2. Проверить наличие недопустимых символов и количество символов '.' в строке
3. На основе п. 2 вывести результат (ошибка или же нет ошибки).
Теперь можно приступать к написанию программы, опираясь на описанный алгоритм, подробно, по пунктам реализовывая задачи.

P.S.:, вот только вводить необходимо не число а строку, Вы ведь объявили символьный массив. Следующий код считывает строку и помещает ее в Ваш массив:
C++
1
scanf ("%s", a);
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
20.11.2011, 01:16     Лабораторная по массивам #16
Цитата Сообщение от b0n4b Посмотреть сообщение
Потом введу число?
Код C++
1
scanf ("%d", a);
Правда не уверен что так
Долее пойдёт цикл фор
Код C++
1
for (int i=0; i<10; i++)
C++
1
2
for(int i = 0; i < 10; i++)
   scanf("%c", &a);
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
20.11.2011, 01:18  [ТС]     Лабораторная по массивам #17
greshnikk, спасибо Вам))
Ещё хотелось бы узнать:
1. Как можно проверить наличие каких либо символов в последовательности?
2. Как работает счётчик? И как работать с ним?
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
20.11.2011, 01:24     Лабораторная по массивам #18
Цитата Сообщение от R136a1 Посмотреть сообщение
C++
1
2
for(int i = 0; i < 10; i++)
   scanf("%c", &a);
Вводить по одному символу очень грубо, учитывая, что при этом время алгоритма сохранения введенных данных увеличивается с константного значения до линейного.
Также необходимо указать индекс массива, при занесении значений. Конструкция &a, сама по себе не корректна, так как идентификатор массива является указателем на первый элемент, то есть адресом. А вы еще и пытаетесь записать значение по адресу этого адреса. Если уж решили по 1 символу сохранять, тогда необходимо использовать конструкцию следующего типа:
C++
1
scanf("%c", &a[i]);
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
20.11.2011, 01:26     Лабораторная по массивам #19
b0n4b,

1. в С++ для этого есть функция isalpha(), находится в cctype
2. счетчик это обычная переменная
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2011, 01:31     Лабораторная по массивам
Еще ссылки по теме:

C++ Задача по массивам
C++ по массивам
C++ Задачи по массивам

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
20.11.2011, 01:31     Лабораторная по массивам #20
Цитата Сообщение от b0n4b Посмотреть сообщение
1. Как можно проверить наличие каких либо символов в последовательности?
В цикле проверяем значение, содержащееся в массиве по заданному индексу. То есть
C++
1
if ((a[i] < '0') or (a[i] > '9'))
означает, что необходимо выполнить какие-либо действия, если символ не соответствует цифрам от 0 до 9.

Цитата Сообщение от b0n4b Посмотреть сообщение
2. Как работает счётчик? И как работать с ним?
При объявлении конструкции цикла с предусловием ее реализация выглядит следующим образом: for (начальная инициализация; условие перехода на новую итерацию цикла; действия при окончании очередной итерации цикла)
Например
C++
1
for (int i = 0; i < 10; ++i)
- объявляется переменная, существующая только в данном цикле, которая инициализируется значением 0. После этого проверяется условие и если оно истино, тогда выполняется тело цикла и затем выполняются действия, после прохождения очередной итерации цикла.
Следующий пример выводит на экран цифры от 0 до 9:
C++
1
2
for (int i = 0; i < 10; ++i)
  printf("%i", i);
соответственно, при каждой итерации цикла, значение переменной i, будет увеличиваться на единицу, фактически служа счетчиком, который мы использовали для вывода символов на экран.
Yandex
Объявления
20.11.2011, 01:31     Лабораторная по массивам
Ответ Создать тему
Опции темы

Текущее время: 00:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru