Вопросы и ответы по программированию.

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#301 Сообщение 26.10.2012, 17:02

Госпаде. Твой пример -- месиво какое-то. Компилятор должен ругать тебя за такое. Да и здравый смысл.
Если в учебнике мешают код на С и код на С++, то это плохой учебник
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
nameless noob
Полковник
Полковник
Сообщения: 1682
Зарегистрирован: 01.09.2010
Откуда: Россия
Благодарил (а): 21 раз
Поблагодарили: 56 раз
Контактная информация:

#302 Сообщение 26.10.2012, 17:04

NiGHt-LEshiY
а в C read будет работать?
все вопросы к codeblocks, почему он меня не ругает
Изображение

Deus_Ex_Machina
Капитан
Капитан
Сообщения: 492
Зарегистрирован: 23.05.2010
Благодарил (а): 14 раз
Поблагодарили: 43 раза
Контактная информация:

#303 Сообщение 26.10.2012, 17:52

"Потоки" в С++ - одна из самых мерзких вещей, которые мне только приходилось видеть.

Аватара пользователя
nikit-xxx
Лейтенант
Лейтенант
Сообщения: 208
Зарегистрирован: 28.11.2007
Благодарил (а): 44 раза
Поблагодарили: 5 раз

#304 Сообщение 26.10.2012, 22:13

nameless noob
read() не пашет, потому что это нестатическая функция-член(нестатический метод) -- то есть она применяется только к объекту. не самый наглядный, но всё же пример

то есть чтобы не ругался компилятор надо писать что-то вроде
char *ap = new char[100];
cin.read(ap, 100);
// здесь какие-то попытки работы с массивом ap
delete[] ap;

Посмотри описание функции у Страуструпа - она не считывает один символ, она считывает не более 100 символов в область памяти по адресу ap, не добавляя терминальный нуль '\0' в конец... Из-за отсутствия '\0' среди ap[0]...ap[99] с ap нельзя работать как с C-строкой.(конечно, может быть '\0' там окажется случайно, или же при выходе за ap[99] тебе повезёт и программа при printf("%s", ap) не обвалится -- но так делать не надо)

Скорее всего, тебе нужна другая функция.
Последний раз редактировалось nikit-xxx 26.10.2012, 22:22, всего редактировалось 2 раза.
Откуда иксы в моём нике
Изображение
Изображение
скачать С. Прата. Язык программирования C++. Лекции и упражнения. 5-е изд (*Выровнена нумерация страниц, *Содержание)
Краткая инструкция по созданию пиратки-распака CS/HL
Изображение
Использование тэга подсветки синтаксиса
[syntax lang="cpp" lines="n"]
#include <iostream>
using namespace std;

struct cl{
static void f() { cout << "Hi, user!\n"; }
int i;
};

int main()
{
cl::f();
//cl::i = 1;
return 0;
}
[/syntax]

Аватара пользователя
Monk
VIP
VIP
Сообщения: 4713
Зарегистрирован: 21.11.2009
Благодарил (а): 418 раз
Поблагодарили: 1053 раза
Контактная информация:

#305 Сообщение 26.10.2012, 22:14

Deus_Ex_Machina писал(а):"Потоки" в С++ - одна из самых мерзких вещей, которые мне только приходилось видеть.
А ты писал на каком нибудь извращении, типа пролога или лиспа? :D
«По ночам компьютеры собираются вместе и смеются над людьми, если те делают работу, которую могли бы делать компьютеры» (с) habrahabr
 
[hide_num=64]Изображение
Изображение

Не стоит становиться на одно колено ради девушки, которая ради тебя не готова встать на два. (С)
640K ought to be enough for anybody (с) BG[/hide_num]

Аватара пользователя
nikit-xxx
Лейтенант
Лейтенант
Сообщения: 208
Зарегистрирован: 28.11.2007
Благодарил (а): 44 раза
Поблагодарили: 5 раз

#306 Сообщение 26.10.2012, 22:18

Monk писал(а):пролога
сдал на отл, так и не поняв как он по хитрому работает(препод нам объяснял как он из фактов ищет решение, но после 2-3 итерации мозг впадал в ступор)
Откуда иксы в моём нике
Изображение
Изображение
скачать С. Прата. Язык программирования C++. Лекции и упражнения. 5-е изд (*Выровнена нумерация страниц, *Содержание)
Краткая инструкция по созданию пиратки-распака CS/HL
Изображение
Использование тэга подсветки синтаксиса
[syntax lang="cpp" lines="n"]
#include <iostream>
using namespace std;

struct cl{
static void f() { cout << "Hi, user!\n"; }
int i;
};

int main()
{
cl::f();
//cl::i = 1;
return 0;
}
[/syntax]

Аватара пользователя
Monk
VIP
VIP
Сообщения: 4713
Зарегистрирован: 21.11.2009
Благодарил (а): 418 раз
Поблагодарили: 1053 раза
Контактная информация:

#307 Сообщение 26.10.2012, 22:21

Дикая штука, я сдавал за всю группу, но не сказал бы, что хоть что-то понял.
«По ночам компьютеры собираются вместе и смеются над людьми, если те делают работу, которую могли бы делать компьютеры» (с) habrahabr
 
[hide_num=64]Изображение
Изображение

Не стоит становиться на одно колено ради девушки, которая ради тебя не готова встать на два. (С)
640K ought to be enough for anybody (с) BG[/hide_num]

Аватара пользователя
nameless noob
Полковник
Полковник
Сообщения: 1682
Зарегистрирован: 01.09.2010
Откуда: Россия
Благодарил (а): 21 раз
Поблагодарили: 56 раз
Контактная информация:

#308 Сообщение 26.10.2012, 23:24

nikit-xxx писал(а):то есть чтобы не ругался компилятор надо писать что-то вродеchar *ap = new char[100];cin.read(ap, 100); // здесь какие-то попытки работы с массивом apdelete[] ap;Посмотри описание функции у Страуструпа - она не считывает один символ, она считывает не более 100 символов в область памяти по адресу ap, не добавляя терминальный нуль '\0' в конец... Из-за отсутствия '\0' среди ap[0]...ap[99] с ap нельзя работать как с C-строкой.(конечно, может быть '\0' там окажется случайно, или же при выходе за ap[99] тебе повезёт и программа при printf("%s", ap) не обвалится -- но так делать не надо)
:shock:
Изображение
Добавлено спустя 1 минуту 37 секунд:
и как мне считывать по одному числу за раз, расположенному между двумя слешами или пробелами?
Изображение

Аватара пользователя
nikit-xxx
Лейтенант
Лейтенант
Сообщения: 208
Зарегистрирован: 28.11.2007
Благодарил (а): 44 раза
Поблагодарили: 5 раз

#309 Сообщение 27.10.2012, 00:42

Если надо считать 5 таких строк
  • 1//2
  • 3// 4
  • 5 //6
  • 7 // 8
  • 9 //
    10
то наиболее простое, что приходит в голову

Код: Выделить всё

#include <stdio.h>

int main(void)
{
	int i;
	int status=1;//здесь надо инициализировать, чтобы в status не оказался "мусор", равный EOF
	for(i=0; i<5 && status!=EOF; ++i){//проходим цикл до первой встречи EOF, но не более 5-и итераций
		int xx, xy;
		printf("\ni=%d. put xx // yy: ", i);
		status = scanf(" %d // %d", &xx, &xy);
		printf("status=%d;  xx=%d, xy=%d\n", status, xx, xy);

		if(status!=2 && status!=EOF){
			printf("error. clearing stdin ...\n");
			while(getchar()!='\n'){}//очищаем поток stdin до символа '\n' включительно('\n' добавляется в поток при нажатии Enter)
		}
	}
	return 0;
}
Добавлено спустя 1 минуту 20 секунд:
да, лучше не использовать одновременно C и C++ системы ввода-вывода


Добавлено спустя 4 минуты 33 секунды:
Здесь можно нужно почитать про C

http://yadi.sk/d/kaDPePH303dd K&R
http://yadi.sk/d/exqc6xcx03dh K&R

http://yadi.sk/d/Eov1Bf7D03df Шилдт
http://cpp.com.ru/shildt_spr_po_c/index.html Шилдт online

Добавлено спустя 36 минут 8 секунд:
или так с break, хотя его не любят

Код: Выделить всё

#include <stdio.h>

int main(void)
{
   int i;
   int status;
   for(i=0; i<5; ++i){//проходим цикл до первой встречи EOF, но не более 5-и итераций
      int xx, xy;
      printf("\ni=%d. put xx // yy: ", i);
      status = scanf(" %d // %d", &xx, &xy);
      printf("status=%d;  xx=%d, xy=%d\n", status, xx, xy);

      if(status==EOF)
         break;

      if(status!=2){
         printf("error. clearing stdin ...\n");
         while(getchar()!='\n'){}//очищаем поток stdin до символа '\n' включительно('\n' добавляется в поток при нажатии Enter)
      }
   }
   return 0;
}
Откуда иксы в моём нике
Изображение
Изображение
скачать С. Прата. Язык программирования C++. Лекции и упражнения. 5-е изд (*Выровнена нумерация страниц, *Содержание)
Краткая инструкция по созданию пиратки-распака CS/HL
Изображение
Использование тэга подсветки синтаксиса
[syntax lang="cpp" lines="n"]
#include <iostream>
using namespace std;

struct cl{
static void f() { cout << "Hi, user!\n"; }
int i;
};

int main()
{
cl::f();
//cl::i = 1;
return 0;
}
[/syntax]

Deus_Ex_Machina
Капитан
Капитан
Сообщения: 492
Зарегистрирован: 23.05.2010
Благодарил (а): 14 раз
Поблагодарили: 43 раза
Контактная информация:

#310 Сообщение 27.10.2012, 19:58

Monk писал(а):А ты писал на каком нибудь извращении, типа пролога или лиспа? :D
Если твой мозг не может выйти за пределы императивной парадигмы, то это твои проблемы, а не языков.

Аватара пользователя
Monk
VIP
VIP
Сообщения: 4713
Зарегистрирован: 21.11.2009
Благодарил (а): 418 раз
Поблагодарили: 1053 раза
Контактная информация:

#311 Сообщение 27.10.2012, 20:12

Deus_Ex_Machina
если тебе не нравятся потоки в с++, это тоже твои проблемы.
«По ночам компьютеры собираются вместе и смеются над людьми, если те делают работу, которую могли бы делать компьютеры» (с) habrahabr
 
[hide_num=64]Изображение
Изображение

Не стоит становиться на одно колено ради девушки, которая ради тебя не готова встать на два. (С)
640K ought to be enough for anybody (с) BG[/hide_num]

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#312 Сообщение 27.10.2012, 20:36

Deus_Ex_Machina
Ну-ну.. Можно посмотреть на то, что за пределами "императивной парадигмы", выйти за пределы, етц. Но это же не значит, что это хорошо.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
nameless noob
Полковник
Полковник
Сообщения: 1682
Зарегистрирован: 01.09.2010
Откуда: Россия
Благодарил (а): 21 раз
Поблагодарили: 56 раз
Контактная информация:

#313 Сообщение 27.10.2012, 20:45

nikit-xxx
спасибо, но там всего одна строчка и где-то штук 10-15 чисел, в input.txt
Последний раз редактировалось nameless noob 27.10.2012, 21:32, всего редактировалось 1 раз.
Изображение

Deus_Ex_Machina
Капитан
Капитан
Сообщения: 492
Зарегистрирован: 23.05.2010
Благодарил (а): 14 раз
Поблагодарили: 43 раза
Контактная информация:

#314 Сообщение 27.10.2012, 21:31

NiGHt-LEshiY
Везде есть преимущества и недостатки.

Аватара пользователя
nikit-xxx
Лейтенант
Лейтенант
Сообщения: 208
Зарегистрирован: 28.11.2007
Благодарил (а): 44 раза
Поблагодарили: 5 раз

#315 Сообщение 27.10.2012, 22:24

nameless noob
в коде, что я привёл выше, пары чисел-через-дробь не обязаны быть на разных строках[txtspoil]- ты бы это понял, если бы самостоятельно прочитал в книжках (Г. Шилдт) как работает scanf()[/txtspoil]
nameless noob писал(а):nikit-xxx
спасибо, но там всего одна строчка и где-то штук 10-15 чисел, в input.txt
ну так перенаправь поток через freopen()[txtspoil], думаешь мне охота делать это за тебя?[/txtspoil]

nameless noob писал(а):где-то штук 10-15 чисел, в input.txt
чтобы тебя хорошо поняли, что конкретно ты хочешь от чисел-пробело-слэшей, какие их комбинации встретятся в файле, какие не встретятся, что надо делать если встретится неверная комбинация - надо описать поведение программы в таких ситуациях и привести примеры входных файлов. Если короче, ты плохоочень мутно формулируешь задачу.
Последний раз редактировалось nikit-xxx 27.10.2012, 22:37, всего редактировалось 4 раза.
Откуда иксы в моём нике
Изображение
Изображение
скачать С. Прата. Язык программирования C++. Лекции и упражнения. 5-е изд (*Выровнена нумерация страниц, *Содержание)
Краткая инструкция по созданию пиратки-распака CS/HL
Изображение
Использование тэга подсветки синтаксиса
[syntax lang="cpp" lines="n"]
#include <iostream>
using namespace std;

struct cl{
static void f() { cout << "Hi, user!\n"; }
int i;
};

int main()
{
cl::f();
//cl::i = 1;
return 0;
}
[/syntax]

Ответить Вложения 1