Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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


Ответ
 
Опции темы
Старый 01.11.2012, 16:10   #1
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию Сканирования строк. Зная количество строк и первый элемент, это количество символов с троке.

Предыдущая тема - http://programmersforum.ru/showthread.php?t=216190
Там было решено. Осталось последнее задание.

В in.txt содержаться числа, первая строка - количество строк в файле, каждый первый элемент, это количество символов с каждой строке. Найти сумму каждой строки.
PHP код:
// количество всех строк 
2 3 3 // первая строка, число 2 является показателем сколько чисел в этой строке
1 3// вторая строка, число 1 является показателем сколько чисел в этой строке
4 1 2 3 4 // третья строка, число 4 является показателем сколько чисел в этой строке 
Загвоздка в том, что нужно брать первый элемент, как количество чисел, и слаживать их до тех пор пока не конец строки. Как это реализовать, брать три цикла чтоли? Первый пока не конец файла и пока z не равно количеству трок - n; Третьий цикл, не понятно что писать... подкиньте идейку пожалуйста

Код:
#include <cstdio>
#include <vector>
using namespace std;
FILE *f1,*f2;
int i,a,n,k,j,z,s;
char c;

int main()
{
    f1=fopen("input.txt","r+");
    f2=fopen("output.txt","w+");
   vector<int> v;
   

  fscanf(f1,"%d",&n);

      while((fscanf(f1,"%d",&s) == 1) && (z<n) ) // пока не конец файла и пока z меньше n, т.е количество строк, с которыми нам нужно работать. строго меньше, так как в с++ первый элемент отпределяется нулем.
      {
      v.clear();
      v.push_back(s);
      
    while((fscanf(f1,"%c",&c)==1) && (c != '\n'))
    {
          
         fscanf(f1,"%d",&a); v.push_back(a);
      s= s + a;
// Вот а что писать в третьем цикле???
   
                             }
         fprintf(f2,"%d\n",s-v.front());  
         z++;
                                            }
                                                        }

Последний раз редактировалось dimon9; 01.11.2012 в 16:13.
dimon9 вне форума Ответить с цитированием
Старый 01.11.2012, 16:13   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Обычно такие формулировки подразумевают, что числа "честные" (т.е. предназначены для экономии сил программиста, а не для создания ему дополнительных проблем). Вы уверены, что в Вашем случае это не так?
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 16:22   #3
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Обычно такие формулировки подразумевают, что числа "честные" (т.е. предназначены для экономии сил программиста, а не для создания ему дополнительных проблем). Вы уверены, что в Вашем случае это не так?
Т.е четные, в тестах все числа будут делится на 2 без остатка? А причем тут это?
dimon9 вне форума Ответить с цитированием
Старый 01.11.2012, 16:27   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Честные. То есть, если первое число в строке - 4, то следом всегда будут ровно 4 числа. Это стандартное соглашение для всяких олимпиадных и квазиолимпиадных задач, как раз чтобы люди не мучались с ловлей '\n', конца файла и т.д.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 16:33   #5
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Честные. То есть, если первое число в строке - 4, то следом всегда будут ровно 4 числа. Это стандартное соглашение для всяких олимпиадных и квазиолимпиадных задач, как раз чтобы люди не мучались с ловлей '\n', конца файла и т.д.
Простите, прочитал как чеТные. Но в моем случае скорее не так. Но если они честные, то должно прокатывать решение с отнимание первого, как я делал в предыдущих темах. Т.е нужно брать самый последний код в той теме.
dimon9 вне форума Ответить с цитированием
Старый 01.11.2012, 18:37   #6
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Первая строка проходит нормально. Но во второй все время выводит 0. В чем ошибка?
Код:
#include <cstdio>
#include <vector>
using namespace std;
FILE *f1,*f2;
int i,a,n,k,j,z,s,l,res;
char c;

int main()
{
    f1=fopen("input.txt","r+");
    f2=fopen("output.txt","w+");
   vector<int> v;
   

  fscanf(f1,"%d",&n);

      while((fscanf(f1,"%d",&s) == 1) && (z<n) )
      {
      k = s;
      res = 0;
    while((fscanf(f1,"%c",&c)==1) && (c != '\n') && (l<k))
    {
          
         fscanf(f1,"%d",&a);
         res = res + a;
        
        l++;
         
         }
         fprintf(f2,"%d\n",res);  
         z++;
                                            }
                                                        }

Последний раз редактировалось dimon9; 01.11.2012 в 18:56.
dimon9 вне форума Ответить с цитированием
Старый 01.11.2012, 19:07   #7
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Более правильный код.
Но теперь если записывать больше чисел чем написано в начале строки
например
Код:
3 // количество всех строк  
2 3 3 // первая строка, число 2 является показателем сколько чисел в этой строке 
1 3 3 3 3 1 1 1// нужно сумму только первой 1 цифры т.е 1 тройки
4 9 2 1 4 3 3 3 3 3 3 3 3 3// нужна сумма только первых 4 чисел т.е 8,2,1,4
То первую строку читает, остальные выводит бред. Помогите уже кто.
Код:
#include <cstdio>
#include <vector>
using namespace std;
FILE *f1,*f2;
int i,a,n,k,j,z,s,l,res;
char c;

int main()
{
    f1=fopen("input.txt","r+");
    f2=fopen("output.txt","w+");
   vector<int> v;
   

  fscanf(f1,"%d",&n);

      while((fscanf(f1,"%d",&s) == 1) && (z<n) )
      {
      res=0;
      k = 0;
      k = s;
      l=0;
    while((fscanf(f1,"%c",&c)==1) && (c != '\n') && (l<k))
    {
          
         fscanf(f1,"%d",&a);
         res = res + a;
        
        l++;
         
         }
         fprintf(f2,"%d\n",res);  
         z++;
                                            }
                                                        }
dimon9 вне форума Ответить с цитированием
Старый 02.11.2012, 09:24   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Когда Вы дошли до вывода res, если из цикла вышли не по условию c!='\n', надо прочитать остаток строки. Поставить что-то вроде
Код:
if(c!='\n') while((fscanf(f1,"%c",&c)==1) && (c != '\n')) ; //Пустой цикл
Abstraction вне форума Ответить с цитированием
Старый 02.11.2012, 21:40   #9
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Когда Вы дошли до вывода res, если из цикла вышли не по условию c!='\n', надо прочитать остаток строки. Поставить что-то вроде
Код:
if(c!='\n') while((fscanf(f1,"%c",&c)==1) && (c != '\n')) ; //Пустой цикл
Спасибо вам за помощь.
dimon9 вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести последовательность строк. Подсчитать количество совпадающих строк. на языке SHELL lj23lj Фриланс 1 30.03.2012 15:41
Подсчитать количество букв "А" в предложении и общее количество букв.В тексте из файла несколько строк. kvas91 Общие вопросы C/C++ 3 14.11.2010 16:51
Матрица. Посчитать количество строк, содержащих хотя бы один нулевой элемент Геля007 Общие вопросы C/C++ 0 02.06.2010 15:17
Дан текстовый файл. Вывести количество содержащихся в нем символов и строк Настенька..Блонди Помощь студентам 4 12.02.2009 19:28
Определение количество символов в строке, и самих строк. Патрон Общие вопросы Delphi 10 01.04.2008 11:43


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя