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.