Strona 1 z 1

C++ matura 2010

: 10 maja 2011, o 09:43
autor: Kryk
Witam, mam problem z takim zadaniem, chciałbym wykonać to na tablicach typu char[200][5][20]
[linie][slowa][litery]

a) Wyszukaj w pliku anagram.txt te wiersze, w których wszystkie słowa znajdujące się
w danym wierszu mają taką samą liczbę znaków.

C++ matura 2010

: 10 maja 2011, o 10:07
autor: Afish
A konkretniej, to jaki masz problem?

C++ matura 2010

: 10 maja 2011, o 10:37
autor: Kryk
Mam problem z napisaniem algorytmu, który bedzie mi sprawdzal ten warunek

C++ matura 2010

: 10 maja 2011, o 11:13
autor: Afish
Dla każdej linii
Zapamiętujesz długość pierwszego słowa
Dla każdego pozostałego słowa sprawdzasz, czy jego długość jest równa długości pierwszego
Jeżeli tak - znalazłeś wiersz spełniający wymagania

C++ matura 2010

: 10 maja 2011, o 13:39
autor: Kryk
Mógłbyś napisać jakiś przykładowy kod jak to zrobić?

C++ matura 2010

: 11 maja 2011, o 10:18
autor: Xitami
nie podoba mi się ale chyba działa

Kod: Zaznacz cały

main(){
	char buf[200], *p,*p1;
	int n;
	while(gets(buf)){  // fgets dodaje 

		p=buf;
		while(*p==32) p++;  // być‡ może zbędne 
		p1=p;
		while((*p++)>32) ;
		p-=1;
		n=p-p1; // pierwsze słowo
		while(*p){
			p++;
			while(*p==32) p++;
			if(*p == 0) { p1=p-n; break;}
			p1=p;
			while(*p>32) p++;
			if(p-p1 != n) break;
		}
		if((!*p) && (p-p1==n))
			printf(">%s< %d
",buf,n);
	}
}

C++ matura 2010

: 11 maja 2011, o 20:48
autor: soku11
A tak to wygląda w C++ (przy założeniu, że linia musi mieć >1 wyrazów):

Kod: Zaznacz cały

#include<iostream>
#include<vector>
#include<sstream>
#include<cstdlib>
using namespace std;

bool lineContainsEquallyLongWords(const string& line);

vector<string> findLinesWithEquallyLongWords(istream& stream)
{
	vector<string> result;
	string line;

	while(getline(stream, line))
	{
		if(lineContainsEquallyLongWords(line))
		{
			result.push_back(line);
		}
	}

	return result;
}

bool lineContainsEquallyLongWords(const string& line)
{
	stringstream buffer(line);

	string word;
	buffer >> word;
	if(buffer.eof())
	{
		return false;
	}

	const unsigned int firstWordLength = word.length();
	while(buffer >> word)
	{
		if(word.length() != firstWordLength)
		{
			return false;
		}
	}
	return true;
}

int main()
{
	stringstream buffer;
	buffer << "asd zxc vbn\n";
	buffer << "a s d\n";
	buffer << "a s da\n";
	buffer << "a\n";
	buffer << "qwe asdf zxc\n";
	buffer << "\n";
	buffer << "     \n";

	const vector<string> lines = findLinesWithEquallyLongWords(buffer);
	for(size_t i = 0; i < lines.size(); ++i)
	{
		cout << i + 1 << ": '" << lines[i] << "'\n";
	}

	return EXIT_SUCCESS;
}

W kodzie jest wszystko ok. Jest tylko jeden przypadek testowy, który nie przejdzie. Nie powiem jaki :) Zostawiam do dalszej analizy.

C++ matura 2010

: 11 maja 2011, o 21:04
autor: Kryk
Wszystko ok ale dajecie strasznie rozbudowane te przykłady nie ma jakiegoś bardziej prostego sposobu na wykonanie tego oraz jak już pisałem chciałbym to zrobić na tablicach typu char.

C++ matura 2010

: 11 maja 2011, o 23:08
autor: soku11
1. Mój przykład nie jest WCALE rozbudowany. Zresztą co rozumiesz poprzez rozbudowany?
2. Jeśli chcesz mieć mniej kodu, to zawsze mogę tę funkcję wrzucić w statycznego liba i podać ci kod:

Kod: Zaznacz cały

#include "myLib.hpp"

int main()
{
  // ...
  const vector<string> lines = findLinesWithEquallyLongWords(buffer);
  // ...
}
Pytanie tylko po co...
3. To są podstawy języka C++ - nic skomplikowanego. Znajomość strumieni i użytkownia klasy stringstream. Dużo łatwiejsze niż jakieś dziwne i nienaturalne manipulowanie na wskaźnikach.
4. Jak chcesz to zrobić na tablicach typu char? Skoro masz pomysł, to go zaprezentuj.
Chyba, że jest to podejście: "Widziałem gdzieś tam, kiedyś tam na zajęciach tablicę char, więc zróbcie mi to z użyciem właśnie tego". Równie dobrze mogłeś powiedzieć, że chcesz to rozwiązać używając biblioteki SDL... Bo nie widzę żadnego zastosowania tablic tutaj.