InFuz
Сообщение
#57258 3.5.2010, 17:30
Создать двоичный файл и записать в него n целых чисел. Сформировать массив из элементов исходного файла, внеся в него числа, расположенные в файле до мин. эл. и после макс..Код
# include <iostream.h>
# include <stdio.h>
# include <conio.h>
//-----------------------------------------------------------------
void main()
{
clrscr();
FILE *f;
int i,n;
int a;
f=fopen("input.dat","wb");
cout<<"n="; cin>>n;
fwrite(&n, sizeof(int),1,f);
for(i=0; i<n; i++)
{
cout<<"a["<<i<<"]="; cin>>a;
fwrite(&a, sizeof(int),1,f);
}
fclose(f);
}
Код
# include <iostream.h>
# include <stdio.h>
# include <math.h>
# include <conio.h>
# include <alloc.h>
//-----------------------------------------------------------------
void main()
{
clrscr();
FILE *f,*g;
int i,n,imin=0,imax=0,s=0;
int *a,*b;
f=fopen("input.dat","rb");
fread(&n,sizeof(int),1,f);
a=new int[n];
fread(a,sizeof(int),n,f);
for(i=0; i<n; i++)
{
if(a[imax]<a[i]) imax=i;
if(a[imin]>a[i]) imin=i;
}
for(i=0; i<imin; i++)
s++;
for(i=imax+1; i<n; i++)
s++;
b=new int[s]; int t=0;
for(i=0; i<imin; i++)
{
b[t]=a[i];
t++;
}
for(i=imax+1; i<n; i++)
{
b[t]=a[i];
t++;
}
for(i=0; i<t; i++)
{
cout<<"\n b["<<i<<"]="<<b[i];
cout<<endl;
}
g=fopen("result.txt","wt");
for(i=0; i<t; i++)
{
fprintf(g,"%f ",b[i]);
}
fclose(g);
fclose(f);
delete[]a;
delete[]b;
getch();
}
нашел, ругается на что-то когда пытаешься результат во txt записать, хотя до этого работало в предыдушей проге
Vahappaday
Сообщение
#57334 4.5.2010, 19:26
Вот есть две строчки:
int *a,*b; - тут b -указатель на массив целых чисел
fprintf(g,"%f ",b[i]); - а тут его элемент выводится как float
Несостыковочка, хотя. как мне кажется, студия бы обработала сие нормально, хотя в файле были бы ужасы))
InFuz
Сообщение
#57351 5.5.2010, 12:36
гы ))
действительно стоило заменить f на i и все заработало ))))
InFuz
Сообщение
#57400 6.5.2010, 10:46
Лаба №7Удалить в строках с заданными номерами числа-палиндромы.Вот есть прога для определения, простое число или нет.
Код
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#define maxline 80
//---------------------------------------------------
void getchars(char a[])
{
char c;
for(int i=0; i<maxline && (c=getchar())!='\n';i++)
*(a+i)=c;
*(a+i)='\0';
}
//---------------------------------------------------
int prost(int a)
{
if(a<=0)return 0;
int b=2;
while(b<=a/2)
{
if(a%b==0)return 0;
b++;
}
return 1;
}
//---------------------------------------------------
int main()
{
clrscr();
char s[maxline];
int a=0,i=0;
cout<<"Enter String -> ";
getchars(s);
while(s[i]!='\0')
{
if(s[i]>='0'&&s[i]<='9')
{
a*=10;
a+=s[i]-'0';
}
else if(prost(a))
{
cout<<"Yes - "<<a;
getch();
return 1;
}
else
a=0;
i++;
}
cout<<"no";
getch();
return 0;
}
Помогите переделать под мой вариант.
Vahappaday
Сообщение
#57407 6.5.2010, 12:01
По-моему, лучше с нуля написать...
Сделать ввод с клавиатуры отдельной функцией как тут. Но добавить сразу проверку ввода (нельзя вводить ничего кроме чисел, пробела и переноса строки), и сделать динамическое выделение памяти (чтобы макс. длина строки не была ограничена) - второе, в принципе, не обязательно.
Сделать функцию разбиения на подстроки, разделенные пробелами - на вход поступает char*, на выходе char** и количество строчек в массиве.
И, наконец, функцию проверки, является ли строка палиндромом.
В main останется разбить на строки, а затем пробежаться по массиву строк и вывести только те, которые палиндромами не являются.
InFuz
Сообщение
#57411 6.5.2010, 12:51
я ни фига не разбираюсь в строках, так что будем все по порядку делать
функция так получиться?
Код
void getchars(char a[])
{
char c;
for(int i=0; i<maxline && (c=getchar())!='\n';i++)
{
if(a[i]>='0'&&a[i]<='9'||a[i]=' '||a[i]='\n')
*(a+i)=c;
}
*(a+i)='\0';
}
что такое
*(a+i)=c; и
*(a+i)='\0'; ?
Vahappaday
Сообщение
#57412 6.5.2010, 13:23
Во)) Вот тут паскаль отличается от С. Я не дюже силён в паскале, но знаю, что там в начале строки-массива хранится количество символов в строке. В С такого нет, здесь строка - массив символов, ограниченный символом с кодом 0 ('\0').
а - указатель на начало массива, +i - это мы прибавляем к указателю (адресу) смещение равное i его элементам. В нашем случае мы работаем с char, его размер в большинстве случаев = 1 байту, значит, указатель увеличивается на i байт.
*(a+i) - это разыменовывание (кажется, так называется).
*x - получение значения по адресу x. Если бы мы написали a+i=x это было бы, во-первых, неверно, потому что сумма не является lvalue (ей нельзя присвоить значение). Но и в случае, если у нас там был бы просто указатель операция была по смыслу неверной, так как мы должны изменять не адрес, а значение по этому адресу.
Соответственно
*(a+i)=с; - записываем в текущую позицию считанный символ.
*(a+i)='\0'; - записываем в текущую позицию 0, показываем, что строчка завершена.
Путанно получилось, ну уж не обессудьте...((
InFuz
Сообщение
#57422 6.5.2010, 14:39
вроде понятно, более менее (время покажет).
функция то вроде правильная, но ругается как раз на lvalue required в сторочке с if.
и как должна функция разбиения на строки выглядеть?
Vahappaday
Сообщение
#57459 6.5.2010, 18:25
a[i]=' '||a[i]='\n'
Вместо = нужно == поставить, но проблема не в этом, проблема похоже в *(a+i).
Нашёл ещё пару косяков, например, если ввести строчку длиной ровно в maxlenth, будет ошибка, есть и другие, но мне легче было переписать.
Код
void getchars(char a[])
{
char c;
for(int i=0; i<maxline-1 && (c=getchar())!='\n';i++)
{
if(((c>='0')&&(c<='9')) || (a[i]==' ')) a[i]=c;
else break;
}
a[i]='\0';
}
Так, он будет прерывать ввод, когда встретит любой символ, отличный от цифры или пробела, ещё в моём варианте не будет выхода за границы массива.
InFuz
Сообщение
#57466 6.5.2010, 19:08
== , все время забываю про него, зараза такая
InFuz
Сообщение
#57841 13.5.2010, 13:43
Так, терь насчет разбиения на строки, я так понял идея такая, когда мы доходим до конца строки то создается еще одна строка char s2 так сказать и так до тех пор пока вместо \0 она не встретит . ?
Vahappaday
Сообщение
#57848 13.5.2010, 15:49
тут вариантов куча....
Смотря, как решать основную задачу...
Под
Цитата
Удалить в строках с заданными номерами числа-палиндромы.
что вообще понимается? Как вводятся строки?
Если я правильно понял, то прога будет выполнять команду.
"В строках 1, 3 и 5 удали числа палиндромы". И текст на вход подаётся, так что ли?
Или заданы строки с номерами, а из них надо все палиндромы удалить?
InFuz
Сообщение
#57852 13.5.2010, 16:02
не, вроде так,
вводишь несколько строк затем указываешь в каких из них нужно удалить числа палиндромы
Vahappaday
Сообщение
#57869 13.5.2010, 16:42
ну, тогда край построчно читать
Если строка из тех,что надо обрабатывать, в функцию её передаём, а возвращённую выводим на печать.
Если не из тех - просто на печать
Посмотри gets/wgets
InFuz
Сообщение
#57875 13.5.2010, 17:13
эээ... куда... какой край... я еще не разобрался с разбиением на строки

как оформить его?
Vahappaday
Сообщение
#57896 14.5.2010, 5:02
))) я имел в виду, что без разбиения на строки не обойтись
край=обязательно, без этого никак))
надо читать построчно
обрабатывать строку, если нужно
и выводить её на печать
читать построчно можно функцией gets (MS советуют fgets как более безопасную), но при этом нужно задавать максимальную длину строки.
PS. Помог бы паскалянтам в соседних темах))
InFuz
Сообщение
#57917 14.5.2010, 12:36
забыл еще написать, весь наш ввод оканчивается точкой(в последней строке, в самом конце обязательно ставиться точка (индикатор конца ввода)).
так что на счет разбиения на стороки? там что-то типа такого должно быть
if a[i]=='\n' //создаем char c2(не знаю как записать)
else (значит место \n попалась точка) return 0;P.S. там граф уже помогает
InFuz
Сообщение
#57918 14.5.2010, 12:50
еще вопросик не потеме
в проге которую я вначале показывал, что вот тут делается
Код
if(s[i]>='0'&&s[i]<='9')
{
a*=10; // тута
a+=s[i]-'0'; // и тута
}
else if(prost(a))
Vahappaday
Сообщение
#57936 14.5.2010, 19:51
Сильно будет смущать, если ограничена максимальная длина строки?
Если не смущает, то делаем буфер и в него построчно читаем. Про функцию fgets чего не почитал?)
Код
const int maxlen=100;
char buffer[maxlen];
int i, count=0;
while(fgets(buffer, maxlen, stdin))
{
count++;
for(i=0;i<n;i++)
{
if(arr[i]==count)
{
process(buffer);
break;
}
}
printf(buffer);
if(buffer[strlen(buffer)-1]=='.') break;
}
Я бы как-то так написал...
return 0 не надо спешить делать...
пользователю-то надо показать, как программа отработала?
Насчёт кусочка кода - в нём конвертируется строчка в число) В этом варианте такого делать не надо)
InFuz
Сообщение
#57937 14.5.2010, 20:17
stdin это должен файл с данными быть?
что то я уже перестал что либо понимать
Vahappaday
Сообщение
#57965 15.5.2010, 9:42
эм... нет. stdin - это структура FILE* соответствующая стандартному потоку ввода. В нашем случае - консоли.
InFuz
Сообщение
#59061 27.5.2010, 10:15
Вопросы:for(i=0;i<n;i++) -
n имеется ввиду
'\0' или может
maxlen или что?
массив
arr[i] - это наш массив с первой строчкой, который у меня выше был как
s[maxline]?
process(buffer) - это функция определения является ли число палиндромом?
strlen - это кто?
Vahappaday
Сообщение
#59067 27.5.2010, 12:45
strlen - функция, принимает на вход строку, завершающуюся нулём, возвращает длину строки.
Цитата
process(buffer) - это функция определения является ли число палиндромом?
- да, я подразумевал именно это, но эту функцию надо в отличие от предыдущей написать самому.
arr[i] - массив с номерами строк, которые надо обрабатывать
соответственно n - количество элементов в нём.
Прога недописана, она не скомпилится.
Надо дописать process, надо сделать ввод массива arr.
InFuz
Сообщение
#59147 27.5.2010, 18:35
Цитата(Vahappaday @ 27.5.2010, 16:45)

- да, я подразумевал именно это, но эту функцию надо в отличие от предыдущей написать самому.
ну ясен пень, кто же будет создавать библиотечное нахождении палиндрома, а там в буфер будет передавать числа по очереди или вся строчка сразу?
Vahappaday
Сообщение
#59179 28.5.2010, 17:17
вся строчка сразу, ограничено либо \0, либо \n
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.