Визуализация результатов численного моделирования явления перколяции на квадратной решетке
Применения методов алгоритмизации и практического программирования на языках C/C++. Разработка программы базовых алгоритмов обработки данных. Расширенный алгоритм Евклида и алгоритм "Решето Эратосфена". Сортировка слияние и алгоритм сортировки Хоара.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.07.2012 |
Размер файла | 554,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
Основная часть
1. Цель работы и средства ее достижения
2. Описание алгоритмов
3. Тексты программ
4. Результаты расчетов
Заключение
Список использованных источников
Основная часть
1. Цель работы и средства ее достижения
Целью настоящей работы является практическое закрепление навыков применения методов алгоритмизации и практического программирования на языках C/C++.
Методология программирования. Декомпозиция и абстракция.
Основные два принципа - абстракция и декомпозиция. Декомпозиция позволяет разбить программу на составные компоненты, легкие для понимания и применения. Абстракция позволяет осуществить продуманный выбор таких компонентов, т.е. отбросить несуществующие для данной задачи параметры.
2. Описание алгоритмов
1) Алгоритм подсчитывает сумму цифр числа, находящихся на нечётных позициях.
2) Алгоритм находит минимальный элемент массива X среди тех, которые не являются элементами массива Y (X,Y - одномерные массивы).
3) Алгоритм находит номер второй из строк, содержащих хотя бы один отрицательный элемент(или устанавливает, что кол-во таких строк меньше двух).
4) Выполнить задачи №2 и №3 используя динамические массивы.
Одновременно с использованием динамических массивов, мы считываем все необходимые данные из файла.
5) Алгоритм выделяет в строке s1 все слова, начинающиеся с гласной буквы, а в строке s2 - все слова, начинающиеся с согласной буквы, образовывая строку s3, состоящую из выделенных слов обеих строк.
6) Вектор в пятимерном пространстве задается пятеркой своих координат. Реализовать операции:
а) умножение вектора на скаляр;
б) скалярное произведение векторов:
7) Расширенный алгоритм Евклида
В то время как "обычный" алгоритм Евклида просто находит наибольший общий делитель двух чисел a и b, расширенный алгоритм Евклида находит помимо НОД также коэффициенты x и y такие, что: a*x+b*y=НОД(a,b). Т.е. он находит коэффициенты, с помощью которых НОД двух чисел выражается через сами эти числа.
8) Алгоритм "Решето Эратосфена"
Решето Эратосфена -- алгоритм нахождения всех простых чисел до некоторого целого числа N, который приписывают древнегреческому математику Эратосфену Киренскому.
9) Алгоритм сортировки «слиянием»
Сортировка слиянием -- алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например -- потоки) в определённом порядке. Эта сортировка -- хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.
10) Алгоритм сортировки Хоара
В методе Хоара первоначально выделяют базовый элемент, относительно которого ключи с большим весом перебрасываются вправо, а с меньшим влево. Базовый элемент сравнивается с противоположным элементом.
численное моделирование перколяция
3. Тексты программ
1.
// tipovik1.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include "tipovik1_summ.h"
using namespace std;
//исх: число заданное с клавиатуры
//рез: сумма цифр числа, находящихся на нечётных позициях
int _tmain()
{
int a;
cin >> a ;
cout << "s= "<<tipovik1_summ(a)<<endl;
_getch();
}
//tipovik1_summ.h
int tipovik1_summ(int a);
//tipovik1_summ.cpp
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int tipovik1_summ(int a)
{
int i=0;
int s=0;
int b=a;
while (a>0){
a=a/10;
++i; // кол-во чисел
}
while (i > 0){
a = b % 10;
b = b / 10;
if (i % 2 != 0){
s += a;
}
--i;
}
return s;
}
2.
// Ivanov_tipovik2.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include "min_el.h"
#include <conio.h>
using namespace std;
const int N = 5;
int x[N] = {1,10,3,4,5};
int y[N] = {1,3,5,7,9};
int z[N]; //массив с “метками”
//исх: массив х, массив y
//рез: минимальный элемент массива X среди тех, которые не являются элементами массива Y
int _tmain(int argc, _TCHAR* argv[])
{
for (int m = 0; m < N; m++){
z[m] = 0;
}
int min = minim(x, y, z, N);
cout << min;
_getch();
return 0;
}
//min_el.h
int minim(int x[], int y[], int z[], const int N);
//min_el.cpp
#include "stdafx.h"
int minim(int x[], int y[], int z[], const int N)
{
int min; //минимальный элемент
for (int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
if (x[i] == y[j]){
z[i] = 1;
}
}
}
for (int i = 0; i < N; i++){
if (z[i] == 0){
min = x[i];
break;
}
}
for (int i = 0; i < N; i++){
if (z[i] == 0 && x[i] < min){
min = x[i];
}
}
return min;
}
3.
// Ivanov_tipovik3.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include "num_str.h"
#include <conio.h>
using namespace std;
int x[N][N] = {{1,2,3,4},{5,6,7,8},{9,8,7,-6},{5,-4,3,2}};
//исх: двумерный массив Х
//рез: найден номер второй из строк, содержащих хотя бы один отрицательный элемент
//или установлено что таких строк меньше 2
int _tmain(int argc, _TCHAR* argv[])
{
int num = num_str(x);
cout << num;
_getch();
}
//num_str.h
const int N = 4;
int num_str (int x[N][N]);
//num_str.cpp
#include "stdafx.h"
#include "num_str.h"
int num_str(int x[N][N])
{
int s=0; //номер искомой строки
int k=0;
for (int i = 0; i < N; ++i){
for (int j = 0; j < N; ++j){
if (x[i][j] < 0){
if (k < 1){
++k;
break;
}
else{
s = i;
goto M;
}
}
}
}
M:;
return s;
}
4.
1) // Ivanov_tipovik4_1.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "min_el.h"
#include <conio.h>
using namespace std;
const int N=5;
//исх: динамические массивы х,y
//рез: минимальный элемент массива x среди тех, которые не являются элементами массива y
int _tmain(int argc, _TCHAR* argv[])
{
int i=0;
int *x = new int[N];
int *y = new int[N];
int *z = new int[N];
FILE *f1 = fopen ("1.txt","r"); //файл с массивом x
FILE *f2 = fopen ("2.txt","r"); //файл с массивом y
FILE *k = fopen ("3.txt","w"); //файл записи массива
while(i<N){
fscanf(f1,"%d",&x[i]);
fscanf(f2,"%d",&y[i]);
i++;
}
//программа из 2го
for (int m = 0; m < N; m++){
z[m] = 0;
}
int min = minim(x, y, z, N);
cout << min;
//программа из 2го
fprintf(k,"%d",min); //запись в файл k результата
fclose(f1);
fclose(f2);
fclose(k);
delete []x;
delete []y;
delete []z;
_getch();
return 0;
}
//min_el.h
int minim(int x[], int y[], int z[], const int N);
//min_el.cpp
#include "stdafx.h"
int minim(int x[], int y[], int z[], const int N)
{
int min; //минимальный элемент
for (int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
if (x[i] == y[j]){
z[i] = 1;
}
}
}
for (int i = 0; i < N; i++){
if (z[i] == 0){
min = x[i];
break;
}
}
for (int i = 0; i < N; i++){
if (z[i] == 0 && x[i] < min){
min = x[i];
}
}
return min;
}
2) // Ivanov_tipovik4_2.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include "math_lib.h" // здесь объявлены N, M
#include <conio.h>
using namespace std;
//исх: динамический двумерный массив Х считанный с файла
//рез: найден номер второй из строк, содержащих хотя бы один отрицательный элемент
//или установлено что таких строк меньше 2
int _tmain(int argc, _TCHAR* argv[])
{
int *x = new int [N*M];
FILE *f = fopen("1.txt", "r");
if (f==0){
perror("Ошибка!");
exit(1);
}
for (int i=0; i < N; i++){
for (int j=0; j < M; j++){
fscanf(f,"%d", &x[i*M+j]);//считывание с файла в массив x
}
}
find(x);
fclose(f);
_getch();
delete [] x;
return 0;
}
//math_lib.h
const int N=4, M=3;
void find(int *x);
//math_lib.cpp
#include "stdafx.h"
#include "math_lib.h"
void find(int *x){
FILE *k = fopen("2.txt", "w");
int a = 0;
int t=0;
int *y = new int [N];
for (int i=0; i<N; i++){
for (int j=0; j<M; j++){
if (x[i*M+j] < 0){
a++;
}
}
if (a>=1){
y[t++]=i;
}
a=0;
}
fprintf(k,"Номер строки: %d", y[1]);//запись в файл k результата
fclose(k);
delete []y;
}
5. // 5 задача 16 вариант.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include "math_lib.h"
#include <string.h>
#include <ctype.h>
using namespace std;
//исх: текст записан в файлы 1 и 2
//рез: в файл 3 записаны слова, начинающиеся с гласной буквы из файла 1 и слова, начинающиеся с согласной - из файла 2.
int _tmain(int argc, _TCHAR* argv[])
{
FILE *f1 = fopen("1.txt", "rt");
FILE *f2 = fopen("2.txt", "rt");
if (f1==0){
perror("Ошибка!");
exit(1);
}
int i=0;
int n=100;
char *str1 = new char [n];
char *str2 = new char [n];
while(fscanf(f1,"%c", &str1[i++])!= EOF); // считывание в массив
int n1=i-1;
i=0;
while(fscanf(f2,"%c", &str2[i++])!= EOF); // считывание в массив
int n2=i-1;
find(str1,str2,n1,n2);
_getch();
delete []str1;
delete []str2;
fclose(f1);
fclose(f2);
return 0;
}
//math_lib.h
void find(char *str1, char *str2, int n1, int n2);
//math_lib.cpp
#include "stdafx.h"
#include <iostream>
using namespace std;
int i=0;
int j=0;
void find(char *str1, char *str2, int n1, int n2){
//поиск слова начинающегося с гласной буквы
FILE *p = fopen("3.txt", "w");
if (str1[0]=='a'||'e'||'i'||'o'||'y'||'u'){
while (str1[j]!=' '){
fprintf(p,"%c", str1[i]);
j++;
}
}else{
j=0;
}
fprintf(p, " ");
i=j;
while(i<=n1){
if (str1[i]==' '){
if (str1[i+1]=='a'||'e'||'i'||'o'||'y'||'u'){
j=i+1;
while (str1[j]!=' ' || str1[j]!='.'){
fprintf(p,"%c",str1[j]);
j++;
}
fprintf(p, " ");
i=j;
}
}
if (i>=n1){
break;
}
i++;
}
fclose(p);
//поиск слова начинающегося с согласной буквы
if (str2[0]!='a'||'e'||'i'||'o'||'y'||'u'){
while (str1[j]!=' '){
fprintf(p,"%c", str2[i]);
j++;
}
}else{
j=0;
}
fprintf(p, " ");
i=j;
while(i<=n1){
if (str2[i]==' '){
if (str2[i+1]!='a'||'e'||'i'||'o'||'y'||'u'){
j=i+1;
while (str2[j]!=' ' || str2[j]!='.'){
fprintf(p,"%c",str2[j]);
j++;
}
fprintf(p, " ");
i=j;
}
}
if (i>=n1){
break;
}
i++;
}
}
6. // 6 задача.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include "vector.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
const int n=5;
Vector a(n),b(n),c(n);
int x;
cout << "Vector A: ";
for (int i=0; i<n; i++){
cin >> x;
a.SetVal(i, x);
}
cout << endl;
cout << "Vector B: ";
for (int i=0; i<n; i++){
cin >> x;
b.SetVal(i, x);
}
cout << endl;
cout << "Enter number: ";
cin >> x;
cout << endl;
c = scal(a,b);
cout << "Skalyrnoe proizvedenie A i B: " << c.GetVal(0);
cout << endl;
c = umnoj(a,x);
cout << "Umnoj. na skalyar vectora A: ";
for (int i=0; i<n; i++){
cout << c.GetVal(i)<< ".";
}
cout << endl;
c = umnoj(b,x);
cout << "Umnoj. na skalyar vectora B: ";
for (int i=0; i<n; i++){
cout << c.GetVal(i) << " ";
}
_getch();
return 0;
}
//vector.h
const int n=5;
class Vector{
private:
int *parray;
int length;
public:
Vector();
Vector(int n);
void SetVal(int i, int val);
int GetVal(int i);
friend Vector umnoj(Vector &a, int sk);
friend Vector scal(Vector &a, Vector &b);
};
//vector.cpp
#include "stdafx.h"
#include <iostream>
#include "vector.h"
using namespace std;
Vector::Vector(){
parray = 0;
length = 0;
}
Vector::Vector(int n){
length = n;
parray = new int [n];
for (int i=0; i<n; i++){
parray[i]=0;
}
}
void Vector::SetVal(int i, int val){
parray[i] = val;
}
int Vector::GetVal(int i){
return parray[i];
}
Vector umnoj(Vector &a, int sk){
Vector c(n);
for (int i=0; i<n; i++){
c.parray[i] = a.parray[i]*sk;
}
return c;
}
Vector scal(Vector &a, Vector &b){
Vector c(1);
int s=0;
for (int i=0; i<n; i++){
s = s + a.parray[i]*b.parray[i];
}
c.parray[0] = s;
return c;
}
7. // poisk_nod.cpp: определяет точку входа для консольного приложения.
//Расширенный алгоритм Евклида
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include "math_nod.h"
using namespace std;
// Исх: 2 неотрицательных числа a и b
// Рез: d=НОД(a,b) и целые x,y: ax + by = d
int _tmain(int argc, _TCHAR* argv[])
{
int a;
int b;
int x,y;
cout<<"Enter a and b\n";
cin>>a;
cin>>b;
cout<<"NOD= "<<nod(a,b,x,y)<<endl;
cout <<"x= " << x <<", y= " << y;
_getch();
return 0;
}
//math_nod.h
int nod(int a, int b, int &x, int &y);
//math_nod.cpp
#include "stdafx.h"
int nod(int a, int b, int &x, int &y)
{
if (a == 0) {
x = 0; y = 1;
return b;
}
int x1,y1;
int d = nod (b%a, a, x1, y1); // рекурсивно находится НОД и коэффициенты х и y
x = y1 - (b / a) * x1;
y = x1;
return d;
}
8. // Eratosfen.cpp: определяет точку входа для консольного приложения.
//Алгоритм Эратосфена
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
const int n=30;
int x[n];
int _tmain(int argc, _TCHAR* argv[])
{
int p=2;
int shag=2;
int a=2;
for (int i=0; i<n-1; i++){
x[i]=0;
}
while (p < n){
for (int i=p; i<n-1; i=i+shag){
x[i]=1;
}
p=p+2;
shag=shag+1;
}
for (int i=0; i<n-1; i++){
if(x[i]==0){
cout<< a << endl;
}
a=a+1;
}
_getch();
return 0;
}
9.// piramida.cpp: определяет точку входа для консольного приложения.
//Сортировка Слиянием
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "sortirovka.h"
using namespace std;
const int N = 100;
int x[N]={93,6,3,4,9,4,7,6};
int _tmain(int argc, _TCHAR* argv[])
{
int n=8 , i;
sortirovka(x,n);
for (i=0;i<n;i++){
cout << x[i] << endl;
}
_getch();
return 0;
}
//sortirovka.h
void sortirovka(int [],int);
void sliv(int [], const int ,const int ,const int );
//sortirovka.cpp
#include "stdafx.h"
#include "sortirovka.h"
#include <iostream>
using namespace std;
void sortirovka(int x[], const int n)
{
int p,k,r;
k=1;
while(k<n){
p=0;
while (p<n){
sliv(x,n,p,k);
p=p+2*k;
}
k=k*2;
}
}
void sliv(int x[], const int n, const int p, const int k)
{
static int y[100];
int i=0, j=0, l=p;
int q = p + k;
for (int i = 0; i < n; ++i){ cout << x[i] << ' ';} cout << endl;
for (int i = 0; i < n; ++i){ cout << y[i] << ' ';} cout << endl << q << endl;
if (q+k<n ){
while(i<k && j<k ){ //&& q+j<n&& l<n
if (x[p+i] < x[q+j]){
y[l] = x[p+i];
++i;
}else{
y[l] = x[q+j];
++j;
}
++l;
}
}
int m = (p+2*k < n) ? p+2*k : n;
for (int r=p; r < m; r++){
x[r] = y[r];
}
}
10. // Алгоритм Хоара.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "sortirovka.h"
using namespace std;
const int n=10;
int x[n]={2,11,5,6,4,3,9,8,10,7};
int _tmain(int argc, _TCHAR* argv[])
{
hoar(x,n);
for (int i=0; i<n; i++){
cout<< x[i] <<" ";
}
getch();
return 0;
}
//sortirovka.h
int sortirovka(int x[],int q,int p, int k);
void hoar(int x[], int n);
//sortirovka.cpp
#include "stdafx.h"
#include "sortirovka.h"
#include <iostream>
using namespace std;
int sortirovka(int x[],int q,int p, int k)
{
int i=q;
int j=p-1;
int t;
int b=x[k];
while (i<j){
while (x[i]<b){
i++;
}
while (x[j]>=b){
j--;
}
if ( x[i]>=b & x[j]<b & i<j){
t=x[i];
x[i]=x[j];
x[j]=t;
}
}
j=p-1;
while (i<j){
while (x[i]==b){
i++;
}
while (x[j]>b){
j=j-1;
}
if ( x[i]>b & x[j]==b & i<j){
t=x[i];
x[i]=x[j];
x[j]=t;
}
}
int r=i-1; //новый индекс b, передать в hoar
return r;
}
void hoar(int x[], int n){
//q-начало массива, p - конец
int q=0;
int p=n;
int k=n/2;
int r =sortirovka(x,q,p,k);
int r1=r;
while (p-q>2){
q=0;
p=r1;
r =sortirovka(x,q,p,r1-1);
q=r1;
p=n;
r =sortirovka(x,q,p,r1+1);
r1=r;
}
}
4. Результаты расчетов
1.
2.
3.
4.1)
4.2)
5.
6.
7.
8.
9,10.
Заключение
В результате работы над настоящей Курсовой Работой были достигнуты следующие цели:
-- разработаны программы базовых алгоритмов обработки данных;
-- получен навык работы с языком С и С++
-- получен навык подготовки и оформления научно-технической документации.
Список использованных источников
(Может быть другим)
1. Методичка
2. В.В. Борисенко Основы программирования
3. Павловская Т. А. -- С/С++. Программирование на языке высокого уровня.
СПб.: Питер, 2006. -- 461с.
4. Крячков А.в. Программирование на С и С++. Практикум.
5. Шилдт Г. -- С++: базовый курс. М.: ИД Вильямс, 2010. -- 624с.
Размещено на Allbest.ru
Подобные документы
Краткое описание языка программирования С++. Алгоритм линейного выбора элемента, методов минимального (максимального) элемента и челночной сортировки. Анализ и разработка приложения, организующего сортировку массива данных пятью методами сортировки.
реферат [614,8 K], добавлен 12.04.2014Понятие алгоритма и сортировки. Способы и алгоритмы сортировки массивов. Быстрая сортировка Хоара. Описание алгоритма "быстрой сортировки". Реализация на языке программирования. Анализ наихудшего разбиения. Вероятностные алгоритмы быстрой сортировки.
курсовая работа [291,5 K], добавлен 22.03.2012Методы реализации алгоритмов сортировки и алгоритмов поиска на языках программирования высокого уровня. Программирование алгоритмов сортировки и поиска в рамках создаваемого программного средства на языке Delphi. Создание руководства пользователя.
курсовая работа [1,7 M], добавлен 16.04.2012Анализ основных алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Сортировка пузырьком, методами вставок, выбора, методом Шелла, быстрая сортировка. Операция разделения массива внутренней сортировки.
курсовая работа [161,7 K], добавлен 17.12.2015Постановка задачи сортировки. Анализ основных понятий сортировок слияниями. Алгоритм сортировки простым и естественным слиянием. Оценка сложности алгоритма. Программная реализация простого слияния. Тестирование меню на корректность входных данных.
курсовая работа [283,6 K], добавлен 22.06.2015Изучение алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Отличительные черты сортировки включением, выбором, разделением, сортировки Шелла, обменной сортировки. Сравнение методов: плюсы и минусы.
курсовая работа [203,8 K], добавлен 03.12.2010Технология деятельности техника-программиста на предприятии. Анализ предметной области. Обоснование выбора среды разработки. Сравнительный анализ методов сортировки данных. Проектирование базы данных. Методы, алгоритм и средства обработки данных.
отчет по практике [498,2 K], добавлен 03.05.2015Разработка программы, сортирующей массивы данных различного типа методом подсчета. Основные шаги алгоритма сортировки, ее свойства и модификация подсчетом. Целесообразность применения сортировки подсчетом. Условия эффективности алгоритма сортировки.
лабораторная работа [438,5 K], добавлен 16.07.2015Разработка простейших линейных алгоритмов (составление логических выражений), программ с ветвлениями, циклических программ и составление их блок-схем. Практическое выполнение обработки массивов на примере вычисления элементов квадратной матрицы.
контрольная работа [173,3 K], добавлен 01.03.2010Исследование основных особенностей алгоритмов быстрой и поразрядной сортировки данных. Построение графиков зависимости времени сортировки от количества элементов в файле и от степени перемешенности элементов. Описания сортировки чисел и строковых данных.
лабораторная работа [1,2 M], добавлен 23.07.2012