2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:25 
Заслуженный участник


04/05/09
4582
Ubermensch в сообщении #601650 писал(а):
Например что %ld - это место переменной.
Почитайте, наконец, учебники.
В данном случае, например, правильно будет "%d", а "%ld" - неправильно, хоть может и сработать.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:35 
Аватара пользователя


21/06/12
184
venco в сообщении #601653 писал(а):
Ubermensch в сообщении #601650 писал(а):
Например что %ld - это место переменной.
Почитайте, наконец, учебники.
В данном случае, например, правильно будет "%d", а "%ld" - неправильно, хоть может и сработать.

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

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:42 
Заслуженный участник
Аватара пользователя


30/01/06
72407
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 
Аватара пользователя


21/06/12
184
Непонятно, почему не работает моя программа к этой задаче. Наверное из-за: 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 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Здесь у вас во входном файле не раздельные числа, а идущие подряд символы. Их надо считывать иначе. И условие прекращения ввода написать - на случай, если символов будет меньше 100.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 13:57 
Аватара пользователя


21/06/12
184
Всё-таки у меня не выходит сделать эту задачку.

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

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


30/01/06
72407
Для считывания отдельных символов был приведён пример на 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 
Аватара пользователя


21/06/12
184
Все равно проблема. Наверное из-за того, что данные записаны без пробела.
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник
Аватара пользователя


30/01/06
72407
[Facepalm]
getchar() и так уже осуществляет чтение символа из файла, а не только проверяет на конец файла. Вызывать после него scanf() не нужно.

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

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 17:44 
Заслуженный участник


15/05/05
3445
USA
Ubermensch в сообщении #601883 писал(а):
Все равно проблема.
Замечание: у Вас не проинициализированы переменные b и c.
Не расчитывайте на обнуление по умолчанию. В зависимости от среды программирования и параметров проекта они могут оказаться заполнеными мусором.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 19:34 
Аватара пользователя


14/08/09
1140
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 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Mathusic в сообщении #601987 писал(а):
Во-вторых, дайте переменным осмысленные названия (например: MAX, NOW). Это улучшит понимание алгоритма.

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

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

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

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 20:23 
Аватара пользователя


14/08/09
1140
Munin в сообщении #602008 писал(а):
Названия одними большими буквами лучше забронировать за константами, а не переменными. Кстати, константы, типа той же 100, полезно приучиться именовать.

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

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

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

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение01.08.2012, 22:21 
Аватара пользователя


21/06/12
184
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 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Ubermensch
Скажите, вы давно изучаете программирование вообще?

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

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

?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group