![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
InFuz |
![]()
Сообщение
#41
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Final
Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> //----------------------------------------------------------------- int Chislo(int x) { int j; if (x<4) return 1; else { for (j=2; j<ceil(sqrt(x))+1; j++) if (x%j==0) return 0; } return 1; } //----------------------------------------------------------------- void swap(int *p) { int t=p[0]; p[0]=p[1]; p[1]=t; } //----------------------------------------------------------------- void sort1(int *mas1, int n) { int again,i; do { again=0; for(i=0;i<n-1;i++) { if(mas1[i]>mas1[i+1]) { swap(mas1+i); again=1; } } } while(again); } //----------------------------------------------------------------- void sort2(int *mas2, int k) { int again,i; do { again=0; for(i=0;i<k-1;i++) { if(mas2[i]<mas2[i+1]) { swap(mas2+i); again=1; } } } while(again); } //----------------------------------------------------------------- void main() { clrscr(); int t,k,i2,j,j2,i,n; j=0; k=0; cout<<"n="; cin>>n; int* mas1 = new int[n]; int* mas2 = new int[n]; cout<<"El-ma \n"<<"\n"; for (i=0; i<n; i++) { cin>>mas1[i]; } for (i=0; i<n; i++) { cout<<"\nmas1["<<i<<"]="<<mas1[i]; } cout<<"\n"; sort1(mas1,n); for (i=0; i<n; i++) { cout<<"\nmas1["<<i<<"]="<<mas1[i]; } cout<<"\n"; for (i=0; i<n; i++) { if (Chislo(mas1[i])==1) {mas2[j]=mas1[i]; j=j+1; k=k+1;} } for (j=0; j<k; j++) { cout<<"\nmas2["<<j<<"]="<<mas2[j]; } cout<<"\n"; sort2(mas2,k); for (j=0; j<k; j++) { cout<<"\nmas2["<<j<<"]="<<mas2[j]; } delete []mas1; delete []mas2; getch(); } Один вопрос swap пишиться для экономии места и времени или нет? что измениться если написать Код void sort1(int *mas1, int n) { int again,i,t; do { again=0; for(i=0;i<n-1;i++) { if(mas1[i]>mas1[i+1]) { t=p[i]; p[i]=p[i+1]; p[i+1]=t; again=1; } } } while(again); } |
Vahappaday |
![]()
Сообщение
#42
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Ответ: конкретно так работать не будет, потому что переменная p в функции sort не объявлена.
А вообще, swap я написал для наглядности кода, он так понятнее. Естественно, можно и в теле sort1/sort2 менять местами элементы массива - не возбраняется. Остальное не глядел, работает, в принципе? |
InFuz |
![]()
Сообщение
#43
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Ну вот тот что сверху полностью рабочий вариант, в точности совпадающий с тем что требовалось в задании.
|
InFuz |
![]()
Сообщение
#44
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Лаба №6
Создать двоичный файл и записать в него n вещественных чисел. Сформировать массив из элементов исходного файла, внеся в него числа, превосходящие среднее значение положительных элементов файла. Задание должно быть выполнено в виде 2 программ. Первая должна сформировать бинарный файл. Вторая должна выполнить задание в соответствии с вариантом (см. выше). Сделал 1 часть. Во второй части сделал пока чтобы читала файл и записывала это все дело в массив, не понял что значит "внеся в него числа, превосходящие среднее значение положительных элементов файла", это просто что ли любых чисел которые соответствуют условию натыкать? |
Vahappaday |
![]()
Сообщение
#45
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Нет, все числа из файла, удовлетворяющие условию, я так понял задание.
|
InFuz |
![]()
Сообщение
#46
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
А я понял, вроде. Надо из файла брать (и добавлять в массив) только те числа которые соответствуют условию.
|
Vahappaday |
![]()
Сообщение
#47
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
да, только сначала для расчёта условий надо сначала все их прочитать
|
InFuz |
![]()
Сообщение
#48
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Гляньте пожалуйста вроде должна работать, но чот ни фига не хочет (IMG:style_emoticons/default/blush.gif)
1 часть Код # include <iostream.h> # include <stdio.h> # include <conio.h> //----------------------------------------------------------------- void main() { clrscr(); FILE *f; int i,n; double a; f=fopen("binfile.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(double),1,f); } fclose(f); } 2 часть Код # include <iostream.h> # include <stdio.h> # include <conio.h> //----------------------------------------------------------------- void main() { clrscr(); FILE *f; int i,n,t=-1,s=0,sym=0; double *a,*b; cout<<"n="; cin>>n; f=fopen("binfile.dat","rb"); fread(a,sizeof(int),1,f); a-new double[n]; fread(a,sizeof(double),n,f); for(i=0; i<n; i++) { if(a[i]>0) { sym=sym+a[i]; s++; } } b-new double[s]; for(i=0; i<s; i++) { if(a[i]>(sym/s)) { t++; b[t]=a[i]; } } for(i=0; i<t+1; i++) if (t=-1) cout<<"Net takix 4isel!"; else { cout<<"\n"<<b[i]<<"\t"; cout<<endl; } fclose(f); delete[]a; delete[]b; getch(); } |
Vahappaday |
![]()
Сообщение
#49
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Есть много комментариев по 2 части.
Зачем записывать в файл n, а потом вводить его с клавы? Что-то уж одно) fread(a,sizeof(int),1,f); - во-первых, надо сначала выделить память под указатель, а потом уж читать в него. во-вторых, зачем читать в массив double? Формально ничего криминального, там тип входного параметра void*, но логики не вижу. Тут уж Вы должны n прочитать. a-new double[n]; - очепяточка? sym=sym+a[i]; - вообще ужас))) Куда дробные части денутся?) К целому прибавлять double'ы, это надо же. if(a[i]>(sym/s)) - а Вы в курсе, что sym / s -это целочисленное деление? Если делить одно целое на другое, то получится опять же целое. Например 10/3 = 3 А сравниваете Вы с double, так что ошибки вполне могут иметь место) Последние две ошибки убиваются одним выстрелом: объявлением sym как double. b-new double[s]; - и вновь очепяточка. Да, кстати, и почему именно s? Их там всегда будет меньше. if (t=-1) cout<<"Net takix 4isel!"; - целых два косяка. Во-первых, (t==-1), во-вторых, если уж t и принимает такое значение, то цикл не прогонится не разу. Так что следует сделать if, а уж внутри if цикл. Остальное дело вкуса. Хотя мне лично непонятно, почему в одном случае потоки cin и cout, а в другом fopen, fread, fwrite - либо STL, либо C Library) |
InFuz |
![]()
Сообщение
#50
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Все исправил, заработала.
Гляньте еще одну прогу. Задание. Вычислить среднее значение элементов, расположенных в массиве между первым и последним нулевым значением. Поменять местами минимальный и максимальный элементы. Создать функции для определения среднего значения, макс. и мин. Код # include <iostream.h> # include <stdio.h> # include <math.h> # include <conio.h> # include <alloc.h> //----------------------------------------------------------------- double Sred(int *a, int I, int I2) { int i,s=0,sym=0; for(i=I+1; i<I2-1; i++) { sym=sym+a[i]; s++; } return (sym/s); } //----------------------------------------------------------------- void MaxMin(int *a, int n) { int b,i,max=0,imax; for(i=0; i<n; i++) { if(a[i]>max) { imax=i; max=a[i]; } } int min=0,imin; for(i=0; i<n; i++) { if(a[i]<min) { imin=i; min=a[i]; } } b=max; a[imax]=a[imin]; a[imin]=max; } //----------------------------------------------------------------- int main() { clrscr(); int b,i,I,n,I2,s=0; cout<<"n="; cin>>n; int* a = new int[n]; cout<<"El-ma"; for (i=0; i<n; i++) { cout<<"\na["<<i<<"]="; cin>>a[i]; if(a[i]==0) s++; } if(s<2) { cout<<"Malo nylei!\n"; return 0; } else { for (i=0; i<n; i++) if(a[i]==0) { I=i; break; } for (i=n; i>I; i--) { if(a[i]==0) { I2=i; break; } } } Sred(a,I,I2); MaxMin(a,n); for (i=0; i<n; i++) cout<<"\na["<<i<<"]="<<a[i]; cout<<"Srednee zna4enie="<<Sred; delete []a; getch(); return 1; } |
Vahappaday |
![]()
Сообщение
#51
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
return (sym/s); - опять то же самое)) Результат-то будет типа double) Но средним значением чисел {1, 1, 2} будет 1.0
Не созданы функции для отдельного нахождения минимума и максимума. В функции MaxMin цикл не обязательно гонять два раза. Всё это можно проделать и в одном цикле. По той же функциями. Инициализация нулями min и max не верна. Например, у Вас будет массив {-1,-2,-3}. И что, максимальный элемент у него 0? Именно так будет считать такой алгоритм. А индекс будет вообще не инициализирован. Это же замечание касается и min. a[imax]=a[imin]; - уж написали бы =min ))) Хотя... в принципе ошибки не вижу. Но тогда никакой временной переменной не надо. cout<<"Srednee zna4enie="<<Sred; - какие ужасы))) Что за Sred? Как же это Вы используете идентификатор функции без параметров. return 1; - Ваше право, но корректно завершившееся приложение в Windows обычно имеет код возврата 0. |
InFuz |
![]()
Сообщение
#52
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Результат-то будет типа double ну так и функция типа double
отдельного нахождения это не пренципиально вообще я хотел узнать в чем ошибка мешающая работе, а не косметический ремонт (IMG:style_emoticons/default/smile.gif) компилятор говорит что все гуд, но когда запускаешь, (пускай даже без отрец. знач. вообще) она начинает на что-ругаться. (IMG:style_emoticons/default/huh.gif) |
Vahappaday |
![]()
Сообщение
#53
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Советую повнимательнее взглянуть сюда:
return (sym/s); - опять то же самое)) Результат-то будет типа double) Но средним значением чисел {1, 1, 2} будет 1.0 Проблема не в типе. Тип как раз верный. А вот результат вычислений косячный. У Вас будет целочисленное деление, а затем приведение к типу double. Тип правильный, а результат косячный. Почему ругается, я тоже сказал. max=0 и min=0. Если у Вас нет отрицательных значений, то как раз и будут проблемы. У вас не встретится ни одного числа, которое бы удовлетворяло условию: Код if(a[i]<min) { imin=i; min=a[i]; } В итоге imin останется непроинициализированным. А Вы к нему таки обратитесь в конце. Моё конструктивное предложение: int imin=0, imax=0, min=a[0], max=a[0]; Я обычно делаю так. |
InFuz |
![]()
Сообщение
#54
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
Все, готово, кое как своими кривыми ручонками отладил. (IMG:style_emoticons/default/laugh.gif)
Спасибо, чтобы без вас делал, не знаю. (IMG:style_emoticons/default/thumbsup.gif) |
Vahappaday |
![]()
Сообщение
#55
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
А с делением поправили?)))
Косячить ведь будет) |
InFuz |
![]()
Сообщение
#56
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 116 Регистрация: 13.10.2009 Город: Ульяновск Учебное заведение: УлГУ Вы: студент ![]() |
так точно! сделал еще печать в самой процедуре.
Код void Sred(int *a, int I, int I2) { int i,s=0,sym=0; double b; for(i=I+1; i<I2; i++) { sym=sym+a[i]; s++; } b=(double)sym/s; cout<<"Srednee zna4enie="<<b; } Хотел еще спросить, что значит linker warning:no module definition file specified: using defaults в принципе это не ошибка и работе не мешает просто хотел узнать, что она мне хочет сказать. |
Vahappaday |
![]()
Сообщение
#57
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Если честно, не в курсе, это чисто борландовое предупреждение... Говорят, помогает пересоздание проекта, его перемешение или что-то типа того.
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 20:26 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru