2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:25 
Ubermensch в сообщении #601650 писал(а):
Например что %ld - это место переменной.
Почитайте, наконец, учебники.
В данном случае, например, правильно будет "%d", а "%ld" - неправильно, хоть может и сработать.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:35 
Аватара пользователя
venco в сообщении #601653 писал(а):
Ubermensch в сообщении #601650 писал(а):
Например что %ld - это место переменной.
Почитайте, наконец, учебники.
В данном случае, например, правильно будет "%d", а "%ld" - неправильно, хоть может и сработать.

Просто на http://acmp.ru/article.asp?id_text=118 написано, что должно быть %ld и показано в примере.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:42 
Аватара пользователя
Ubermensch в сообщении #601650 писал(а):
Munin, мне в этих статьях многое непонятно почему-то. Но я уже интуитивно кое-что понял, чего раньше не мог понять.

Например что %ld - это место переменной.

Да. Надо точно согласовывать эту запись (которая называется "спецификация формата") с той переменной, которую вы считываете, и с тем, в каком виде ожидаете информацию во входном файле. Например,
%d - int
%ld - long int
%f - float
%lf - double
Особое внимание этому надо уделять для scanf - printf-то может вывести мусор, и всё, а scanf может записать мусор в память (причём даже в другие переменные), с фатальными последствиями для программы. Для 32-битных платформ обычно int совпадает с long int, так что и эти ошибки "прощаются", но вот float практически никогда не совпадает с double.

Ubermensch в сообщении #601650 писал(а):
Еще я правильно понял, что программа попорядку считывает числа? А уже второй прогон она не пойдет, так как дойдет до окончания файла?

Да, если пользоваться только этими функциями - только так. Но можно использовать функции rewind(), fseek(), fsetpos(), и считать файл по второму проходу (или даже перемещаться в любое место файла, например, запомнив его с первого прохода). Правда, большинство олимпиадных задач для этого не приспособлены, там вполне достаточно однопроходного чтения.

-- 31.07.2012 21:50:06 --

Ubermensch в сообщении #601655 писал(а):
Просто на http://acmp.ru/article.asp?id_text=118 написано, что должно быть %ld и показано в примере.

Это просто означает, что в условиях http://acmp.ru/ это работает. Это не значит, что это совсем уж правильно.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 21:07 
Аватара пользователя
Непонятно, почему не работает моя программа к этой задаче. Наверное из-за: i<100

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>

long a,c,b;

int main(){
  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout);
 
  for (int i=0; i<100; i++)
  { scanf("%ld",&a);
    if (a==0)
    {c++;}
    if (a==1)
    {if (c>b){b=c;};
     c=0;}}
     
   
  if (b>c) { printf("%ld",b);}
  else printf("%ld",c);
  return 0;
}
 

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 21:25 
Аватара пользователя
Здесь у вас во входном файле не раздельные числа, а идущие подряд символы. Их надо считывать иначе. И условие прекращения ввода написать - на случай, если символов будет меньше 100.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 13:57 
Аватара пользователя
Всё-таки у меня не выходит сделать эту задачку.

Вместо i<100 наверное нужно использовать EOF? И считывать в массив? А без массива можно?

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 14:59 
Аватара пользователя
Для считывания отдельных символов был приведён пример на http://acm.timus.ru/help.aspx?topic=cpp
Используется синтаксис C++
#include <stdio.h>
...
// characters
int c;
while ((c = getchar()) != EOF)
{
   ...
}


Нужно ли считывать в массив - зависит от конкретной задачи. В этой задаче - не нужно. Могу сказать задачу, в какой нужно: требуется вывести входную цепочку нулей и единиц в обратном порядке.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 15:22 
Аватара пользователя
Все равно проблема. Наверное из-за того, что данные записаны без пробела.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
int a,b,c,e;

int main(){
  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout);
 
int e;
while ((e = getchar()) != EOF){
     
     scanf("%ld",&a);
     if (a==0) {c++;}
     
     if (a==1){if (c>b){b=c;     }
     c=0;                        }
     e++;                        }
     
   
  if (b>c) { printf("%ld",b);    }
  else printf("%ld",c);
  return 0;
                                 }

 

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 17:37 
Аватара пользователя
[Facepalm]
getchar() и так уже осуществляет чтение символа из файла, а не только проверяет на конец файла. Вызывать после него scanf() не нужно.

И не надо так ужасно форматировать текст. Даже на Лиспе так не расставляют открывающие и закрывающие скобки...

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 17:44 
Ubermensch в сообщении #601883 писал(а):
Все равно проблема.
Замечание: у Вас не проинициализированы переменные b и c.
Не расчитывайте на обнуление по умолчанию. В зависимости от среды программирования и параметров проекта они могут оказаться заполнеными мусором.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 19:34 
Аватара пользователя
Ubermensch в сообщении #601883 писал(а):
Все равно проблема. Наверное из-за того, что данные записаны без пробела.

Проблема не в этом.

Во-первых, поместите объявления переменных a,b,c... внутрь функции main. Им незачем быть снаружи.
Во-вторых, дайте переменным осмысленные названия (например: MAX, NOW). Это улучшит понимание алгоритма.
В-третьих, переменных хватит и трёх.
В-четвёртых, как уже заметили, функцию scanf следует убрать вообще.
В-пятых, не используйте в конструкциях вида if (a==0) {c++;} двойные фигурные скобки: когда за условием следует один оператор, их можно опустить.
В-шестых, присвойте начальные значения переменным (тем, которым нужно), как вам уже подсказали.
И, наконец, в-седьмых, замените выражения вида if (a==0) на выражения вида if (a=='0'). Вы же считываете символ, и сравнивать его нужно с символом, а не с арифметическим значением.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 20:14 
Аватара пользователя
Mathusic в сообщении #601987 писал(а):
Во-вторых, дайте переменным осмысленные названия (например: MAX, NOW). Это улучшит понимание алгоритма.

Названия одними большими буквами лучше забронировать за константами, а не переменными. Кстати, константы, типа той же 100, полезно приучиться именовать.

Mathusic в сообщении #601987 писал(а):
Во-первых, поместите объявления переменных a,b,c... внутрь функции main. Им незачем быть снаружи.

Для нормального программирования совет справедливый, но для олимпиадного - неоднозначный. Часто бывает удобно набросать переменных в глобальной области видимости, чтобы писать алгоритм, разложенный в несколько функций, в условиях недостатка времени, не задумываясь о видимости. Разумеется, хорошей привычкой это не назовёшь, но на перетаскивание куска кода из функции в функцию с поправкой всех используемых переменных можно потратить драгоценные минуты.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 20:23 
Аватара пользователя
Munin в сообщении #602008 писал(а):
Названия одними большими буквами лучше забронировать за константами, а не переменными. Кстати, константы, типа той же 100, полезно приучиться именовать.

Да, согласен.

Munin в сообщении #602008 писал(а):
Для нормального программирования совет справедливый, но для олимпиадного - неоднозначный.

Ну в данном случае-то всё прозрачно :-)
А иногда, вроде бы, без них вообще не обойтись. Например, в некоторых задачах, когда нужно определить некую характеристику некоторой последовательности символов в файле за один проход.

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 22:21 
Аватара пользователя
Mathusic в сообщении #601987 писал(а):
Ubermensch в сообщении #601883 писал(а):
Все равно проблема. Наверное из-за того, что данные записаны без пробела.

Проблема не в этом.

Во-первых, поместите объявления переменных a,b,c... внутрь функции main. Им незачем быть снаружи.
Во-вторых, дайте переменным осмысленные названия (например: MAX, NOW). Это улучшит понимание алгоритма.
В-третьих, переменных хватит и трёх.
В-четвёртых, как уже заметили, функцию scanf следует убрать вообще.
В-пятых, не используйте в конструкциях вида if (a==0) {c++;} двойные фигурные скобки: когда за условием следует один оператор, их можно опустить.
В-шестых, присвойте начальные значения переменным (тем, которым нужно), как вам уже подсказали.
И, наконец, в-седьмых, замените выражения вида if (a==0) на выражения вида if (a=='0'). Вы же считываете символ, и сравнивать его нужно с символом, а не с арифметическим значением.


Спасибо. Просто начинка программы много раз изменялась, поэтому есть некоторые неточности.
Попробовал исправить, что написано. Все равно не выходит:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>

int main(){ int a,b=0,c=0,e=0;

  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout);
 

while ((e = getchar()) != EOF)
{     if (a=='0') c++;
      if (a=='1'){if (c>b){b=c;}}
      c=0;                     }
                       
     
   
  if (b>c) printf("%ld",b);    
  else printf("%ld",c);
  return 0;
                                 }

 

 
 
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 22:30 
Аватара пользователя
Ubermensch
Скажите, вы давно изучаете программирование вообще?

Почему вы пишете
Используется синтаксис C++
while ((e = getchar()) != EOF) // ввод символа в переменную e

и в следующей строчке
Используется синтаксис C++
if (a=='0') // как будто символ введён в переменную a

?

 
 
 [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group