63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562

Почему функция не возвращает значение?

09.02.2017, 21:46. Показов 5156. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По заданию из учебника, нужно написать небольшую поисковую систему, используя все полученные знания.
Вот написал такую программу, но проблема в том, что функция не возвращает значение.
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
49
50
51
#include <Windows.h>
#include <iostream>
 
    // # 1. Справочная
    char *lib[][2] = {
            "ТОК", " - движежение заряженных частиц.",
            "НАПРЯЖЕНИЕ", " - разность поценциалов",
            "МОЩНОСТЬ", " - произведение тока и напряжения."
            };
 
 
 
    // # 2. Меняет регистр букв.
    void regist (char word[]){
            for (int i(0); i != strlen(word); i++){
            if (word[i] >= 224 && word[i] <= 255 ){
                word[i] -= 32;
            }
        }
    }
 
    // # 3. Поиск нужного слова.
    int searh (char word [], int answer){
 
        for (int i(0); i!=3; i++){
            if (strcmp (lib[i][0], word) == 0){
                answer = i;
                return answer;
            }
        }
    }
 
 
 
         int main (){
 
             setlocale(LC_ALL, "rus");
 
 
             int answer (0);
             char word[128] = "мощность";
                std::cin >> word;
                    regist(word);
                        searh (word, answer);
                            std::cout << word << lib[answer][1] << std::endl;
                
                
 
             system ("pause");
             return 0;
         }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2017, 21:46
Ответы с готовыми решениями:

Почему функция возвращает неправильное значение
Пробовал дебажил функцию и каждый раз проверка проходит условие, хотя оно выполняется... в итоге возвращается false //проверка...

Класс Массив: почему функция возвращает адрес элемента, а не его значение?
подскажите, пожалуйста: почему функция возвращает адрес элемента, а не его значение? template &lt;typename T&gt; T...

Почему функция всегда возвращает 0?
bool trie_tree::consonants_check(char letter) { return tolower(letter) == ('w' || 'r' || 't' || 'p' || 's' || 'd' || 'f' || 'g' || 'h'...

12
Диссидент
Эксперт C
 Аватар для Байт
27712 / 17330 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
09.02.2017, 22:02
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

Цитата Сообщение от Photofenix Посмотреть сообщение
проблема в том, что функция не возвращает значение.
Чтобы функция возвратила значение, надо использовать оператор return.
И, простите за глупый вопрос, что вы хотели здесь сказать?
Цитата Сообщение от Photofenix Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int searh (char word [], int answer){
for (int i(0); i!=3; i++){
* * * * * * if (strcmp (lib[i][0], word) == 0){
* * * * * * * * answer = i;
* * * * * * * * return answer;
* * * * * * }
* * * * }
}
И зачем вы передаете функции параметр answer? Он как-то используется?
Это так. Что-то бросилось в глаза. А вообще-то понять вашу задумку трудно. Я не смог. Компилятор, видимо, тоже не справится.
1
Модератор
Эксперт С++
 Аватар для zss
13759 / 10955 / 6487
Регистрация: 18.12.2011
Сообщений: 29,216
09.02.2017, 22:26
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

C++
1
2
3
4
5
6
7
8
9
int searh (char* word)
{
    for (int i(0); i!=3; i++)
            if (strcmp (lib[i][0], word) == 0)
              return i;
   return -1;
 }
...
answer=searh (word);
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
10.02.2017, 19:14  [ТС]
Честно говоря, я уже переписал код и разобрался в проблеме
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <Windows.h>
    
 
 
    // 1. Меняем регистр букв
        void regist (char *buk){
            for (int i(0); buk[i]; i++){
                if (buk[i] >= 'а' && buk[i] <= 'я'){
 
                    buk[i] -= 32;
                }
            }
        }
 
        // 2. Находим нужное слово.
        void libra (char *seach){
            int i(0);
            char *libraly [4][2] = {
 
                "НАПРЯЖЕНИЕ", " - разность поценциалов, характеристика электрического поля. ", 
                "ТОК", " - движение заряженных частиц под действием электрического поля.",
                "МОЩНОСТЬ", " - произведение силы тока и напряженности электрического поля",
                "ПРОСТО", " - дополнительный текст", 
                
 
            };
            for (i; *libraly[i][0]; i++){
                if(strcmp (libraly[i][0], seach) == 0){
                    std::cout <<seach << libraly[i][1] << std::endl;
                    break;
                }
            }
 
        if (strcmp(libraly[i][0], seach) != 0){
            std::cout <<  seach << " - не найдено!" << std::endl;
        }
    }
    
        // 3. Функция для повтора.
        bool restart ( bool  *chose){
            int vibor;
            std::cout << "Повторить: ";
            std::cout << "1 - да" << std::endl;
            std::cout << "2 - нет" << std::endl;
            std::cin >> vibor;
            if (vibor == 1){
                system ("cls"); *chose = true;
            }
            else{
            *chose = false;
            }
            return *chose;
 
        }
 
        int main (){
            
            setlocale (LC_ALL, "rus");
 
            bool key = true;
                                                                             
        do {
 
            char word [128];
                std::cin >> word;
                    regist (word);
                         libra (word);
                            restart(&key);
    
            
        } while(key);
 
    
            return 0;
        }
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12900 / 6760 / 1815
Регистрация: 18.10.2014
Сообщений: 17,094
10.02.2017, 20:16
Лучший ответ Сообщение было отмечено Photofenix как решение

Решение

Цитата Сообщение от Photofenix Посмотреть сообщение
и разобрался в проблеме
По коду видно, что автор в проблеме совершенно НЕ разобрался и вместо того, чтобы разбираться, просто взял и засунул вывод результата поиска прямо внутрь функции поиска. Получилось криво, но "работает". При этом странная мешанина двух независимых способов возврата значения, свидетельствующая о полном непонимании проблемы, все равно хорошо сохранилась в функции bool restart(bool *chose).

Также непонятно что делает вот это одинокое i в

C++
1
for (i; *libraly[i][0]; i++){
Условие продолжения цикла *libraly[i][0] в этом же цикле - грубая ошибка, ибо будет вызывать вылет за пределы массива при i == 4.

Включения заголовочного файла для функции strcmp не сделано.

Ну и конечно же классика

Code
1
2
3
4
main.cpp: In function 'void libra(char*)':
main.cpp:26:13: error: ISO C++ forbids converting a string constant to 'char*' [-Wpedantic]
             };
             ^
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
10.02.2017, 21:45  [ТС]
Ну вы понимаете, я только учусь.
C++
1
*libraly[i][0]
Этот способ взят из книги.

Добавлено через 31 минуту
Да и если честно, я изучаю С++ второй месяц, после работы
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12900 / 6760 / 1815
Регистрация: 18.10.2014
Сообщений: 17,094
10.02.2017, 21:53
Цитата Сообщение от Photofenix Посмотреть сообщение
Этот способ взят из книги.
Это способ работоспособен, если массив специально сделан на единичку большего размера, чтобы "лишний" элемент сделать "пустым" элементом-терминатором". У вас же этого не сделано.

В вашем случае достаточно сделать первый размер массива libraly 5 вместо 4, и все станет нормально

C++
1
2
3
4
5
6
            const char *libraly[5][2] = {
                "НАПРЯЖЕНИЕ", " - разность поценциалов, характеристика электрического поля. ", 
                "ТОК", " - движение заряженных частиц под действием электрического поля.",
                "МОЩНОСТЬ", " - произведение силы тока и напряженности электрического поля",
                "ПРОСТО", " - дополнительный текст", 
            };
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
11.02.2017, 19:17  [ТС]
Спасибо, я запомню это
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
12.02.2017, 20:27  [ТС]
Доработал код. В коде несколько заданий из учебника.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <cstring>
#include <Windows.h>
 
    // Глобальный массив.
    const char *lib[4][2] = {
        "Ток", " - дивжение заряженных частиц",
        "Напряжение", " - разность потенциалов, характеристика электрического поля",
        "Мощность", " - произведение напряжения и электрического тока",
        "Амперчас", " - характеристика, показывающая  сколько времени проработает \n устройство при заданном токе",
    };
 
    // 1. Проверка пароля.
    bool key (char **text){
        char pass [128] = "hi";
 
        if (strcmp(text[1], pass) == 0){
            return true;
        }
        return false;
    }
 
    // 2. Меняем регистр букв.
    void regist (char *sword){
    
            for (int i(0); sword[i]; i++){
                if(sword[i] >= 'а' && sword[i] <= 'я' && i == 0){
                    sword[i] -= 32;
                }
                else if (sword[i] >= 'А' && sword[i] <= 'Я' && i != 0){
                    sword[i] += 32;
                }
            }
        }
 
    // 3. Находим слово.
    void word (char *sword){
        for (int i(0); i!=4; i++){
            if(strcmp (lib[i][0], sword) == 0 && i != 4){
                system ("cls");
                std::cout << sword << lib[i][1] << std::endl;
                break;
            }
            else if (strcmp (lib[i][0], sword) != 0 && i == 3) {
                system ("cls");
                std::cout << sword << " - не найдено!" << std::endl;
            }
        }
    }
 
    
    int main (int argc, char *argv[]){
 
        SetConsoleCP (1251);
        SetConsoleOutputCP (1251);
        system ("cls");
 
 
 
        if (key (argv)){
 
            char seach [128];
            std::cin >> seach;
            regist (seach);
            word(seach);
        }
        else {
            std::cout << "Не правильно!" << std::endl;
        }
    
            
        
        return 0;
    }
0
Диссидент
Эксперт C
 Аватар для Байт
27712 / 17330 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
12.02.2017, 20:48
Все не смотрел, но кусочек кода 26-33 можно улучшить
C++
1
2
3
4
5
6
7
8
for (int i(1); sword[i]; i++){
       if(sword[i] >= 'а' && sword[i] <= 'я' ){
                    sword[i] -= 32;
       }
       else if (sword[i] >= 'А' && sword[i] <= 'Я' ){
                    sword[i] += 32;
        }
}
Меня всегда удивляло стремление начинающих начинать все циклы с i = 0 и в качестве шага i++
Как будто язык не предоставляет других возможностей.

Добавлено через 4 минуты
Хотя, посмотрел внимательно, и увидел, что мой код вашему не эквивалентен, более того, может впасть в бесконечный цикл, если sword[0] = 0.
Тогда так
C++
1
2
if (sword[0])
 for (int i(1); sword[i]; i++) { ...
Или так
C++
1
2
3
 for (int i(0); sword[i]; i++){
   if (i==0) continue;
   ...
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
12.02.2017, 21:11  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Меня всегда удивляло стремление начинающих начинать все циклы с i = 0 и в качестве шага i++
Это всё учебник виноват
Буду учится. В данный момент я только на 256 странице. Надо же, буквально два месяца назад и подумать не мог, что буду хоть чуть-чуть понимать язык программирования
0
Диссидент
Эксперт C
 Аватар для Байт
27712 / 17330 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
12.02.2017, 21:14
Цитата Сообщение от Photofenix Посмотреть сообщение
на 256
Хорошее число! 28
А вы знаете, что 256-й день в году (в 2017 он приходится, кажется, на 13 сентября) объявлен всемирным днем программиста?
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
12.02.2017, 21:38  [ТС]
Да, я знаком с этим праздником Надеюсь, он станет и моим
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2017, 21:38
Помогаю со студенческими работами здесь

Почему функция возвращает отрицательное число?
Почему функция возвращает отрицательное число? Причём передаю в функцию s&lt;=31, т.е. всё должно поместиться. И как это можно исправить? ...

Почему функция atoi возвращает неожиданный результат?
char chislo; int kol_OB; chislo = '2'; chislo = '4'; kol_OB = atoi(chislo); Почему kol_OB = 18?

Почему функция atan возвращает значения фрагментарно
Всем привет, нужно значение угла от мыши (x, y) до координаты (0,0) окна. Пишу следующее: double panel::checkSector(int x, int...

Функция не возвращает значение
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int ca(int a) { int i,r; r = 0; ...

Функция не возвращает значение
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; #include &quot;stdafx.h&quot; using namespace std; const int max_size = 100; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru