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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2012, 19:18   #11
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

Спасибо за коменты, буду разбираться, пока не очень понял что делает stringstream ss со строкой s.
Что я собственно пытался сделать - так это решить вот это http://ssmaker.ru/9cc8032e/ .
Вчера написал более менее рабочую программулину (с теми входными данными что приведены в примере - она отрабатывает ) Вот она.
Код:
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;


void main()
{
	ifstream fin ("Input.txt");
	ofstream fout ("Output.txt");
	
	char First[6];
	
	fin.getline(First,6);
	int N,A,B,C,D;
	
    N=First[0]-48;
    A=First[2]-48;
	B=First[4]-48;
	int ArrayCost[100];
	
	for (int i = 0 ; i<=N-1;i++)
	{
		fin.getline(First,6);
		C=First[0]-48;
		D=First[2]-48;
		
		ArrayCost[i]=A*C+B*D;

	}

	int SecondArray[100];

	for (int k = 0 ; k<=N-1;k++)
	{
		SecondArray[k]=ArrayCost[k];
	}

	  
	for (int p = 0; p<N; ++p)
	{
        int tmp = 0;
        for (int j=(p+1); j<N; ++j)
            if (ArrayCost[p]<ArrayCost[j]) {
                tmp = ArrayCost[p];
                ArrayCost[p] =ArrayCost[j];
                ArrayCost[j] = tmp;        
                }
    }
	  
	int b=0;
	if(ArrayCost[N-1]!=SecondArray[b]) b++;
	else fout <<b+1;

	system("pause");

}
Но вот только сейчас заметил что во входном файле , по условию , могут быть и двухзначные числа, и трехзначные, а моя программа работает только с однозначными. Теперь сижу думаю как ее модифицировать.
За код особо тапками не кидайтесь, я только неделю назад задался целью изучения с++, так что пока полный профан
neonakaneya вне форума Ответить с цитированием
Старый 03.01.2012, 19:29   #12
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Если от 51 отнять 48, то получится 3.
Если от (int) '0' отнять 48, то получится 0.
Если от (int) '3' отнять 48, то получится 3.
Если от (int) '4' отнять 48, то получится 4.
Если от (int) '9' отнять 48, то получится 9.
Страуструп не одобрил бы. Вдруг кодировка будет другая? А что, если в ней и вовсе цифры не друг за другом следуют?
Код:
int figure(char c)
{
  switch (c)
  {
  case '0': return 0;
  case '1': return 1;
  ...
  default: throw std::invalid_argument("a figure expected");
  }
}
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 03.01.2012, 19:57   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Страуструп не одобрил бы. Вдруг кодировка будет другая? А что, если в ней и вовсе цифры не друг за другом следуют?
Если это внутренние данные твоего приложения, то ты изначально зная их кодировку, пишешь корректные обработчики данных.

Если данные пришли откуда то снаружи - никогда нельзя полагаться на их валидность. Все в любом случае нужно будет проверить, и в случае чего - привести их в надлежащий вид. Например - конвертировать из одной кодировки в другую. А дальше работать с ними как обычно.

Ситуация, когда приложение не контролирует формат и структуру собственных данных, над которыми выполняет действия - архитектурный фейл.


Код:
Если от (int) '3' отнять 48, то получится 3.
Можно заменить эквивалетной записью:
Код:
Если от (int) '3' отнять (int) '0', то получится 3.
Свитч не нужен.

Последний раз редактировалось _Bers; 03.01.2012 в 20:14.
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 23:44   #14
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Сtrl


Код:
int figure(char c)
{
  switch (c)
  {
  case '0': return 0;
  case '1': return 1;
  ...
  default: throw std::invalid_argument("a figure expected");
  }
}


хм. хорошо что цифр всено 10, а то одна дамочка уже проверяла, не является ли символ буквой. Результат - шедевр сайта говнокод.ру и первое место за всю историю существования ресурса (((((((((((((:
Rififi вне форума Ответить с цитированием
Старый 04.01.2012, 00:48   #15
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Rififi, так-то он так, но на букву по-хорошему именно так проверять и надо.
Код:
bool my_isalpha(char c)
{
  const std::string alphabet = "абвгдеёжзийклмн ... ";
  return
    std::find(alphabet.begin(), alphabet.end(), c) != alphabet.end();
}
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 04.01.2012, 01:04   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Rififi, так-то он так, но на букву по-хорошему именно так проверять и надо.
по легкому и не гавняному да.
но правильнее вспомнить кодировку символов.(хотя не универсально...есть о чем подумать)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.01.2012, 13:35   #17
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

Попытался решить проблему с 1-3значными числами (выше о ней писал)
Для примера написал вот такую вот вещь:
Код:
#include <iostream>
#include <fstream>
using namespace std;

void main()
{
	ifstream fin("input.txt");

	char s[4];
	fin.getline(s,3);

    int a, b, c;
   
	if(s[1]=' ') 
	{
		a=s[0]-48;
	}
	else
	{
		if(s[2]=' ') a=(s[0]-48)*10 + (s[1]-48);
		else a=(s[0]-48)*100 + (s[1]-48)*10 + (s[2]-48);
	}

	cout<<a; 
    system ("pause");

}
Как я рассуждал : в ифах проверяется на каком месте стоит знак пробела, и исходя из этого , переменной "а" присваивается значение. Но почему-то программа всегда выводит только одно первое число, т.е. если в входном файле "469" , то на консоль она выводит только "4". Где я напутал?
neonakaneya вне форума Ответить с цитированием
Старый 04.01.2012, 17:27   #18
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

Что-то до меня так и не дошло как проверить элемент массива char на равенство пробелу Х_Х условие
Код:
if(First[i]=' ')
почему-то срабатывает на все char'ы, я так понимаю что ' ' - это не есть знак пробела? Подскажите пожалуйста что вместо него юзать.
neonakaneya вне форума Ответить с цитированием
Старый 04.01.2012, 17:39   #19
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Вы перепутали присваивание (один знак равно) и сравнение (два знака равно).
Код:
if (c == ' ') ...
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 04.01.2012, 17:42   #20
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Вы перепутали присваивание (один знак равно) и сравнение (два знака равно).
Код:
if (c == ' ') ...
Вот я дурак Х_Х Несколько часов сидел переделывал и гадал в чем же проблема.
neonakaneya вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение массива типа char. KuckaMAXHATKA Общие вопросы C/C++ 1 15.02.2011 18:07
Конверт int массива в char массив Raptor Помощь студентам 14 23.03.2010 00:50
Как перевести значение ячейки массива char в int в Си SASS Общие вопросы C/C++ 1 10.12.2009 14:44
почему элемент массива char* весит 4 байта? Познающий Помощь студентам 6 09.12.2009 21:06
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35