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

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

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

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

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

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

Решаю задачу около 5 дней. Мозг на вынос, не получается.
В файле in.txt есть числа:
PHP код:
4 3 2 1 3// цифры которые нужно сложить и отнять первое, т.е 3+2+1+3-4.
2 3 5 // 2+3+5-2
6 7 7 7 7 7 7 // 6+7+7+7+7+7+7-6 
Запускаем 2 цикла, первый читает пока не конец файла. Внутренний сканирует каждую строку, пока не конец строки, т.е сканирую числа, добавляю каждое в вектор.
Затем нахожу их сумму и отнимаю v.front(), т.е первое число вектора, и оно должно быть в первой строке 4, во второй 2, в третьей 6, но оно почему-то выводит принимает за первое число вектора второе число строки, т.е в первой 3, во второй 3, в третьей 7. Что за дела такие, как нормально написать? Вот мой код, что нужно там исправить? Помогите пожалуйста, ато все мозги вынес.
PHP код:
#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<intv;

   

      while(
fscanf(f1,"%d",&s) == 1)
      {
      
v.clear();
      
    while((
fscanf(f1,"%c",&c)==1) && (!= '\n'))
    {
          
         
fscanf(f1,"%d",&a); v.push_back(a);
      
sa;

   
                             }
         
fprintf(f2,"%d\n",s-v.front());  
                                            }
                                                        } 
То, что выводит:
Код:
10
8
41
А должно:
Код:
9
9
40

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

Сложить все числа и отнять первое - это, на секунду, то же самое, что сложить все кроме первого.
А почему у Вас так получается - так первое число строки Вы уже прочитали в s, поэтому оно не будет прочитано в a и, соответственно, не будет записано в v.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 15:49   #3
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Сложить все числа и отнять первое - это, на секунду, то же самое, что сложить все кроме первого.
А почему у Вас так получается - так первое число строки Вы уже прочитали в s, поэтому оно не будет прочитано в a и, соответственно, не будет записано в v.
Но оно же читается в а и складывается, если искать просто сумму строк тогда все нормально.
А как тогда зделать?
dimon9 вне форума Ответить с цитированием
Старый 01.11.2012, 15:58   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Сообщение от dimon9 Посмотреть сообщение
Но оно же читается в а и складывается, если искать просто сумму строк тогда все нормально.
А как тогда зделать?
Нет, Вы неправильно понимаете. Скажем, строка "2 3 5":
В s прочитано 2.
v очищен. (v = ())
В c прочитано ' '.
В a прочитано 3.
В конец v добавлено 3. (v = (3))
К s прибавлено a. (s = 5)
В c прочитано ' '.
В a прочитано 5.
В конец v добавлено 5. (v = (3, 5))
К s прибавлено a. (s = 10)
В c прочитано '\n'.
Выводим s-v.front() = 10-3 = 7.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 16:03   #5
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Нет, Вы неправильно понимаете. Скажем, строка "2 3 5":
В s прочитано 2.
v очищен. (v = ())
В c прочитано ' '.
В a прочитано 3.
В конец v добавлено 3. (v = (3))
К s прибавлено a. (s = 5)
В c прочитано ' '.
В a прочитано 5.
В конец v добавлено 5. (v = (3, 5))
К s прибавлено a. (s = 10)
В c прочитано '\n'.
Выводим s-v.front() = 10-3 = 7.
Да, это так. Но вот как тогда зделать, так как нужно. Сложить все элементы кроме первого. Если брать в учет, то что Вы написли, оно мне и должно сразу выводить сумму которую мне нужно, без первого элмента, но оно каким-то боков выводит сумму все строки. Вот я и пытался отнять этот "первый" элемент. И обратите внимаение, сумму строки выводит правильно. Т.е "2 3 5", оно выведет 10, а если отнимать v.front() то выведет 7, я это понял. Встает вопрос, почему в первом случае выводит 10, и как сделать, что бы выводило 8?
Вот код, что выводит 10.
Код:
#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;

   

      while(fscanf(f1,"%d",&s) == 1)
      {
      v.clear();
      
    while((fscanf(f1,"%c",&c)==1) && (c != '\n'))
    {
          
         fscanf(f1,"%d",&a); 
      s= s + a;

   
                             }
         fprintf(f2,"%d\n",s);  
                                            }
                                                        }

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

Цитата:
Если брать в учет, то что Вы написли, оно мне и должно сразу выводить сумму которую мне нужно, без первого элмента
Пожалуйста, уделите немного внимания моему комментарию выше. В нём явно показано, каким образом получается так, что значение s не равно сумме всех элементов v. Обратите внимание: после первых двух пунктов v пуст, а s уже не равно нулю.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 16:17   #7
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Пожалуйста, уделите немного внимания моему комментарию выше. В нём явно показано, каким образом получается так, что значение s не равно сумме всех элементов v. Обратите внимание: после первых двух пунктов v пуст, а s уже не равно нулю.
Все, спасибо. Вот код. Я сразу после в первом цикле очищаю вектор, для последующих строк. Потом, в вектор кладу s. Ну и в конце отнимаю этот единственный элемент вектора. Все получилось.
PHP код:
#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<intv;
   

  

      while(
fscanf(f1,"%d",&s) == 1)
      {
      
v.clear();
      
v.push_back(s);
      
    while((
fscanf(f1,"%c",&c)==1) && (!= '\n'))
    {
          
         
fscanf(f1,"%d",&a); v.push_back(a);
      
sa;

   
                             }
         
fprintf(f2,"%d\n",s-v.front());  
                                            }
                                                        } 
Но это еще, к сожалению, не конец. Второй вариант задачи, зная количество строк, сложить элементы строки кроме первого числа.
Т.е в in.txt
PHP код:
3//количество строк
2 3 4
1 9
4 1 2 3 4 
Вот тут у меня была идея просто заменить первый цикл
PHP код:
while(fscanf(f1,"%d",&s) == 1
на
PHP код:
fscanf(f1,"%d",&n);
for(
i=0;i<n;i++) 
Но не тут то было, выводит бред. Подкиньте пожалуйста идейку сново.
dimon9 вне форума Ответить с цитированием
Старый 01.11.2012, 16:22   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

???
Не вполне ясно задание. То есть, найти сумму всех предыдущих выведенных чисел?
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 16:26   #9
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
???
Не вполне ясно задание. То есть, найти сумму всех предыдущих выведенных чисел?
в in.txt содержится элемент n, он обозначает количество строк.
PHP код:
// количество всех строк
2 3 3 // первая строка
1 3// вторая строка
4 1 2 3 4 // третья строка 
Задание анолоично предыдущему, только в этом, мы знаем сколько строк содержит файл. Конечно тут можно игнорировать
PHP код:
// количество всех строк 
вообще, но в тестах может быть что написано строк 3, а в файле их будет 10, например, но нам нужно знать сумму только трех каждых строк, без первого элемента. А нам выведет 10, это если решать первым кодом, по которуму у меня были вопросы.
Вот
PHP код:
// количество всех строк, сумму чисел которых нам нужно найти, без первого элемента
2 3 3 // первая строка
1 3// вторая строка
4 1 2 3 4 // третья строка
5 1 1 1 1 1 // четвертая 
1 9 // пятая
2 89 9// шестая 
6 6 1 2 3 4 5//седьмая 
Как видите, тест может быть такой, но нам нужно найти только сумму чисел без первого элемената в 3 строках.
Если применять алгоритм, который у меня получилось зделать, по тесту, где не написано сколько строк в файле, то мне выведет сумму чисел без первого элемента всех семи строк. А надо ведь, только 3-х.

Последний раз редактировалось dimon9; 01.11.2012 в 16:36.
dimon9 вне форума Ответить с цитированием
Старый 01.11.2012, 17:02   #10
dimon9
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 15
По умолчанию

Ура решил и второй вариант. В первый цикл просто добавил условие еще одно.
Код:
#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 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложение и вычитание двух листов Alex Fergusson Microsoft Office Excel 19 25.07.2013 12:46
IEEE 754 Сложение, вычитание _PROGRAMM_ Помощь студентам 3 27.08.2012 09:03
Сложение и вычитание дат и времени apx_angel PHP 1 08.05.2011 15:21
Сложение, вычитание в двоичной системе счисления Vemor Паскаль, Turbo Pascal, PascalABC.NET 5 16.06.2009 14:02
Переопределение операций(сложение,вычитание...) master_root Общие вопросы Delphi 3 18.06.2008 20:20