C++ matura 2010

Kryk
Użytkownik
Użytkownik
Posty: 114
Rejestracja: 19 lut 2009, o 17:18
Płeć: Mężczyzna
Podziękował: 11 razy
Pomógł: 15 razy

C++ matura 2010

Post 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.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

C++ matura 2010

Post autor: Afish »

A konkretniej, to jaki masz problem?
Kryk
Użytkownik
Użytkownik
Posty: 114
Rejestracja: 19 lut 2009, o 17:18
Płeć: Mężczyzna
Podziękował: 11 razy
Pomógł: 15 razy

C++ matura 2010

Post autor: Kryk »

Mam problem z napisaniem algorytmu, który bedzie mi sprawdzal ten warunek
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

C++ matura 2010

Post 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
Kryk
Użytkownik
Użytkownik
Posty: 114
Rejestracja: 19 lut 2009, o 17:18
Płeć: Mężczyzna
Podziękował: 11 razy
Pomógł: 15 razy

C++ matura 2010

Post autor: Kryk »

Mógłbyś napisać jakiś przykładowy kod jak to zrobić?
Xitami

C++ matura 2010

Post 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);
	}
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

C++ matura 2010

Post 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.
Kryk
Użytkownik
Użytkownik
Posty: 114
Rejestracja: 19 lut 2009, o 17:18
Płeć: Mężczyzna
Podziękował: 11 razy
Pomógł: 15 razy

C++ matura 2010

Post 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.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

C++ matura 2010

Post 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.
ODPOWIEDZ