Jump to content

Помогите студентке первого курса


Recommended Posts

Ребята! Что-то у меня никак не получается с прогами которые задают нам преподаватели.

Помогите пожалуйста! Программу необходимо написать в С++ Borland

1) дан текстовый массив из 200 букв. Выстроить в алфавитном порядке все строчные буквы;

2) даны числа от 2 до n (n<=10) найти все простые числа;

3)матрица задается формулой а(i,j)=cos(i^2+j^2), найти транспонированную матрицу а.

Для профи это же раз плюнуть.

Надеюсь на помощь! :) :rolleyes:

Link to comment
Share on other sites

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 by Тролль
Link to comment
Share on other sites

Спасибо огромное!

с транспонированной матрицей я сама как-то разобралась. А вот с текстом вообще ничего не могла придумать!

Профи ты иль не профи, но все равно спасибо большое!

Только один маленький вопросик для чего "using namespace std", я такое не учила? :cool:

Link to comment
Share on other sites

Некоторые варианты C++ требуют такой строчки, некоторые нет. Можешь попробовать ее исключить - если будет работать без нее, она для данного варианта C++ необязательна. Вообще это было введено, чтобы можно было использовать готовые куски программы от нескольких разработчиков, которые использовали одинаковые имена для разных переменных. Тогда при включении этих кусков в программу можно с помощью команды using namespace ... указать, что в этой части программы используются свои имена, на случай конфликта с такими же именами в других частях программы. Некоторые компиляторы считают, что если namespace (пространство имен) не указано, используется одно и то же стандартное пространство имен, для других надо всегда указывать, что используется основное пространство имен, эту роль и выполняет эта строка.

Link to comment
Share on other sites

Можешь еще подсказать? Если в задачи с простыми числами n неограниченное, то какое должно быть условие для нахождение простых чисел!

Link to comment
Share on other sites

Если 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 by Тролль
Link to comment
Share on other sites

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

Ммм... Было бы понятнее, если бы я перенес строку на другом месте. Вот эта часть программы без переноса строки:

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

Могу ли я вместо фиксированного массива из 10000 элементов, сделать простой массив допустим из n элементов?

Link to comment
Share on other sites

Это уже будет "непростой" массив, точнее, динамический, то есть с задаваемым во время выполнения программы размером. Прямо указать вместо 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 by Тролль
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...