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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2012, 19:25   #1
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию Проблемы с выводом в файл или..

Решил вот эту задачу :

Вот мое решение :
Код:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main ()
{
	ifstream fin("input.txt");
	ofstream fout ("output.txt");

	char StrNumb[4];
	fin.getline(StrNumb,3);
	int Number = atoi (StrNumb); // загоняем в переменную Number количество строк с почтовыми номерами

	char Emails [30][100];

	for(int i=0;i<Number;i++)
	{
		fin.getline(Emails[i],100); // заногняем  все почтовые адреса в массив Emails
	}

	char Input[100];
	fin.getline(Input,100); // загоняем строку , которую исчет юзер,  в массив Input
	
	char Results[30][100];
	int inp=strlen(Input);
	int m=0;

	for(int j=0;j<Number;j++)
	{   
		int count=0;
		int emls=strlen(Emails[j]);
		 for(int y=0;y<inp;y++)
			{
				for(int k=0;k<emls;k++)
					{
						if(Emails[j][k]==Input[y]) 
						{ 
							for(int b=y+1;b<(inp-y);b++)
									{
										if(Emails[j][b]==Input[b]) count++;
										if(Emails[j][b]!=Input[b]) count--;
									}

							if( ((inp-y)==count) || ((inp-y)==(count+1)) || ((inp-y)==(count+2))  ) 
									{
										strcpy(Results[m],Emails[j]);
										m++;
										goto next;
								    }
						}
						
					}

			}
	next:;
	}


	fout<<m<<endl;
    for(int c=0;c<m;c++)
	{
		int reslen=strlen(Results[c]);
		for(int x=0; x<reslen; x++) fout<<Results[c][x];
		fout<<endl;
	}
	system("pause");

	return 0;


}
а в выходном файле получаю:

т.е. программа почему-то не цепляет третий емыл , который подходит под условия, не могу понять почему так происходит

Последний раз редактировалось neonakaneya; 30.01.2012 в 19:35. Причина: отредактировал нубскую ошибку
neonakaneya вне форума Ответить с цитированием
Старый 30.01.2012, 20:23   #2
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

поправил:
Код:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main ()
{
	ifstream fin("input.txt");
	ofstream fout ("output.txt");

	char StrNumb[4];
	fin.getline(StrNumb,3);
	int Number = atoi (StrNumb); // загоняем в переменную Number количество строк с почтовыми номерами

	char Emails [30][100];

	for(int i=0;i<Number;i++)
	{
		fin.getline(Emails[i],100); // заногняем  все почтовые адреса в массив Emails
	}

	char Input[100];
	fin.getline(Input,100); // загоняем строку , которую исчет юзер,  в массив Input
	
	char Results[30][100];
	int inp=strlen(Input);
	int m=0;

	for(int j=0; j<Number; j++)
	{   
		int count=0;
		int emls=strlen(Emails[j]);

		 for(int y=0; y<inp; y++)
			{
				for(int k=0; k<emls; k++)
					{
						if(Emails[j][k]==Input[y]) 
						{ 
							for(int b=y+1, b1=k+1; b<(inp-y); b++,b1++)  if(Emails[j][b1]==Input[b]) count++;  
							
							if( ((inp-y)==count) || ((inp-y)==(count+1)) || ((inp-y)==(count+2))  ) 
									{
										strcpy(Results[m],Emails[j]);
										m++;
										goto next;
								    }
						}
						
					}

			}
	next:;
	}


	fout<<m<<endl;
    for(int c=0; c<m; c++)
	{
		int reslen=strlen(Results[c]);
		for(int x=0; x<reslen; x++) fout<<Results[c][x];
		fout<<endl;
	}
	system("pause");

	return 0;


}
Но теперь на выходе лишний емыл :


Даже не то чтобы лишний, а вывод теперь не соотвествует ответу Х_Х
neonakaneya вне форума Ответить с цитированием
Старый 30.01.2012, 20:55   #3
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

Опять поправил:
Код:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main ()
{
	ifstream fin("input.txt");
	ofstream fout ("output.txt");

	char StrNumb[4];
	fin.getline(StrNumb,3);
	int Number = atoi (StrNumb); // загоняем в переменную Number количество строк с почтовыми номерами

	char Emails [30][100];

	for(int i=0;i<Number;i++)
	{
		fin.getline(Emails[i],100); // заногняем  все почтовые адреса в массив Emails
	}

	char Input[100];
	fin.getline(Input,100); // загоняем строку , которую исчет юзер,  в массив Input
	
	char Results[30][100];
	int inp=strlen(Input);
	int m=0;

	for(int j=0; j<Number; j++)
	{   
		int count=0;
		int emls=strlen(Emails[j]);

		 for(int y=0; y<inp; y++)
			{
				for(int k=0; k<emls; k++)
					{
						if(Emails[j][k]==Input[y]) 
						{ 
							for(int b=y;b<(inp-y);b++) 
							{	
							if(Emails[j][k+b]==Input[b]) count++;		
							if( ((inp-y)==count) || ((inp-y)==(count+1)) || ((inp-y)==(count+2))  ) 
											{
												strcpy(Results[m],Emails[j]);
												m++;
												goto next;
											}
							}		
						}
						
					}

			}
	next:;
	}


	fout<<m<<endl;
    for(int c=0; c<m; c++)
	{
		int reslen=strlen(Results[c]);
		for(int x=0; x<reslen; x++) fout<<Results[c][x];
		fout<<endl;
	}


	return 0;


}

Теперь выводит 3 мыла , но одно из них не подходит под условие .
Что я делаю не так? О_О
neonakaneya вне форума Ответить с цитированием
Старый 30.01.2012, 21:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю финт ушами:
Код:
// sdf.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <string>

using namespace std;

/*
 s - Исходная строка
 q - сторка совпадения
 perc - процент совпадения
*/
int relevatio(string s, string q, int perc){
	int r=0;
	int k=0;
	for(int i=0;i<q.length();i++){
		bool found=false;
		for(;k<s.length();k++){
			if(q[i]==s[k]){
				r++; 
				break;
				found=true;
			}
		}
		if(found) k=i;
	}
	r=r*100/s.length(); //100/len=x/k
	return r>perc;
}

int _tmain(int argc, _TCHAR* argv[])
{
	string s[5]={"petrpetrov","ivanivanov","vetrovalexey","olegpestov","petyaivanov"};
	for(int i=0;i<5;i++){
		bool k=relevatio(s[i].c_str(),"petrov",20);
		// Если процент совпадения по последовательности всплытия символов более указаноого - строка подходит. 
		printf("%s\t%s\n",s[i].c_str(),(k)?"Yes":"No");

	}
	getchar();
	return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.01.2012, 22:30   #5
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

Stilet,Спасибо за помощь , но я ни капли не понял
Путем долгого "метода тыка" пришел к вот такому вот коду:
Код:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main ()
{
	ifstream fin("input.txt");
	ofstream fout ("output.txt");

	char StrNumb[4];
	fin.getline(StrNumb,3);
	int Number = atoi (StrNumb); // загоняем в переменную Number количество строк с почтовыми номерами

	char Emails [30][100];

	for(int i=0;i<Number;i++)
	{
		fin.getline(Emails[i],100); // заногняем  все почтовые адреса в массив Emails
	}

	char Input[100];
	fin.getline(Input,100); // загоняем строку , которую исчет юзер,  в массив Input
	
	char Results[30][100];
	int inp=strlen(Input);
	int m=0;

	for(int j=0; j<Number; j++)
	{   
		int count=0;
		int emls=strlen(Emails[j]);

		 for(int y=0; y<inp; y++)
			{
				for(int k=0; k<emls; k++)
					{
						if(Emails[j][k]==Input[y]) 
						{ 
							for(int b=2; b<(inp-y); b++) if(Emails[j][k+b]==Input[y+b]) count++;		
						}
						
					    if( (inp==count) || (inp==(count+1))  || (inp==(count+2)) ) 
							  {
								strcpy(Results[m],Emails[j]);
								m++;
								goto next;
							  }
						
					}

			}
	next:;
	}


	fout<<m<<endl;
    for(int c=0; c<m; c++)
	{
		int reslen=strlen(Results[c]);
		for(int x=0; x<reslen; x++) fout<<Results[c][x];
		fout<<endl;
	}


	return 0;


}
заработало правильно только после того как b = 2 подставил в инициализацию цикла, почему именно с 2кой программа корректно заработала - не могу вдуплить , мне логичным казалось b= 0 или b= 1 , но ни как не 2ка.
neonakaneya вне форума Ответить с цитированием
Старый 31.01.2012, 08:31   #6
danzel1
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 61
По умолчанию

Stilet

тут имелось ввиду то что данные имейлы вводились тестирующей программой(как это обычно и бывает на олимпиадах) и потому эти имейлы могли быть хоть вот такими:"tratataololo@tuloh.to", "adsgsgklgjh@dfkjgsdfg.asdf" ,"iosif_stalin@kreml.su". суть лишь в том чтобы проверить что один имейл не сильно отличается от другого
danzel1 вне форума Ответить с цитированием
Старый 31.01.2012, 08:37   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я понял суть. Именно поэтому и предложил анализировать процент входимости символов по порядку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.01.2012, 18:11   #8
neonakaneya
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 19
По умолчанию

Цитата:
Сообщение от neonakaneya Посмотреть сообщение

заработало правильно только после того как b = 2 подставил в инициализацию цикла, почему именно с 2кой программа корректно заработала - не могу вдуплить , мне логичным казалось b= 0 или b= 1 , но ни как не 2ка.
Мда, как оказалось - я ошибался, программа отработала только на нескольких частных примерах входного файла, а сделать ее "универсальной" - у меня не получается
neonakaneya вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с выводом русского текста Whirlwind06 Помощь студентам 4 31.12.2011 19:30
C# Проблемы выводом таблицы PROkaZZZniK Помощь студентам 1 22.11.2011 12:31
Проблемы с выводом Hemul PHP 4 17.02.2011 20:59
Проблема с созданием или выводом строк ТриСемёрки Общие вопросы C/C++ 4 13.05.2010 18:17
Проблемы с выводом Drozd Oleg Общие вопросы C/C++ 1 21.02.2010 22:12