Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 00:52   #1
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию Сравнение трех чисел

Ребят, подскажите пожалуйста.. Си начал учить по книженке одной "Введение в программирование на С". И там есть задания. <<Ввести три числа и определить большее из них. Если числа равны, то соответственно вывести сообщение об этом.>> Это в главе "Операторы условия if...else". Получается, что надо выполнение двойного условия "если А больше Б и А больше С то...", но проблема в том что в моей книжке нету пример чтобы в операторе IF было несколько условий. там только типа if(x>60). и все. ну я решил что должно быть через запятую.. но сомневаюсь. где то еще видел через "&"..вот код внизу который я смог слепить..работает он коряво=(( к примеру если вводишь числа подряд " 3 4 4", то пишет что числа равны..((
Суть топика: объяснить новичку, как в операторе IF ставить несколько условий. поправить мой нубский код, или написать свой но с использованием IF...ELSE. буду благодарен!
Код:
#include<stdio.h>
#include<conio.h>
void main()
{
	int a,b,c;
	printf("vvedi pervoe chislo umnik:\n");
	scanf("%d",&a);
	printf("vvedi vtoroe chislo umnik:\n");
	scanf("%d",&b);
	printf("vvedi tretee chislo umnik:\n");
	scanf("%d",&c);
	if(a>b, b>c)               
	{
		printf("max=%d\n",a);
	}
	else
	{
		if(b>a, a>c)
			printf("max=%d\n",b);
		else
		{
			if(c>a,a>b)
				printf("max=%d\n",c);
			else
			{
				if(a=b, a=c, b=c)
					printf("chisla ravni\n");
			}
		}
	}
        getch();
}

Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 22.01.2012, 01:06   #2
Китос
Пользователь
 
Регистрация: 24.09.2011
Сообщений: 26
По умолчанию

Код:
int main() {
	int a,b,c;
	printf("Введите 3 числа");
	scanf("%d%d%d",&a,&b,&c);
	if (a>b && a>c) printf("max=%d\n",a);
	  else if (b>a && b>c) printf("max=%d\n",b);
	  else if (c>a && c>b) printf("max=%d\n",c);
	  else if (a==b && a==c && b==c) printf("Числа равны\n");
	system("pause");
	return 0;
}
Китос вне форума Ответить с цитированием
Старый 22.01.2012, 01:08   #3
Китос
Пользователь
 
Регистрация: 24.09.2011
Сообщений: 26
По умолчанию

Теперь объясню.
&& - это логическое "и", проверка на равенство это "==", а не "=" (это присваивание).
Еще вопросы?
Китос вне форума Ответить с цитированием
Старый 22.01.2012, 01:14   #4
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

if(a > b && a > c) - и
if(a > b || a > c) - или
if(!(a > b && a > c)) - не
if(a > b && (a > c || a > d)) - И и ИЛИ, скобки тут показывают, что первым будет выполняться подсчет истинности ИЛИ
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 22.01.2012, 01:18   #5
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Китос Посмотреть сообщение
Теперь объясню.
&& - это логическое "и", проверка на равенство это "==", а не "=" (это присваивание).
Еще вопросы?
Насчет присваивания и "И" понятно все. спасибо.
еще вопрос в вашем коде
Код:
system("pause");
return 0;
в чем функция return(0)?
и в какой библиотеке они находятся подскажите пожалуйста
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 22.01.2012, 01:22   #6
Китос
Пользователь
 
Регистрация: 24.09.2011
Сообщений: 26
По умолчанию

просто я написал функцию int main(), это значит что она возвращает (как раз через оператор return) значение int. В данном случае это не обязательно, можно оставить ваш void. Ну и библиотека ей не нужна это стандартная функция си.
Китос вне форума Ответить с цитированием
Старый 22.01.2012, 01:27   #7
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Китос Посмотреть сообщение
просто я написал функцию int main(), это значит что она возвращает (как раз через оператор return) значение int. В данном случае это не обязательно, можно оставить ваш void. Ну и библиотека ей не нужна это стандартная функция си.
Будьте добры еще...подскажите пожалуйста разницу между int main() и void main()
буду очень благодарен.

ACE Valery, и вам спасибо
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 22.01.2012, 01:32   #8
Китос
Пользователь
 
Регистрация: 24.09.2011
Сообщений: 26
По умолчанию

Ну если ты только начал изучать си то ты еще с этим обязательно столкнешься)
Ну например пишем функцию суммирования двух чисел:
Код:
int sum(int x, int y) {
  return(x+y);
}
данная функция получает два аргумента x и y, и возвращает результат их суммы.
то есть если мы вызовем эту функцию:
Код:
z=sum(2,3);
то получим z=5.
Функция void ничего не возвращает.

Последний раз редактировалось Китос; 22.01.2012 в 01:39.
Китос вне форума Ответить с цитированием
Старый 22.01.2012, 01:39   #9
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Китос Посмотреть сообщение
Ну если ты только начал изучать си то ты еще с этим обязательно столкнешься)
Ну например пишем функцию суммирования двух чисел:
Код:
int sum(int x, int y) {
  return(x+y);
}
данная функция получает два аргумента x и y, и возвращает результат их суммы.
то есть если мы вызовем эту функцию:
Код:
z=sum(2,3);
то получим z=5.
понял.
и да, С изучаю не давно...4 день=)
всем спасибо. особенно вам Китос
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 22.01.2012, 07:10   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Китос Посмотреть сообщение
Код:
int main() {
	int a,b,c;
	printf("Введите 3 числа");
	scanf("%d%d%d",&a,&b,&c);
	if (a>b && a>c) printf("max=%d\n",a);
	  else if (b>a && b>c) printf("max=%d\n",b);
	  else if (c>a && c>b) printf("max=%d\n",c);
	  else if (a==b && a==c && b==c) printf("Числа равны\n");
	system("pause");
	return 0;
}
1. У вас проверка на "числа равны" в три сравнения. Хотя для такой задачи достаточно только двух сравнений

2. Слишком много всяких if - else. Это не читабельно

Код:
//где то заранее (  #include<windef.h>)
#define max(a,b)            (((a) > (b)) ? (a) : (b))

if( a==b&&b==c )  { printf("Числа равны\n"); }  //достаточно только двух сравнений
eslse { printf("максимальное число: %i\n", max( max(a,b), c));
3. А если вдруг изменятся условия, надо будет искать максимальное из четырех чисел? В вашем случае, придётся ручками дописывать код.

А ведь поиск максимального из нескольких чисел - суть алгоритм поиска максимального числа в обычном массиве.
В таких случаях лучше подойдёт более унифицированное решение.

И ведь именно тем и силен и могуч с++, что позволяет создавать удобные, практичные, и унифицированные решения, гибкие в плане разного рода изменений.

Ниже представленный код умеет искать максимальное число в массиве.
При этом, он умеет различать:
1. Настоящие массивы на языке с++ ( тип имя[размер]; )
2. Динамические массивы (указатель + размер)
3. Совместимые с STL контейнеры.

Элементы массивов должны уметь сравниваться (operator < )

http://liveworkspace.org/code/dc32af...d2e9bd587cd3b0

Код:
#include <vector>

template<class Arr_t> 
inline 
int TGetMax(const Arr_t* Arr, size_t len)  //передача указателя + размер данных
{
    size_t nom=0;
    for(size_t i=1; i<len;++i) if( Arr[nom]<Arr[i]) nom=i; 
    return Arr[nom]; 
};

template<class Arr_t, size_t len> 
inline 
int TGetMax(const Arr_t (&Arr)[len])  //передача настоящего массива на с++
{ 
    return TGetMax(Arr, len); 
};

template<class Arr_t> 
inline                          
int TGetMax(const Arr_t& Arr) //передача объекта, совместимого с контейнерами STL 
{ 
    Arr_t::const_iterator mmax= Arr.begin();
    Arr_t::const_iterator iter= mmax+1;
    for(; iter!=Arr.end();++iter) if( (*mmax)<(*iter)) mmax=iter; 
    return (*mmax); 
};

int main()
{
    //подготовка к тестам
    int Arr[3] = { 21,17,33}; int Result=0;  int* pArr=Arr;
    std::vector<int> Arr2;
    Arr2.push_back(1); 
    Arr2.push_back(2);
    Arr2.push_back(3);

    //сами тесты
    Result = TGetMax(Arr);    printf("Result %i\n", Result);   //при передаче настоящего массива, размер его будет вычислен автоматически
    
    Result = TGetMax(pArr,3); printf("Result %i\n", Result);  //при передаче динамического массива, размер надлежит передавать явно
                                                                               // можно было бы тоже автоматически вычислять, 
                                                                               //но уж больно костыльный получится метод

    Result = TGetMax(Arr2);   printf("Result %i\n", Result); //для объектов, совместимых с STL контроль размера массива будет осуществлен через итератор
}

Последний раз редактировалось _Bers; 22.01.2012 в 09:12.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение трех чисел Vitalik1 Помощь студентам 2 31.10.2011 20:56
НОД трех чисел на Си. meta Помощь студентам 1 30.04.2011 02:38
НОД трех чисел. Си. meta Помощь студентам 0 27.04.2011 05:09
Максимальное из трех чисел banderos85 Microsoft Office Excel 3 17.03.2011 17:57
помогите сделать сравнение трех книг. khvorovs Microsoft Office Excel 2 09.12.2006 13:58