Помощь - Поиск - Пользователи - Календарь
Полная версия: Рекурсия со строками в C/C++
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Triplet
Необходимо составить программу, которая считывает произвольный текст и распечатывает в алфавитном порядке все латинские буквы, входящие в этот текст, используя рекурсию.
У меня пока получилась вот такая программа без рекурсии:
// 2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>
#include <stdlib.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{const int MAX=80;char qw[255];
char buffer[3][MAX];
int i=0;
int x,j,dlina,k;char z;
ifstream infile("input.txt");
while (!infile.eof())
{
infile.getline(buffer[i],MAX);
cout << buffer[i] << endl; i++;
};
k=0;dlina=0;
for (i=0;i<3;i++)
{
x=strlen(buffer[i]);dlina=dlina+x;
for (j=0;j<=x;j++)
{
qw[k]=buffer[i][j];k++;};
};
for (z='A';z<='Z';z++)
{
for (i=0;i<=k;i++)
{if ((qw[i]==z)||(qw[i]==(z+32))){cout << qw[i] << "\n";};
};
};
return 0;
}


Подскажите, пожалуйста, как осуществить рекурсию
volvo
Ты знаешь, ничего кроме как переписать программу вот так:
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <ctype.h>
using namespace std;

int main()
{
int counts['Z' - 'A' + 1][2] = {0};
const int max_len = 1024;
char buffer[max_len];

ifstream infile("input.txt");
while (!infile.eof()) {
infile.getline(buffer, max_len);
cout << buffer << endl;
for(char *p = buffer; *p; p++) {
if(isalpha(toupper(*p))) {
counts[toupper(*p) - 'A'][(*p == toupper(*p)) ? 1 : 0] += 1;
}
}

}
infile.close();

for(int i = 'A'; i <= 'Z'; i++) {
for(int j = 1; j >= 0; j--) {
for(int k = 0; k < counts[i - 'A'][j]; k++) {
cout << (char)(j ? i : tolower(i));
}
}
}
return 0;
}

, а потом сделать процесс чтения из файла и заполнения матрицы counts рекурсивным:
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <ctype.h>
using namespace std;

int counts['Z' - 'A' + 1][2] = {0};

int read_str(ifstream &is) {
const int max_len = 1024;
char buffer[max_len];

if(!is.eof()) {
is.getline(buffer, max_len);
cout << buffer << endl;
for(char *p = buffer; *p; p++) {
if(isalpha(toupper(*p))) {
counts[toupper(*p) - 'A'][(*p == toupper(*p)) ? 1 : 0] += 1;
}
}
read_str(is);
}
return 0;
}

int main()
{
ifstream infile("input.txt");
read_str(infile);
infile.close();

for(int i = 'A'; i <= 'Z'; i++) {
for(int j = 1; j >= 0; j--) {
for(int k = 0; k < counts[i - 'A'][j]; k++) {
cout << (char)(j ? i : tolower(i));
}
}
}
return 0;
}

, почему-то не придумывается...

Зачем тут вообще нужна рекурсия - непонятно совершенно...
Triplet
Да, не слабая программа...
Спасибо большое! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.