Программа зависает и ничего не выводит - PullRequest
0 голосов
/ 14 января 2019

Когда я запускаю этот код, я получаю предупреждение: управление достигает конца не пустой функции [Wreturn-type]. Я думаю, что это может быть случай бесконечной рекурсии, но я не знаю, как это исправить.

Предполагается, что эта программа будет вводить числа, пока вы не введете что-то, что не является числом. Функция poramnet() меняет любые 9 на 7 и возвращает их. У меня также есть условие, когда мне нужно распечатать 5 самых больших чисел, и если у меня нет 5 чисел в массиве, я должен распечатать их все.

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<ctype.h>

int poramnet(int n, int m, int i){ //i should start with 1 
    if(n==0)
        return m;
    if(n%10==9){
        m+=i*7;
    }
    else{
        m+=i*(n%10);
        return poramnet(n/10, m, i*10);
    }
}

int main()
{
    int array1[100], i=0, output[100], br=1, j, temp, m=0, n;
    while(1){
    scanf("%d", &array1[i]);
    if(!isdigit(array1[i]))
        break;
        i++;
    }
    n=i;
    for(i=0;i<n;i++){
        output[i]=poramnet(array1[i], m, br);
    }
    for(i=0;i<n-1;i++){
        for(j=1;i<n;j++){
            if(output[i]>output[j]){
                temp=output[i];
                output[i]=output[j];
                output[j]=temp;
            }
        }
    }
    if(n<5){
        for(i=0;i<n;i++)
            printf("%d ", output[i]);
    }
    else{
        for(i=0;i<5;i++){
        printf("%d ", output[i]);
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 14 января 2019

Очки, которые нужно иметь в виду:

  1. Всегда используйте скобки с if блоком, даже если вы считаете это ненужным.
  2. Заменил scanf на getc.
    1. Здесь нужно игнорировать клавишу «ENTER»,
    2. , а затем преобразовать в int,
    3. , а затем проверьте с помощью isdigit.
  3. В одном из ваших вложенных циклов была ошибка: необходим j<n, а не i<n.
  4. Сохранение выхода / возврата из функции до минимума. Если вы все еще хотите использовать несколько возвратов из функции, то, по крайней мере, поместите возврат по умолчанию, который, как вы знаете, всегда будет достигнут, даже если вы запрограммируете что-то не так.

См. Комментарии в коде для более подробной информации.

main.cpp

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<ctype.h>

int poramnet(int n, int m, int i){ //i should start with 1
    // Always put brackets with if !!! It avoid confusion
    if(n==0) {
        return m;
    }
    if(n%10==9){
        m+=i*7;
        return m;
    }
    else{
        m+=i*(n%10);
        return poramnet(n/10, m, i*10);
    }
    // put a default return always, so you know if the function returns
    // in an expected way, that you can track it back down.
    return -1;
}

int main()
{
    int array1[100], i=0, output[100], br=1, j, temp, m=0, n;

    // Instead of scanf, you could use getc, ignore the "enter" key-press,
    // and convert to an int from char and then check with isdigit().
    while(1){
        char tempChar;
        tempChar = getc(stdin);
        if (tempChar != '\n') {
            // printf("what you entered is, %c\n", tempChar);
            // printf("is it a digit:  %d\n", !isdigit(tempChar));
            tempChar = tempChar - '0';
            // printf("is it a digit:  %d\n", !isdigit(array1[i]));
            if(isdigit(tempChar)) {
                break;
            }
            array1[i] = tempChar;
            i++;
        }
    }

    n=i;
    for(i=0;i<n;i++){
        output[i]=poramnet(array1[i], m, br);
    }



    for(i=0;i<n-1;i++){
        for(j=1;j<n;j++){ // you had a bug here also! you need j<n and not i<n !! copy-paste error!
            if(output[i]>output[j]){
                temp=output[i];
                output[i]=output[j];
                output[j]=temp;
            }
        }
    }

    if(n<5){
        for(i=0;i<n;i++)
            printf("%d ", output[i]);
    }
    else{
        for(i=0;i<5;i++){
            printf("%d ", output[i]);
        }
    }
    return 0;
}

выход

junglefox @ убунт:. ~ / Test_programs $ / тест

1

2

3

4

* * 5 тысяча сорок-девять

а

1 4 3 2 5 junglefox @ ubuntu: ~ / test_programs $

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...