C++ matura 2010
-
- 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
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.
[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.
-
- 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
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
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
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);
}
}
-
- 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
A tak to wygląda w C++ (przy założeniu, że linia musi mieć >1 wyrazów):
W kodzie jest wszystko ok. Jest tylko jeden przypadek testowy, który nie przejdzie. Nie powiem jaki Zostawiam do dalszej analizy.
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;
}
-
- 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
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.
-
- 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
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:
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.
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);
// ...
}
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.