Member
Статус: Не в сети Регистрация: 17.11.2003 Откуда: Петроской
Комрады, есть 2 вопросика, которые не дают мне покоя:
1. Во всех учебниках, а также нам на лекциях говорили, о том, что при сравнении
Код:
while( (c=getchar()) != EOF)
в самых простейших программах нужно, стобы С было int, и ни в коем случае не char, так как EOF это "-1", а char от 0 до 255 и минус единица преобразуется в 255 и цикл никак не завершиться, все это понятно, но скажите ПОЧЕМУ программы работают, если ставить переменную С как char ? также, как и использование fgetc в работе с файлами и сравнение с EOF 2.составил программу, все работает, отлично, но решил выделять память динамически с функцией calloc или malloc и возникает в хаотичном порядке ошибка segmentation fault при работе, программы пишутся под SUSE linux вот что, мне кажется привело к ошибке
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
maslyak писал(а):
Комрады, есть 2 вопросика, которые не дают мне покоя: 1. Во всех учебниках, а также нам на лекциях говорили, о том, что при сравнении
Код:
while( (c=getchar()) != EOF)
в самых простейших программах нужно, стобы С было int, и ни в коем случае не char, так как EOF это "-1", а char от 0 до 255 и минус единица преобразуется в 255 и цикл никак не завершиться, все это понятно, но скажите ПОЧЕМУ программы работают, если ставить переменную С как char ? также, как и использование fgetc в работе с файлами и сравнение с EOF 2.составил программу, все работает, отлично, но решил выделять память динамически с функцией calloc или malloc и возникает в хаотичном порядке ошибка segmentation fault при работе, программы пишутся под SUSE linux вот что, мне кажется привело к ошибке
1. Ну ты просто в переменную с записываешь то что возвращает функция getchar() и уже это сравниваешь..
P.S. пользуясь моментов хочу передать всем привет, и прошу помочь мне в следущей задаче:
необходимо организовать кольцевую очередь для хранения следующих данных:
- наименование устройства,
- год выпуска,
-стоимость.
Обеспечить выполнение операций:
- добавление элемента в очередь,
- удаление элемента из очереди,
- прокрутку очереди,
- определение позиции заданного элемента в очереди,
- нахождение суммарной стоимости устройств,
- распечатка содержимого очереди,
- формирование списка из элементов с заданным значением некоторого поля.
просто помогите сделать эту структыру..или что это.и как обращаться с её элементами?
Всё это на С++. Заранее спасибо )
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
maslyak, насчет первого-черт его знает, факт что работает.
По второму- наверно, выскакивает ошибка, когда комбинация в файле не встречается? Проблема не там. Если комбинация в файле не встречается- у тебя
остается неинициилизированный указатель slovo, который ты затем пытаешься уничтожить. Исправь: вместо char *slovo- char *slovo=NULL и вместо
free(slovo)- if (slovo) free(slovo). Добавлено спустя 29 минут, 52 секунды pretorian
Код:
struct device { char name[20]; int year; int cost; device *next; };
У последнего элемента next ссылается на первый- вот и получится кольцевая очередь. Хранишь в программе указатель на первый элемент- отсюда и отталкиваешься. Работаешь как с обычной структурой. Например, добавление элемента будет реализовываться так:
Код:
device* now=first; while (now->next!=first) now=now->next; now->next=new device; //также можно использовать malloc now=now->next;
Member
Статус: Не в сети Регистрация: 05.09.2006 Откуда: (UA)Dnepr
kexman писал(а):
Что обозначает эта .f?
float Добавлено спустя 5 минут, 59 секунд
maslyak писал(а):
1. Во всех учебниках, а также нам на лекциях говорили, о том, что при сравнении Код: while( (c=getchar()) != EOF) в самых простейших программах нужно, стобы С было int, и ни в коем случае не char, так как EOF это "-1", а char от 0 до 255 и минус единица преобразуется в 255 и цикл никак не завершиться, все это понятно, но скажите ПОЧЕМУ программы работают, если ставить переменную С как char Безумный ? также, как и использование fgetc в работе с файлами и сравнение с EOF
Чтото путаеш. Диапазон чара "-127" - "128". Ноль кстати отрецательное число Добавлено спустя 1 минуту, 17 секунд Это если прямо скажеш шо беззнаковый.... тада твоя правда Добавлено спустя 3 минуты, 24 секунды
pretorian писал(а):
P.S. пользуясь моментов хочу передать всем привет, и прошу помочь мне в следущей задаче: необходимо организовать кольцевую очередь для хранения следующих данных: - наименование устройства, - год выпуска, -стоимость. Обеспечить выполнение операций: - добавление элемента в очередь, - удаление элемента из очереди, - прокрутку очереди, - определение позиции заданного элемента в очереди, - нахождение суммарной стоимости устройств, - распечатка содержимого очереди, - формирование списка из элементов с заданным значением некоторого поля.
просто помогите сделать эту структыру..или ч
Вы пан, ето, напишите это сами. Подобные задачки помогают потом безпроблемно мыслить более высокими категориями. Добавлено спустя 41 секунду Подсказываю: смотри в сторону двунаправленного списка.
Цитата:
просто помогите сделать эту структыру
struct nazoviMenja
{
std::string imjaUstroystva;
unsigned int godVipuska;
int cenaVCopeykah;
};
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
Alex12 писал(а):
maslyak,
Код:
device* now=first; while (now->next!=first) now=now->next; now->next=new device; //также можно использовать malloc now=now->next;
//здесь будет инициализация полей нового элемента
now->next=first;
а где будут храниться данные по всем элементам? я не очень понимаю эту тему..я бы сделал массив структур..но как тогда добавлять ещё элементы... и, если возможно, обясните поподробней этот код..
Код:
device* now=first; while (now->next!=first) now=now->next; now->next=new device; //также можно использовать malloc now=now->next;
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
pretorian зачем два раза один код скопировал?
В first хранится данные для первого элемента. У него есть поле next, которое указывает на следующий элемент. В том свою очередь хранятся данные второго элемента, а next указывает на следующий и т.д.
Этот код делает следующее- просматривает элементы, пока не дойдет до последнего, т.е. такого, у которого next указывает на first, затем next заменяется на новый элемент, потом заполняем поля этого элемента(это в коде опущено) и наконец присваеваем next этого нового элемент first, сохраняя циклическую очередь.
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
Зависит по какому критерию его удалять. Например, если нужно удалить элемент с определённым именем, то это выглядит так
Код:
int element_delete(char *delete_name) { device *now=first; device *tmp; while (strcmp(now->next->name,delete_name)) { now=now->next; if (now==first) { printf("List hasn't element with such name\n"); return 1; } } if (now->next==first) first=first->next; tmp=now->next; now->next=now->next->next; delete tmp; return 0; }
Здесь подразумевается, что first-глобальная переменная. Если она объявлена
в main(), то заголовок функции будет выглядить как int element_delete(char *delete_name,device *first).
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
first-глобальная переменная какого типа?
А при удалении элемента не надо както высвобождать память?
а в циклической очереди есть нумерация элементов? Ну чтобы можно было удалить второй, или третий...по номеру т.е.
И что вот эта строчка значит:
Код:
while (strcmp(now->next->name,delete_name)) {
пока имя текущего элемента совпадает с именем удаляемого?
Member
Статус: Не в сети Регистрация: 14.08.2004 Откуда: Москва
Приветствую! Подскажите пожалста откуда можно скачать Borland C++ 5.02 или выше?? Билдер не нужен... Дайте ссылку пожалста - уже почти час мучаю яндекс - нифига найти не могу
Member
Статус: Не в сети Регистрация: 30.01.2006 Откуда: Минск
pretorian, мда, как все запущено.
Разумеется first переменная типа device *. Высвобождает память оператор delete. Если не нравится такой способ-можешь использовать free.
Функция strcmp возвращает 0, когда две строки равны, т.е. этот цикл выполняется, пока имена не равны. Добавлено спустя 14 минут, 53 секунды Насчет номеров- а ты где-нибудь в структуре их видишь?
Заводишь счетчик присваиваешь начальное значение 1. Затем просматриваешь элементы начиная с первого и каждый раз при переходе к следующему увеличиваешь счетчик на 1. Так продолжаешь, пока счетчик не достигнет нужного значения и удаляешь текущий элемент
Member
Статус: Не в сети Регистрация: 09.08.2005 Откуда: Земля
Помомогите составить программу использующую массив, или хотя бы объясните что это такое массив.!!
Нужно составить программу для вычисления Y=(U+T)*(S+2),где
S-произведение положительных элементов массива
T-номер неаименьшего по модулю массива
U-количество ненулевых элементов массива
Массив объявляется на 10 элементо вещественного типа.
Размер рабочего массив определяется пользователем(от 0 до 10).
В результате работы программы должен быть представлен исходный одномерный массив и результат обработки этого массива.
Сейчас сам пробую её написать, только что не получается.Ну не понять мне массивов! Заранее благодарен
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
хоть бы написал на каком языке....
да и массивы это просто...представь себе что массив это железнодорожный состав, из кучи вагонов. в каждом вагоне чтото есть. Вагоны нумеруются слева- направо, начиная с нуля( ну вобщем смотря где...)
тю блин..это ж ветка про С++, чтото я туплю..
вот примерный набросок:
Код:
#include <conio.h> #include <iostream.h> #include <math.h> void main() { float f[10]; //рас уж он должен быть на 10 элементов то пусть статический будет. int n; cout<<"Введите число элементов массива (0<n<10)...\n"; cin>>n; if (n>0 && n <=10) for (int i=0;i<n;i++) { cout<<"Введите "<<i+1<<"й элемент массива!\n"; cin>>f[i]; } float S=1; //нахождение произв-я полож-х эл-в for (int i=0;i<n;i++) if (f[i]>0) S=S*f[i];
//Поиск номера минимального числа по модулю int T; float min; min=f[0];T=0; for (int i=0;i<n;i++) if (abs(f[i+1])<min) { min=abs(f[i+1]); T=i; } //подсчет кол-ва ненулевых элем-в массива. int U; U=0; for (int i=0;i<n;i++) if (f[i]<>0) U++;
struct device { char name[20]; int year; int cost; device *next; };
device* first;
int addnew(char N[20], int Y, int C) { device* now=first; while (now->next!=first) now=now->next; now->next=new device; //также можно использовать malloc now=now->next; //now->name =N; strcpy(now->name ,N); now->year =Y; now->cost =C;
Member
Статус: Не в сети Регистрация: 09.08.2005 Откуда: Земля
2 pretorian: я пока пытаюсь выучить простой С, а ты написал прогу на С++?.Не можешь показать как она выглядит на С Добавлено спустя 59 секунд 2 pretorian: я пока пытаюсь выучить простой С, а ты написал прогу на С++?.Не можешь показать как она выглядит на С.
Всё равно огромный респект!!!!
Member
Статус: Не в сети Регистрация: 31.08.2005 Откуда: Мир
LiS95 писал(а):
2 pretorian: я пока пытаюсь выучить простой С, а ты написал прогу на С++?.Не можешь показать как она выглядит на С Добавлено спустя 59 секунд 2 pretorian: я пока пытаюсь выучить простой С, а ты написал прогу на С++?.Не можешь показать как она выглядит на С. Всё равно огромный респект!!!!
Никогда не учил С, но я думаю выгледит похоже)
кажется вместо cout надо print писать, а вместо cin чтото ещё...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения