Valk@ Posted July 2, 2008 Report Share Posted July 2, 2008 Ребята! Что-то у меня никак не получается с прогами которые задают нам преподаватели. Помогите пожалуйста! Программу необходимо написать в С++ Borland 1) дан текстовый массив из 200 букв. Выстроить в алфавитном порядке все строчные буквы; 2) даны числа от 2 до n (n<=10) найти все простые числа; 3)матрица задается формулой а(i,j)=cos(i^2+j^2), найти транспонированную матрицу а. Для профи это же раз плюнуть. Надеюсь на помощь! :) :rolleyes: Link to comment Share on other sites More sharing options...
Тролль Posted July 2, 2008 Report Share Posted July 2, 2008 (edited) Valk@: Вообще-то для таких заданий в начале раздела среди "Важных" есть тема "Заказы "Сделайте все за меня"". Но вернемся к нашим баранам. 1) дан текстовый массив из 200 букв. Выстроить в алфавитном порядке все строчные буквы;2) даны числа от 2 до n (n<=10) найти все простые числа; 3)матрица задается формулой а(i,j)=cos(i^2+j^2), найти транспонированную матрицу а. Для профи это же раз плюнуть. Профи берут за работу деньги. В этом их отличие от не-профи. Плевать по заказу, кстати, тоже работа. Но насчет "раз плюнуть" в третьем случае особо точно подмечено. Транспонированная матрица совпадает с исходной. Соответственно задача - типа "написать таблицу умножения на 1". Такую чушь писать рука не поднимается. Второй случай ненамного сложнее: достаточно напечатать все числа из ряда 2,3,5,7, меньшие или равные заданному n. Программа может выглядеть так: #include <iostream.h>#include <stdio.h>using namespace std;main(){int i,n,m[4]={2,3,5,7}; cout<<"n="; cin>>n; cout<<endl; for(i=0;i<4;i++)if(m[i]<=n)cout<<m[i];cout<<endl; getchar();getchar(); } Borland C++ под рукой, правда, нет, был Dev-C++, но это не должно быть важным. Первый случай еще чуть посложнее. Ну да ладно, "по порядку номеров рассчитайсь!": #include <iostream.h>#include <stdio.h>using namespace std;const int l=200;main(){char c,m[l],n[l]; int i,j;for(i=0;i<l;i++)cin>>m[i]; j=0; for(c='a';c<='z';c++)for(i=0;i<l;i++)if(m[i]==c)n[j++]=c;for(i=0;i<j;i++)cout<<n[i]; cout<<endl; getchar();getchar();} Вводим строку букв целиком или буквы по отдельности, заканчивая нажатием (-ями) клавиши Enter. Выведутся входившие в состав строки строчные латинские буквы в алфавитном порядке - каждая столько раз, сколько ее вводили. P.S. В последней программе при проверке советую временно поменять значение константы l с 200 на 10 - вводить при испытании программы двести букв портит характер :rolleyes: Edited July 2, 2008 by Тролль Link to comment Share on other sites More sharing options...
Valk@ Posted July 3, 2008 Author Report Share Posted July 3, 2008 Спасибо огромное! с транспонированной матрицей я сама как-то разобралась. А вот с текстом вообще ничего не могла придумать! Профи ты иль не профи, но все равно спасибо большое! Только один маленький вопросик для чего "using namespace std", я такое не учила? :cool: Link to comment Share on other sites More sharing options...
Тролль Posted July 3, 2008 Report Share Posted July 3, 2008 Некоторые варианты C++ требуют такой строчки, некоторые нет. Можешь попробовать ее исключить - если будет работать без нее, она для данного варианта C++ необязательна. Вообще это было введено, чтобы можно было использовать готовые куски программы от нескольких разработчиков, которые использовали одинаковые имена для разных переменных. Тогда при включении этих кусков в программу можно с помощью команды using namespace ... указать, что в этой части программы используются свои имена, на случай конфликта с такими же именами в других частях программы. Некоторые компиляторы считают, что если namespace (пространство имен) не указано, используется одно и то же стандартное пространство имен, для других надо всегда указывать, что используется основное пространство имен, эту роль и выполняет эта строка. Link to comment Share on other sites More sharing options...
Valk@ Posted July 3, 2008 Author Report Share Posted July 3, 2008 Спасибо :cool: Link to comment Share on other sites More sharing options...
Valk@ Posted July 3, 2008 Author Report Share Posted July 3, 2008 Можешь еще подсказать? Если в задачи с простыми числами n неограниченное, то какое должно быть условие для нахождение простых чисел! Link to comment Share on other sites More sharing options...
Тролль Posted July 3, 2008 Report Share Posted July 3, 2008 (edited) Если n неограниченное - надо создавать программу, оперирующую с числами c неограниченным числом цифр. Это задача уже другого класса сложности. Так что давай ограничимся для простоты, например, n<=32000 (целые обычной точности часто ограничиваются примерно 32000). #include <iostream.h>#include <stdio.h>using namespace std;main(){int i,k,j,n,m[10000];cout<<"n="; cin>>n; cout<<endl;k=0;for(j=2;j<n;j++){for(i=0;i<k;i++)if(j%m[i]==0)break;if(i==k)m[k++]=j;};for(i=0;i<k;i++){cout.width(8);cout<<m[i];}cout<<endl; getchar();getchar();} P.S. Вообще-то для n<=32000 хватает и размера массива для простых чисел на 4000 чисел, это легко оценить по формуле для приближенного количества простых чисел, не превышающих n: n/(ln(n)-2), в случае дробного числа округляем в большую сторону. Так что 10000 правильнее для некоторой экономии памяти заменить на 4000. Edited July 3, 2008 by Тролль Link to comment Share on other sites More sharing options...
Valk@ Posted July 4, 2008 Author Report Share Posted July 4, 2008 Спасибо!!! Link to comment Share on other sites More sharing options...
Valk@ Posted July 4, 2008 Author Report Share Posted July 4, 2008 k=0;for(j=2;j<n;j++){for(i=0;i<k;i++)if(j%m==0)break; а как у нас изменяется k, оно же не должно оставаться фиксированным к=0??? Link to comment Share on other sites More sharing options...
Тролль Posted July 4, 2008 Report Share Posted July 4, 2008 Ммм... Было бы понятнее, если бы я перенес строку на другом месте. Вот эта часть программы без переноса строки: k=0;for(j=2;j<n;j++){for(i=0;i<k;i++)if(j%m==0)break; if(i==k)m[k++]=j;}; Так яснее видно, что k меняется в выражении k++ Вообще же идея работы программы (если понадобится объяснять) состоит в том, что для проверки простоты числа проверяется его делимость на все найденные до этого простые числа. Link to comment Share on other sites More sharing options...
Valk@ Posted July 4, 2008 Author Report Share Posted July 4, 2008 Могу ли я вместо фиксированного массива из 10000 элементов, сделать простой массив допустим из n элементов? Link to comment Share on other sites More sharing options...
Тролль Posted July 4, 2008 Report Share Posted July 4, 2008 (edited) Это уже будет "непростой" массив, точнее, динамический, то есть с задаваемым во время выполнения программы размером. Прямо указать вместо 10000 имя n нельзя, потому что для простых массивов память распределяется еще перед началом выполнения программы, а значение n в это время еще неизвестно. А эта же программа с динамическим массивом, для которого память выделяться будет уже во время работы программы, когда станет известно n, будет выглядеть так: #include <iostream.h>#include <stdio.h>using namespace std;main(){int i,k,j,n,*m;cout<<"n="; cin>>n; cout<<endl;m=new int[n];k=0;for(j=2;j<n;j++){for(i=0;i<k;i++)if(j%m[i]==0)break;if(i==k)m[k++]=j;};for(i=0;i<k;i++){cout.width(8);cout<<m[i];}delete[]m; cout<<endl; getchar();getchar();} P.S. Длину для массива простых чисел неэкономно брать равной n, их намного меньше. Для n=32000 хватило бы, например, 4000. Поэтому экономнее брать длину массива по приведенной раньше формуле (с небольшим запасом). Тогда надо заменить в программе строку m=new int[n]; на k=n/(log(n)-2)+10; m=new int[k]; а в начало программы вставить еще строку #include <math.h> , чтобы можно было использовать функцию логарифма. Edited July 4, 2008 by Тролль Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now