Создать двоичный файл и записать в него n целых чисел. Сформировать массив из элементов исходного файла, внеся в него числа, расположенные в файле до мин. эл. и после макс..
Вот есть две строчки:
int *a,*b; - тут b -указатель на массив целых чисел
fprintf(g,"%f ",b[i]); - а тут его элемент выводится как float
Несостыковочка, хотя. как мне кажется, студия бы обработала сие нормально, хотя в файле были бы ужасы))
гы ))
действительно стоило заменить f на i и все заработало ))))
Лаба №7
Удалить в строках с заданными номерами числа-палиндромы.
Вот есть прога для определения, простое число или нет.
По-моему, лучше с нуля написать...
Сделать ввод с клавиатуры отдельной функцией как тут. Но добавить сразу проверку ввода (нельзя вводить ничего кроме чисел, пробела и переноса строки), и сделать динамическое выделение памяти (чтобы макс. длина строки не была ограничена) - второе, в принципе, не обязательно.
Сделать функцию разбиения на подстроки, разделенные пробелами - на вход поступает char*, на выходе char** и количество строчек в массиве.
И, наконец, функцию проверки, является ли строка палиндромом.
В main останется разбить на строки, а затем пробежаться по массиву строк и вывести только те, которые палиндромами не являются.
я ни фига не разбираюсь в строках, так что будем все по порядку делать
функция так получиться?
Во)) Вот тут паскаль отличается от С. Я не дюже силён в паскале, но знаю, что там в начале строки-массива хранится количество символов в строке. В С такого нет, здесь строка - массив символов, ограниченный символом с кодом 0 ('\0').
а - указатель на начало массива, +i - это мы прибавляем к указателю (адресу) смещение равное i его элементам. В нашем случае мы работаем с char, его размер в большинстве случаев = 1 байту, значит, указатель увеличивается на i байт.
*(a+i) - это разыменовывание (кажется, так называется).
*x - получение значения по адресу x. Если бы мы написали a+i=x это было бы, во-первых, неверно, потому что сумма не является lvalue (ей нельзя присвоить значение). Но и в случае, если у нас там был бы просто указатель операция была по смыслу неверной, так как мы должны изменять не адрес, а значение по этому адресу.
Соответственно
*(a+i)=с; - записываем в текущую позицию считанный символ.
*(a+i)='\0'; - записываем в текущую позицию 0, показываем, что строчка завершена.
Путанно получилось, ну уж не обессудьте...((
вроде понятно, более менее (время покажет).
функция то вроде правильная, но ругается как раз на lvalue required в сторочке с if.
и как должна функция разбиения на строки выглядеть?
a[i]=' '||a[i]='\n'
Вместо = нужно == поставить, но проблема не в этом, проблема похоже в *(a+i).
Нашёл ещё пару косяков, например, если ввести строчку длиной ровно в maxlenth, будет ошибка, есть и другие, но мне легче было переписать.
== , все время забываю про него, зараза такая
Так, терь насчет разбиения на строки, я так понял идея такая, когда мы доходим до конца строки то создается еще одна строка char s2 так сказать и так до тех пор пока вместо \0 она не встретит . ?
тут вариантов куча....
Смотря, как решать основную задачу...
Под
не, вроде так,
вводишь несколько строк затем указываешь в каких из них нужно удалить числа палиндромы
ну, тогда край построчно читать
Если строка из тех,что надо обрабатывать, в функцию её передаём, а возвращённую выводим на печать.
Если не из тех - просто на печать
Посмотри gets/wgets
эээ... куда... какой край... я еще не разобрался с разбиением на строки
как оформить его?
))) я имел в виду, что без разбиения на строки не обойтись
край=обязательно, без этого никак))
надо читать построчно
обрабатывать строку, если нужно
и выводить её на печать
читать построчно можно функцией gets (MS советуют fgets как более безопасную), но при этом нужно задавать максимальную длину строки.
PS. Помог бы паскалянтам в соседних темах))
забыл еще написать, весь наш ввод оканчивается точкой(в последней строке, в самом конце обязательно ставиться точка (индикатор конца ввода)).
так что на счет разбиения на стороки? там что-то типа такого должно быть
if a[i]=='\n' //создаем char c2(не знаю как записать)
else (значит место \n попалась точка) return 0;
P.S. там граф уже помогает
еще вопросик не потеме
в проге которую я вначале показывал, что вот тут делается
Сильно будет смущать, если ограничена максимальная длина строки?
Если не смущает, то делаем буфер и в него построчно читаем. Про функцию fgets чего не почитал?)
stdin это должен файл с данными быть?
что то я уже перестал что либо понимать
эм... нет. stdin - это структура FILE* соответствующая стандартному потоку ввода. В нашем случае - консоли.
Вопросы:
for(i=0;i<n;i++) - n имеется ввиду '\0' или может maxlen или что?
массив arr[i] - это наш массив с первой строчкой, который у меня выше был как s[maxline]?
process(buffer) - это функция определения является ли число палиндромом?
strlen - это кто?
strlen - функция, принимает на вход строку, завершающуюся нулём, возвращает длину строки.
вся строчка сразу, ограничено либо \0, либо \n
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)