Программисты, нужна ваша помощь!!! (C++)

Компьютеры программирование программы С++

Задача: Написать программу для обработки строки следующим образом: вначале должны идти гласные буквы, упорядоченные по возрастанию (aaeeiioo), затем согласные, упорядоченные по убыванию.

Написал программу, она нормально сортирует гласные, но когда переходит к согласным - совершенно не работает.

Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
}
void main (){
int prog=0,n;

printf ("Which programm? ");
scanf ("%d",&prog);

if (prog==1){
int glas=0,sogl=0,j=0,k=0;
char *s,*l,*m;
s=(char*)calloc(20,sizeof(char));
l=(char*)calloc(20,sizeof(char));
m=(char*)calloc(20,sizeof(char));
flushall();
printf ("\nEnter text: ");
gets(s);
n=strlen(s);
/*Разбиваем на два массива исходную строку*/
for (int i=0;i<n;i++){
if(s[i]=='a'||s[i]=='q'||s[i]=='e'||s[i]=='y'||s[i]=='u'||s[i]=='i'||s[i]=='o'||s[i]=='j'){ l[j]=s[i]; glas++;j++;}
if(s[i]=='g'||s[i]=='f'||s[i]=='d'||s[i]=='s'||s[i]=='p'||s[i]=='t'||s[i]=='r'||s[i]=='w'||s[i]=='h'||s[i]=='k'||s[i]=='l'||s[i]=='z'||s[i]=='x'||s[i]=='c'||s[i]=='v'||s[i]=='b'||s[i]=='b'||s[i]=='n'||s[i]=='m'){ m[k]=s[i];sogl++;k++;}
}
printf ("\nDivided:\n");
puts(l);puts(m);
/*Сортируем каждый массив*/
char c=51,d=11;
for(j=0;j<sogl;j++) {for (int i=0;i<sogl;i++){if (m[i]>m[i+1] && (i+1)<sogl){d=m[i+1]; m[i+1]=l[i]; m[i]=d;}}}
for(j=0;j<glas;j++){ for (int i=0;i<glas;i++){if (l[i]>l[i+1] && (i+1)<glas){c=l[i+1]; l[i+1]=l[i]; l[i]=c;}}}

printf ("\nFinal:\n");
puts(l);
flushall();
puts(m);
}
Ответы:
#include <iostream.h>
#include <stack.h>
Вариант без дополнительного буфера и собственных функций
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

typedef struct {
   int counter;
   int flag;
} pair;

void classify_and_sort(const char *string, char *output)
{
   pair data[256];
   memset(data, 0, sizeof(pair) * 256);
   register int i, j;
   
   // fill up vowels
   const char *vowels = "aeiouAEIOU";
   for(i = 0; i < 10; ++i)
       data[vowels[i]].flag = 1; // it is a vowel
   
   size_t string_length = strlen(string);

   for(i = 0; i < string_length; ++i)
       ++data[string[i]].counter;
   
   char *ending = (char *) malloc(string_length);
   
   int bi = 0, ei = 0;
   char c;
   // Upper case: A = 65 Z = 90
   for(c = 65; c <= 90; ++c)
       for(j = 0; j < data[c].counter; ++j)
       {
           if(data[c].flag)
               output[bi++] = c;
           else
               ending[ei++] = c;
       }
   
   // Lower case: a = 97 z = 122
   for(c = 97; c <= 122; ++c)
       for(j = 0; j < data[c].counter; ++j)
       {
           if(data[c].flag)
               output[bi++] = c;
           else
               ending[ei++] = c;
       }
   
   for(i = ei - 1; i >= 0; --i)
       output[bi++] = ending[i];
   output[bi] = '\0';

   free(ending);
}

int main()
{
   assert(sizeof(char) == 1);
   
   clock_t timer = clock();
   
   const char *input_string = "i hate this fucking world i dont wanna live on this planet anymore";

   char *output_string = (char *)malloc(strlen(input_string) + 1);
   
   int i;
   for(i = 0; i < 10000; ++i)
       classify_and_sort(input_string, output_string);
   
   timer = clock() - timer;
   
   printf("Res = %s\n", output_string);
   free(output_string);
   
                         

   printf("Total time: %3.6f sec\n", (double)timer/CLOCKS_PER_SEC);
   return 0;
}


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.