Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2014, 02:02   #1
dreaminn
 
Регистрация: 12.05.2012
Сообщений: 5
Радость Вставить слог в строку (С)

Есть следующая задача:
вставить после каждой гласной буквы в строке слог "ла", а затем удалить все вставленные слоги из строки.
Так как не догоняю, как организовать цикл вставки без уничтожения тех символов, на место которых идет вставка, т.е.сдвиг их вправо, то, следовательно и обратная задача не решена.
Заранее спасибо за любую подсказку или помощь.
Код:
#include <stdio.h>
#include <Windows.h>
#include <locale.h> 
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>

FILE *f;
void record(char*);
void read(char*);
void encrypt(char*);
void decrypt(char*);


void main(void){

setlocale(LC_CTYPE, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int q;
char *string; 
string=new char[200]; 
while(1) { //бесконечный цикл
printf("\n\n\t***МЕНЮ***\n\n");
printf("\t1: Сформировать с клавиатуры строку  и записать в файл (строка может содержать пробелы);\n");
printf("\t2: Считать строку из файла и распечатать\n");
printf("\t3: Зашифровать строку и записать в файл\n");
printf("\t4: Расшифровать строку и записать в файл\n");
printf("\t5: Выход\n\t");

scanf_s("%d",&q);
switch(q){
case 1: {record (string);break;};//создать
case 2: {read (string);break;}//просмотр
case 3: {encrypt (string);break;}//коррекция
case 4: {decrypt (string);break;}//задание
case 5: exit (0);//выход
} }
delete[] string; 
_getch();}


 void record (char* string)  
{
FILE *f;
 	f = fopen("d:\\7.txt","w");
		
printf("Введите строку:\n"); 
fflush(stdin);
gets (string) ; 
 fputs(string, f);      
	fclose(f); 
 	 
}

void read(char* string){

FILE *f;
if((f=fopen("d:\\7.txt","r"))==NULL)
{ printf("Не удалось открыть файл\n");
	 _getch(); 
	 return;    }

fgets(string,200,f) ;  //Чтение строк из файла
fputs(string, stdout);    //Вывод строку на консоль
fclose(f); 
}

void encrypt(char* string){
int i,n,k;
FILE *f;
char string1,tmp;
if((f=fopen("d:\\7.txt","w+"))==NULL)
{ printf("Не удалось открыть файл\n");
	 _getch(); 
	 return;    }

fgets(string,200,f) ;  //Чтение строк из файла
printf ("Исходная строка: %s\n", string); 
int length= strlen(string);
for (i=0; i<length;i++)
     {if(string[i]=='а'|| string[i]=='А' || string[i]=='е'|| string[i]=='Е'|| string[i]=='ё'|| string[i]=='Ё'||
 string[i]=='и'|| string[i]=='И'|| string[i]=='о'|| string[i]=='О'|| string[i]=='у'|| string[i]=='У'|| string[i]=='ы'||
 string[i]=='Ы'|| string[i]=='э'|| string[i]=='Э'|| string[i]=='ю'|| string[i]=='Ю'||string[i]=='я'|| string[i]=='Я')
     
    {	
		
		for (int j=i+1;j<length;j++){//Что-то тут не то...
			string[j]=string[j+2];
			break;}
		string[i+1]='л';
		string[i+2]='а';
	   
		printf ("Зашифрованная строка: %s\n", string);	}
 
fputs(string, f);    //Вывод строку на консоль
fclose(f);  
 
}

}

void decrypt (char* string)//Нет решения
{
int k;
char *zl;
FILE *f;
 
if((f=fopen("d:\\7.txt","r+"))==NULL)
{ printf("Не удалось открыть файл\n");
	 _getch(); return;    }



_getch();}

Последний раз редактировалось Stilet; 23.02.2014 в 10:04.
dreaminn вне форума Ответить с цитированием
Старый 23.02.2014, 10:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю такую схему:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *foo(char *s){
    char *abc="aeiou";
    int k=0,i,j;
    for(i=0;s[i];i++)    k+=(strchr(abc,s[i]))?3:1;
    char *sa=malloc(k)+1;
    for(i=0,j=0;s[i];i++,j++){
     sa[i]=s[j];
     if(strchr(abc,s[j])){
         sa[++i]='l';sa[++i]='a';
     }
    }
    sa[i]=0;
    return sa;

}
int main()
{
    char *s="halabalayka";
    char *sa=foo(s);
    printf("%s\n%s",s,sa);
    free(sa);
    getchar();
    return 0;
}
Писал с потолка, потому могут быть недочеты. Но сама методика - создавать новую строку и переписывать в нее нужные символы дополняя.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2014, 22:49   #3
dreaminn
 
Регистрация: 12.05.2012
Сообщений: 5
По умолчанию

Спасибо за ответ,но, к сожалению,мне этот метод не совсем понятен
Возможно ли, все-таки сделать простым сдвигом вправо,как,собственно, первоначально и есть в коде, только не получается, так как идет замена символов, а не вставка.
Значит, вопрос: Как осуществить сдвиг элементов массива вправо?
Кстати, строка вводится пользователем.
dreaminn вне форума Ответить с цитированием
Старый 23.02.2014, 23:12   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
все-таки сделать простым сдвигом вправо
проблема в том что ты используешь не С++ string а обычный массив символов. И заранее его длину (длину введенной строки) не можешь знать. Поэтому представь что весь массив у тебя заполнен символами строки. Куда его сдвигать? Строка получается выйдет за его пределы, а это плохо. Поэтому я и предположил что лучше делать так: Пробежаться по строке выяснив ее истинную длину и длину, которая необходима для вставки слогов. Создать новую строку. Чистую.
А уже потом посимвольно попереносить в нее из первой строки + новые слоги.
Если хочешь делать сдвигами, то тебе придется четко ограничить длину вводимой строки и зарезервировать под массив символов чуть ли не в два а то и в три раза больше ячеек памяти, ибо кто знает где и как будут стоять гласные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.03.2014, 00:25   #5
dreaminn
 
Регистрация: 12.05.2012
Сообщений: 5
По умолчанию

Хорооошенько обмозговав Вашу подсказку,с некоторой модификацией довела до толку. Спасибо.
Код:
#include <stdio.h>
#include <Windows.h>
#include <locale.h> 
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>

FILE *f;
void record(char*);
void read(char*);
void encrypt(char*, char*);
void decrypt(char*);


void main(void){

setlocale(LC_CTYPE, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int q;
char *string;
string=new char[200]; 

while(1) { //бесконечный цикл
printf("\n\n\t***МЕНЮ***\n\n");
printf("\t1: Сформировать с клавиатуры строку  и записать в файл (строка может содержать пробелы);\n");
printf("\t2: Считать строку из файла и распечатать\n");
printf("\t3: Зашифровать строку и записать в файл\n");
printf("\t4: Расшифровать строку и записать в файл\n");
printf("\t5: Выход\n\t");

scanf_s("%d",&q);
switch(q){
case 1: {record (string);break;};//создать
case 2: {read (string);break;}//просмотр
case 3: {encrypt (string,string);break;}//коррекция
case 4: {decrypt (string);break;}//задание
case 5: exit (0);//выход
} }
delete[] string; 
_getch();}


 void record (char* string)  
{
FILE *f;
 	f = fopen("d:\\lab7.txt","w");
		
printf("Введите строку:\n"); 
fflush(stdin);
gets (string) ; 
 fputs(string, f);      
	fclose(f); 
 	 
}

void read(char* string){

FILE *f;
if((f=fopen("d:\\lab7.txt","r"))==NULL)
{ printf("Не удалось открыть файл\n");
	 _getch(); 
	 return;    }

fgets(string,200,f) ;  //Чтение строк из файла
fputs(string, stdout);    //Вывод строку на консоль
fclose(f); 
}

void encrypt(char* string,char* string1){
int i,n,j;
FILE *f;

string1=new char[1000];

if((f=fopen("d:\\lab7.txt","w+"))==NULL)
{ printf("Не удалось открыть файл\n");
	 _getch(); 
	 return;    }

fgets(string,200,f) ;  //Чтение строк из файла
printf ("Исходная строка: %s\n", string); 
int length=strlen(string);

for (i=j=0;i<=length+1;i++)
    {
		if(string[i]=='а'|| string[i]=='А' || string[i]=='е'|| string[i]=='Е'|| string[i]=='ё'|| string[i]=='Ё'|| string[i]=='и'|| string[i]=='И'|| string[i]=='о'|| string[i]=='О'|| string[i]=='у'|| string[i]=='У'|| string[i]=='ы'|| string[i]=='Ы'|| string[i]=='э'|| string[i]=='Э'|| string[i]=='ю'|| string[i]=='Ю'||string[i]=='я'|| string[i]=='Я')
        {
		string1[j]=string[i];
		string1[j+1]='л';
		string1[j+2]='а';
		  j=j+3;}
		else {string1[j]=string[i];
		j=j+1;}
  }
     
	 
          printf ("Зашифрованная строка: %s", string1);			

fputs(string1,f);
fclose(f);  
 
}



void decrypt (char* string1)
{
int j=0,k=0;
FILE *f;
 char *string2;
string2=new char[1000];

if((f=fopen("d:\\lab7.txt","r+"))==NULL)
{ printf("Не удалось открыть файл\n");
	 _getch(); return;    }
fgets(string1,1000,f) ;  //Чтение строк из файла
printf ("Зашифрованная строка: %s\n", string1); 
int length1=strlen(string1);

while (j<=length1+1)
    {
		if(string1[j]=='а'|| string1[j]=='А' || string1[j]=='е'|| string1[j]=='Е'|| string1[j]=='ё'|| string1[j]=='Ё'|| string1[j]=='и'|| string1[j]=='И'|| string1[j]=='о'|| string1[j]=='О'|| string1[j]=='у'|| string1[j]=='У'|| string1[j]=='ы'|| string1[j]=='Ы'|| string1[j]=='э'|| string1[j]=='Э'|| string1[j]=='ю'|| string1[j]=='Ю'||string1[j]=='я'|| string1[j]=='Я')
        {
		string2[k]=string1[j];
		j=j+3;
		k++;
		}
		else {string2[k]=string1[j];
		j++;	 
		k++;}
  }
     
	 
          printf ("Расшифрованная строка: %s", string2);			
f = fopen("d:\\lab7.txt","w");
fputs(string2,f);
fclose(f);  
 
}
dreaminn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставить строку в таблицу. riniks17 Microsoft Office Excel 0 28.03.2013 14:48
Двунаправленный линейный список строк. Вставить строку, удалить строку и заменить строку tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 4 05.07.2012 20:27
вставить новую строку Daniel Sixx Помощь студентам 0 28.03.2012 18:39
Вставить слово в строку VictorM Microsoft Office Excel 2 17.02.2009 21:45