#c #math
#c #математика
Вопрос:
Мне нужна помощь, моя программа не работает, она продолжает показывать мне 0 в качестве значения! Что не так с моим кодом?
программа требует от пользователя ввести количество целых чисел в начале.
#include <stdio.h>
int main(void)
{
int num;
int largest= 0;
int secondlargest= 0;
int thirdlargest=0;
printf("Please enter the number of integers:");
scanf("%d", amp;num);
if(num > 2)
{
scanf("%d",amp;largest);
while(--num > 0)
{
int tmp;
scanf("%d",amp;tmp);
if(tmp>largest)
largest=tmp;
if(tmp > secondlargest amp;amp; tmp < largest)
secondlargest=tmp;
if(tmp > thirdlargest amp;amp; tmp < secondlargest amp;amp; tmp < largest)
thirdlargest=tmp;
}
printf("The third largest number is %dn",thirdlargest);
}
else
{
printf("There is no third largest number.");
}
return 0;
}
вот мой код, как написано выше! Мне нужно отправить его без использования массива! Любая помощь будет высоко оценена!
Комментарии:
1. почему
C#
тег?2. Что должно быть напечатано в случае, если указано 3 числа и введено 3 одинаковых числа — следует ли печатать это значение как третье по величине, выводить ноль или вы хотите напечатать «Третьего по величине числа нет»?
Ответ №1:
Когда вы нашли первое или второе по величине, вам нужно «сдвинуть» меньшие (и вы можете заменить свое второе и третье if на ‘else if’). Если вы хотите обрабатывать ввод отрицательных значений, установите для 3 наибольших наименьшее значение int. И используйте >= вместо> для обработки дубликатов.
int num;
int largest = INT_MIN;
int secondlargest = INT_MIN;
int thirdlargest = INT_MIN;
printf("Please enter the number of integers:");
scanf_s("%d", amp;num);
if (num > 2)
{
scanf_s("%d", amp;largest);
while (--num > 0)
{
int tmp;
scanf_s("%d", amp;tmp);
if (tmp >= largest){
thirdlargest = secondlargest;
secondlargest = largest;
largest = tmp;
}
else if (tmp >= secondlargest){
thirdlargest = secondlargest;
secondlargest = tmp;
}
else if (tmp > thirdlargest)
thirdlargest = tmp;
}
printf("The third largest number is %dn", thirdlargest);
}
else
{
printf("There is no third largest number.");
}
return 0;
Комментарии:
1. Действительно, но, учитывая исходный код, я подумал, что это не будет важно. Вам просто нужно инициализировать 1-е, 2-е и 3-е по величине до минимально возможного int
2. Этот код не работает, если есть одно или несколько повторяющихся чисел, например, 3 числа 1 3 3 возвращают 0 как третье по величине.
3. Действительно. Я исправил это. Но поскольку это не был первоначальный вопрос, не уверен, что мы должны охватить все случаи, а не позволять ему находить от себя.
Ответ №2:
Если вы хотите обрабатывать и отрицательные значения, установите для ваших трех наибольших значений минимальное целое число. Также используйте else if
вместо if
, чтобы вы могли использовать простые сравнения вместо составных, с последующим сдвигом ваших переменных:
#include <stdio.h>
#include <limits.h>
int main(void)
{
int number;
printf("Please enter the number of integers: ");
(void) scanf("%d", amp;number);
if (number < 3)
{
printf("There is no third largest number.");
return 1;
}
int largest = INT_MIN;
int secondlargest = INT_MIN;
int thirdlargest = INT_MIN;
while (number-- > 0)
{
int temporary;
(void) scanf("%d", amp;temporary);
if (temporary > largest)
{
thirdlargest = secondlargest;
secondlargest = largest;
largest = temporary;
}
else if (temporary > secondlargest)
{
thirdlargest = secondlargest;
secondlargest = temporary;
}
else if (temporary > thirdlargest) {
thirdlargest = temporary;
}
}
printf("The third largest number is %dn", thirdlargest);
return 0;
}
Ответ №3:
Некоторый псевдокод, который упрощает и корректирует вашу if()
структуру.
int largest1 = INT_MIN;
int largest2 = INT_MIN;
int largest3 = INT_MIN;
int input = ...;
if (input > largest3) {
largest3 = input;
if (largest3 > largest2) {
swap(largest2, largest3);
if (largest2 > largest1) {
swap(largest1, largest2);
}
}
}