2015-10-10 4 views
-1

Итак, мой вопрос заключается в том, как эффективно писать программу, в которой мы можем принимать несколько входов (количество вводимых данных определяется пользователем), а затем дают выходы сразу. Рассмотрим программу, которая дает сумму ее цифр. Например - 12345 = 15.Принимая сразу несколько входов, а затем выдавая вывод сразу

//Single input single output 
#include <iostream> 

using namespace std; 

int main() 
{ 
    int T, N; 
    cout << "Enter the value of T (No. of test cases)" << endl; 
    cin >> T; 
    cout << "Enter the value of N : " << endl; 
    while (T > 0) 
    { 
     cin >> N; 

     int ans = 0,temp1,temp2; 
     while(N!=0) 
     { 
      temp1= N %10; 
      N = (N - temp1)/10; 
      ans = ans + temp1; 
     } 
     cout << ans << endl; 
     T--; 
    } 

    return 0; 
} 
// Taking in all inputs then giving out all outputs (Not working properly) 

#include <iostream> 

using namespace std; 
int SumCal(int Number, int TestCase, int t); 
int main() 
{ 
    int N, T; 

    cout << " Enter the value of T (Total number of test cases) " << endl; 
    cin >> T; 
    int *Ans(new int[T]); 
    if (T >= 1 && T <= 1000) 
    { 
     cout << "Enter the value of N" << endl; 
     for (int i = 1; i <= T; i++) 
     { 
      cin >> N; 
      if (N >= 1 && N <= 100000) 
       Ans[i] = SumCal(N, i, T); 
     } 
    } 

    for (int z = 1; z <= T; z++) 
    { 
     cout << Ans[z] << endl; 
    } 


    delete[] Ans; 
    return 0; 
} 

int SumCal(int Number, int TestCase, int t) 
{ 
    int temp1, temp2 = 0; 
    int *AnsTemp(new int[t]); 

    temp1 = Number % 10; 

    temp2 = Number/10; 
    if (temp2 < 10 && temp2 > 0) 
     AnsTemp[TestCase] = (temp1 + temp2); 


    while (temp2 > 10) 
    { 
     AnsTemp[TestCase] = (AnsTemp[TestCase] + temp1); 
     temp2 = temp2/10; 
     temp1 = temp1 % 10; 
    } 

    return AnsTemp[TestCase]; 
    delete[] AnsTemp; 
} 
// This will work properly for multiple inputs multiple outputs 

#include <iostream> 

using namespace std; 
int SumCal(int Number, int TestCase); 
int main() 
{ 
    int N, T; 

    cout << " Enter the value of T (Total number of test cases) " << endl; 
    cin >> T; 
    int Ans[1000] = {}; 
    if (T >= 1 && T <= 1000) 
    { 
     cout << "Enter the value of N" << endl; 
     for (int i = 1; i <= T; i++) 
     { 
      cin >> N; 
      if (N >= 1 && N <= 100000) 
       Ans[i] = SumCal(N, i); 
     } 
    } 

    for (int z = 1; z <= T; z++) 
    { 
     cout << Ans[z] << endl; 
    } 

    return 0; 
} 

int SumCal(int Number, int TestCase) 
{ 
    int temp1, temp2 = 0; 
    int ans; 

    temp1 = Number % 10; 

    temp2 = Number/10; 
    if (temp2 < 10 && temp2 > 0) 
     ans = (temp1 + temp2); 

    while (temp2 > 10) 
    { 
     ans = (ans + temp1); 
     temp2 = temp2/10; 
     temp1 = temp2 % 10; 
    } 

    return ans; 
} 

Эти коды я мог думать. Первый - простой, который принимает вход и затем выдает результат. Во втором я попытался использовать динамическое распределение памяти, но программа дает ошибку. (Я знаю, что я не использовал правильное использование * и &, но я уже пробовал использовать его разными способами и не смог). Третья программа успешна, но поскольку мы устанавливаем большое значение ограничения для массива (i.e int Ans [1000]), это делает программу немного неэффективной.

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

+0

* Пожалуйста, отправьте код в этом сообщении. Ссылки умирают и обычно не приглашают тех, кто пытается помочь. – owacoder

+0

@Mr_Feynman Если это фактическое форматирование кода, я понимаю вашу борьбу. – LogicStuff

+0

@Mr_Feynman Что такое 'int * AnsTemp;' во втором примере? Вы используете его как массив? № – LogicStuff

ответ

0

Очень сложно работать с вашим кодом. Я просто взял 1-ый пример, минимизировал код и сделал то, что вы должны сделать:

#include <iostream> 

using std::cout; 
using std::endl; 
using std::cin; 

int main() 
{ 
    int T; 
    cout << "Enter the value of T (No. of test cases)" << endl; 
    cin >> T; 
    int *buf = new int[T]();    // buffer to hold the answers 

    for(int i = 0; i < T; ++i) 
    { 
     int N; 
     cout << "Enter the value of N : " << endl; 
     cin >> N; 

     while(N) 
     { 
      buf[i] += N % 10;    // calculate on the buffer element 
      N /= 10; 
     } 
    } 

    for(int i = 0; i < T; ++i) 
     cout << buf[i] << endl;   // print the buffer 

    delete [] buf;      // delete buffer 
    return 0; 
} 

Там не так много, чтобы сделать для управления динамически выделяемый массив здесь, но посмотрите на std::vector и его использования.

+0

Ничего себе, спасибо, это именно то, что я искал! Однако я не понимаю его. Если * buf является указателем, почему работает buf [i] + = N% 10? Почему не было необходимости указывать на адрес N% 10 ie & N% 10 –

+0

'buf' is' int * ',' buf [i] 'is' int', нет необходимости хранить адреса, и вы, конечно, не можете введите адрес временного ('N% 10'). – LogicStuff

+0

И не забудьте принять ответ. Извините, что нажимаю, но это часто встречается с новичками. – LogicStuff

Смежные вопросы