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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2012, 17:53   #1
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию Хочу уточнить несколько моментов.

Вот задача.
Код:
/*
31.9 Дан файл f, компонентами которого являются целые положительные и отрицательные числа (положительных чисел ровно столько же 
сколько и отрицательных). Переписать компоненты файла f в файл g так, чтобы в файле g не было двух соседних чисел с одинаковым 
знаком.
*/

#include <iostream>
#include <string>
#include <vector>
#include <locale.h>
#include <conio.h>
#include <fstream>

using namespace std;

int main() {

setlocale(LC_ALL,"Russian");

string filename = "file1.txt";

ifstream ifs(filename.c_str());

string s,tmpstr;
vector<int> v;
int tmpvar = 0;

    while (!ifs.eof()) 
          s += ifs.get();

          int i = 0;
          int pos = 0;
          
    while (!ifs.eof()) {
          while (s[i] != ' ')
          {
               i = pos;
               tmpstr += s[i]; 
               pos = i;
               i++;                      
          }
                    tmpvar = atoi(tmpstr);
                    v.push_back(tmpvar);
          }
          
tmpvar = 0;
          
for (int i = 1; i < v.size() - 1; i++)
    for (int j = 1; j < v.size() - i; j++)
        if (v[i-1] < 0 && v[i] < 0)    
                   {
                       tmpvar = v[i+1];
                       v[i+1] = v[i-1];
                       v[i-1] = tmpvar;    
                   }  

string filename = "file2.txt";

ofstream ofs(filename.c_str());

for (int i = 0; i < v.size(); i++)
ofs >> v[i] >> " ";

cout << endl;

cout << "Нажмите любую клавишу...";
_getch();
return 0;    
}
Код нерабочий, собственно поэтому у меня возникло несколько вопросов.
1. Выдает ошибку
Цитата:
42 D:\code\current.cpp cannot convert `std::string' to `const char*' for argument `1' to `int atoi(const char*)'
как тогда используется atoi? Пробовал всяко. И никак не могу нигде найти внятного ответа, что означает запись
Код:
int a = char *c
?
Я понимаю, что переменной a присваивается величина переменной c, но не до конца. А если наоборот?
Код:
char *c = int a
?

2. Меня вот этот участок кода смущает. Пузырьковая сортировка, но верно ли она выполнена для поставленной задачи? По-моему, нет. Как здесь оптимальнее всего сделать?

Код:
for (int i = 1; i < v.size() - 1; i++)
    for (int j = 1; j < v.size() - i; j++)
        if (v[i-1] < 0 && v[i] < 0)    
                   {
                       tmpvar = v[i+1];
                       v[i+1] = v[i-1];
                       v[i-1] = tmpvar;    
                   }  
}
3. Вот на этом месте еще ошибка:

Код:
ofs >> s;
Цитата:
62 D:\code\current.cpp no match for 'operator>>' in 's >> ofs'
И еще одно.
Когда ошибки будут исправлены и программа заработает, как можно считать из файла, где последний разделитель - не пробел? Ответ почти очевиден, но...
Таким условием:

Код:
          while (s[i] != ' ' || s[i] != '\n')
          {
               i = pos;
               tmpstr += s[i]; 
               pos = i;
               i++;                      
          }
?

Спасибо за помощь!
Сейчас опять смотрю, код написан тупо. Уже мозг не соображает совсем. Но все равно буду рад ответам в теме.
Никто

мой блог

Последний раз редактировалось three_cats; 17.10.2012 в 18:08.
three_cats вне форума Ответить с цитированием
Старый 17.10.2012, 19:20   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
1. Выдает ошибку
Просто передайте ему char*
Код:
tmpvar = atoi(tmpstr.c_str());
Код:
int a = char *c
char *c = int a
Так нельзя писать совсем. Даже непонятно, что именно вы имели в виду. Уточните, где вы видели подобный код и как он в точности выглядел, или уточните, чего конкретно вы хотите добиться.
Цитата:
3. Вот на этом месте еще ошибка:
Стрелочки смотрят не туда. Куда направлена стрелка острием, туда данные и пишутся. Вы хотите записать из переменной в поток, поэтому стрелка должна смотреть от переменной в сторону потока. Ошибка стандартная, то и дело делается такая опечатка, со временем будете автоматически ее исправлять по первому же сообщению компилятора.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 18.10.2012, 04:40   #3
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Гром, премного благодарен!
Я просто хотел узнать, чем тип char* отличается от char.

Все равно не пойму, как передать char*.
Говорит, что не может сконвертировать из char в const char.
Никто

мой блог

Последний раз редактировалось three_cats; 18.10.2012 в 04:44.
three_cats вне форума Ответить с цитированием
Старый 18.10.2012, 17:59   #4
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

include stdlib.h
bedman вне форума Ответить с цитированием
Старый 19.10.2012, 03:32   #5
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Цитата:
Сообщение от three_cats Посмотреть сообщение
чем тип char* отличается от char.
char - символ
char* - указатель на символ (массив символов т.е. строка)
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение эпюр изгибающих моментов, поперечных и продольных сил Yungo161 Общие вопросы Delphi 7 13.05.2012 20:31
Уточнить корень методом интеграций Сергей_PSV Помощь студентам 5 14.04.2011 14:16
хотелось бы уточнить один момент... selestenka Помощь студентам 4 04.01.2009 20:14