ОАП_решения_задачи
.pdf
i++;}
51
cout<<"Количество предложений в заданном тексте "<<sum<<endl; system ("PAUSE");
return 0;
}
#include "stdafx.h" #include <iostream> #include <stdio.h> #include <string.h> using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale (LC_CTYPE,"Russian"); char mas[100];
int sum=0;
cout<<"Здравствуйте! Задайте строку"<<endl; cin>>mas ;
int i=0; while(*(mas+i)!='\0')
{if ((*(mas+i)=='.')|| (*(mas+i)=='!')||(*(mas+i)=='?')) sum++;
i++;}
cout<<"Количество предложений в заданном тексте "<<sum<<endl; system ("PAUSE");
return 0;
}
52
Тема 8 . Функции
Задача 8.1
Функция создает копию строки и "переворачивает" ее.
(Дополнительно: программа проверяет, не является ли исходная строка перевертышом)
#include "stdafx.h" #include<stdio.h> #include<iostream> #include <locale> #include<string.h> #include <windows.h>
using namespace std;
void perest(char *c, int *n)
{
int i,j,k,f=0; char buff;*n=0;
for(i=0;i<*n;i++)
if (c[0]==' ')for(i=0;c[i]==' ';i++); else i=0;
for (;c[i]!='\0';i++)
if (c[i]==' ' && c[i+1]!=' ' && c[i+1]!='\0')
*n=*n+1;{
f=i; for(j=i-1,k=i-f;j>k;j--,k++)
{
buff=c[j];
c[j]=c[k];
c[k]=buff;
}
}
if (*n!=0)*n=*n+1;
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_CTYPE, "Russian"); char c[100];
int N, n, i, k, x; gets(c); perest(c,&N); printf("%s\n",c); n=strlen(c);
if (n%2==0) x=n/2; else x=(n+1)/2; k=0;
for(i=0,n=n-1;i<=n;i++,n--)
if (c[i]==c[n]) k++; if (k==x)
сout<<"Это строка перевертыш"; else
cout<<"Это строка не перевертыш"; cout<<"Коли4ество слов равно:";cout<<N<<endl;
}
Задача 8.2
Функция находит в строке самое длинное слово и возвращает указатель на него.
С ее помощью реализовать размещение слов в выходной строке в порядке убывания их длины.
#include "stdafx.h"
# include <iostream> #include <string.h> #include <stdio.h> #include <windows.h>
using namespace std;
int find(char *p)
{
int i,n,k,u,m; n=0;k=0;
if (p[0]==' ')
for(i=0;p[i]==' ';i++) n=0;
else i=0;
for (u=i;p[i]!=0;i++)
{
if (p[i]!=' ') n++;
else break;
}
while (p[i]!=0)
{
for (m=i;p[i]!=0 && p[i]==' ';i++)
{
k=0;
m++;
}
for (;p[i]!=0 && p[i]!=' ';i++)
54
k++;
if (k>n)
{
n=k;
u=m;
}
k=0;
}
return u;
}
void main()
{
char p[100],p1[100],p2[100]; int i=0,u,j=0,k,l; cout<<"Input string: "<<endl; gets(p);
l=strlen(p);
cout<<endl; while (j<l)
{
u=find(p);
for (i=u;p[i]!=0;i++,j++)
{
if(p[i]!=' ') p1[j]=p[i];
else break;
}
p1[j]=' '; k=0;
if (u!=0)
{for (i=0;i<u;i++,k++) p2[k]=p[i];}
if ((i+j)!=l)
{for (i=i+j;p[i]!=0;i++,k++) p2[k]=p[i];
p2[k]='\0';} else p2[k]='\0';
for (i=0;p2[i]!=0;i++) p[i]=p2[i];
p[i]='\0'; j++;
}
p[j--]='\0';
for (i=0;i<l;i++) cout <<p1[i]; cout <<endl;
}
Задача 8.3
Написать функцию, проверяющую есть ли отрицательные элементы в указанной строке двумерного массива. Удалить из массива все строки с отрицательными элементами, удаленная строка заполняется 0 и переносится в конец массива.
#include "stdafx.h" #include <iostream> #include <math.h> #include <time.h>
bool check (int *p, int m)
{
int i;
for (i = 0; i < m && p[i]; i++); return i != m;
}
#define MaxN 100 int a[MaxN][MaxN];
int main ()
{
setlocale (LC_CTYPE, "Russian"); int n, m;
std::cout << "Введите размерность матрицы" << std::endl; std::cin >> n >> m;
srand ((unsigned) time (NULL)); for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
a[i][j] = rand () % 10; std::cout << a[i][j] << ' ';
}
std::cout << std::endl;
}
for (int i = 0; i < n; i++)
if (check ((int*) a[i], m))
{
for (int k = i + 1; k < n; k++)
for (int j = 0; j < m; j++) std::swap (a[k][j], a[k - 1][j]); for (int j = 0; j < m; j++) a[n - 1][j] = 0;
}
std::cout << std::endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++) std::cout << a[i][j] << ' '; std::cout << std::endl;
}
56
return 0;
}
57
Тема 9 Динамические многомерные массивы
Задача 9.1
Сформировать одномерный массив целых чисел,
используя датчик случайных чисел и выполнить задание c использованием индексов
Удалить последний элемент равный 0. Добавить после элемента массива с заданным индексом элемент со значением 100.
#include "stdafx.h" #include <stdio.h> #include <algorithm> #include <locale> #include <time.h>
int main (void)
{
setlocale (LC_CTYPE, "Russian");
int n;
printf ("Введите размерность массива\n"); scanf ("%d", &n);
int *a = new int[n];
srand ((unsigned) time (NULL));
for (int i = 0; i < n; i++)
{
a[i] = rand () % 10; printf ("%d ", a[i]);
}
putchar ('\n'); int pos;
for (pos = n - 1; pos >= 0 && a[pos] != 0; pos--);
pos == -1 ? printf ("Нету нулевого элемента\n") : printf ("Позиция последнего нулевого элемента:
%d\n", pos);
for (int i = pos; i < n - 1; i++) std::swap (a[i], a[i + 1]); printf ("Введите позицию элемента, после которого вставить 100\n"); scanf ("%d", &pos);
for (int i = n - 1; i > pos + 1; i--) std::swap (a[i], a[i - 1]); a[++pos] = 100;
for (int i = 0; i < n; i++) printf ("%d ", a[i]); putchar ('\n');
delete[] a; return 0;
}
Задача 9.2
В массиве M(k) много совпадающих элементов.
Найти количество различных элементов в нем (не упорядочивая массива).
#include "stdafx.h" #include <stdio.h> #include <locale> #include <math.h> #include <time.h>
int main (void)
{
setlocale (LC_CTYPE, "Russian");
int n;
printf ("Введите размерность массива\n"); scanf ("%d", &n);
int *m = new int [n];
srand ((unsigned) time (NULL)); for (int i = 0; i < n; i++)
{
m[i] = rand () % 10; printf ("%d ", m[i]);
}
printf ("\nНеповторяющиеся элементы\n");
for (int i = 0; i < n; i++)
{
bool ans = true;
for (int j = 0; j < n; j++)
{
if (i == j) continue; if (m[i] == m[j])
{
ans = false; break;
}
}
if (ans) printf ("%d ", m[i]);
}
59 delete[] m; return 0;
}
Задача 9.3
Преобразовать строку следующим образом: удалить все символы “*”, и повторить каждый символ, отличный от “*”.
#include "stdafx.h" #include <stdio.h> #include <locale> #define MaxLen 256
int main (void)
{
setlocale (LC_CTYPE, "Russian");
puts ("Введите строку");
char *s = new char [MaxLen], *ans = new char [MaxLen * 2];
gets (s);
int len = -1;
for (int i = 0; s[i]; i++) if (s[i] != '*')
{
ans[++len] = s[i]; ans[++len] = s[i];
}
ans[++len] = '\0'; puts (ans);
delete[] s, ans; putchar ('\n'); return 0;
}
