![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
InFuz |
![]()
Сообщение
#1
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Создать двоичный файл и записать в него 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 записать, хотя до этого работало в предыдушей проге (IMG:style_emoticons/default/mellow.gif) |
![]() ![]() |
Vahappaday |
![]()
Сообщение
#2
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Вот есть две строчки:
int *a,*b; - тут b -указатель на массив целых чисел fprintf(g,"%f ",b[i]); - а тут его элемент выводится как float Несостыковочка, хотя. как мне кажется, студия бы обработала сие нормально, хотя в файле были бы ужасы)) |
InFuz |
![]()
Сообщение
#3
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
гы ))
действительно стоило заменить f на i и все заработало )))) (IMG:style_emoticons/default/thumbsup.gif) |
InFuz |
![]()
Сообщение
#4
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Лаба №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 |
![]()
Сообщение
#5
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
По-моему, лучше с нуля написать...
Сделать ввод с клавиатуры отдельной функцией как тут. Но добавить сразу проверку ввода (нельзя вводить ничего кроме чисел, пробела и переноса строки), и сделать динамическое выделение памяти (чтобы макс. длина строки не была ограничена) - второе, в принципе, не обязательно. Сделать функцию разбиения на подстроки, разделенные пробелами - на вход поступает char*, на выходе char** и количество строчек в массиве. И, наконец, функцию проверки, является ли строка палиндромом. В main останется разбить на строки, а затем пробежаться по массиву строк и вывести только те, которые палиндромами не являются. |
InFuz |
![]()
Сообщение
#6
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
я ни фига не разбираюсь в строках, так что будем все по порядку делать
функция так получиться? Код 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 |
![]()
Сообщение
#7
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Во)) Вот тут паскаль отличается от С. Я не дюже силён в паскале, но знаю, что там в начале строки-массива хранится количество символов в строке. В С такого нет, здесь строка - массив символов, ограниченный символом с кодом 0 ('\0').
а - указатель на начало массива, +i - это мы прибавляем к указателю (адресу) смещение равное i его элементам. В нашем случае мы работаем с char, его размер в большинстве случаев = 1 байту, значит, указатель увеличивается на i байт. *(a+i) - это разыменовывание (кажется, так называется). *x - получение значения по адресу x. Если бы мы написали a+i=x это было бы, во-первых, неверно, потому что сумма не является lvalue (ей нельзя присвоить значение). Но и в случае, если у нас там был бы просто указатель операция была по смыслу неверной, так как мы должны изменять не адрес, а значение по этому адресу. Соответственно *(a+i)=с; - записываем в текущую позицию считанный символ. *(a+i)='\0'; - записываем в текущую позицию 0, показываем, что строчка завершена. Путанно получилось, ну уж не обессудьте...(( |
InFuz |
![]()
Сообщение
#8
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
вроде понятно, более менее (время покажет).
функция то вроде правильная, но ругается как раз на lvalue required в сторочке с if. и как должна функция разбиения на строки выглядеть? |
Vahappaday |
![]()
Сообщение
#9
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
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 |
![]()
Сообщение
#10
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
== , все время забываю про него, зараза такая (IMG:style_emoticons/default/smile.gif)
|
InFuz |
![]()
Сообщение
#11
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Так, терь насчет разбиения на строки, я так понял идея такая, когда мы доходим до конца строки то создается еще одна строка char s2 так сказать и так до тех пор пока вместо \0 она не встретит . ?
|
Vahappaday |
![]()
Сообщение
#12
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
тут вариантов куча....
Смотря, как решать основную задачу... Под Цитата Удалить в строках с заданными номерами числа-палиндромы. Если я правильно понял, то прога будет выполнять команду. "В строках 1, 3 и 5 удали числа палиндромы". И текст на вход подаётся, так что ли? Или заданы строки с номерами, а из них надо все палиндромы удалить? |
InFuz |
![]()
Сообщение
#13
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
не, вроде так,
вводишь несколько строк затем указываешь в каких из них нужно удалить числа палиндромы |
Vahappaday |
![]()
Сообщение
#14
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
ну, тогда край построчно читать
Если строка из тех,что надо обрабатывать, в функцию её передаём, а возвращённую выводим на печать. Если не из тех - просто на печать Посмотри gets/wgets |
InFuz |
![]()
Сообщение
#15
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
эээ... куда... какой край... я еще не разобрался с разбиением на строки (IMG:style_emoticons/default/smile.gif)
как оформить его? |
Vahappaday |
![]()
Сообщение
#16
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
))) я имел в виду, что без разбиения на строки не обойтись
край=обязательно, без этого никак)) надо читать построчно обрабатывать строку, если нужно и выводить её на печать читать построчно можно функцией gets (MS советуют fgets как более безопасную), но при этом нужно задавать максимальную длину строки. PS. Помог бы паскалянтам в соседних темах)) |
InFuz |
![]()
Сообщение
#17
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
забыл еще написать, весь наш ввод оканчивается точкой(в последней строке, в самом конце обязательно ставиться точка (индикатор конца ввода)).
так что на счет разбиения на стороки? там что-то типа такого должно быть if a[i]=='\n' //создаем char c2(не знаю как записать) else (значит место \n попалась точка) return 0; P.S. там граф уже помогает (IMG:style_emoticons/default/smile.gif) |
InFuz |
![]()
Сообщение
#18
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
еще вопросик не потеме
в проге которую я вначале показывал, что вот тут делается Код if(s[i]>='0'&&s[i]<='9') { a*=10; // тута a+=s[i]-'0'; // и тута } else if(prost(a)) |
Vahappaday |
![]()
Сообщение
#19
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Сильно будет смущать, если ограничена максимальная длина строки?
Если не смущает, то делаем буфер и в него построчно читаем. Про функцию 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 |
![]()
Сообщение
#20
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
stdin это должен файл с данными быть?
что то я уже перестал что либо понимать (IMG:style_emoticons/default/sad.gif) |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 21:17 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru