מחרוזות C++

  • פותח הנושא OLR1
  • פורסם בתאריך

OLR1

New member
מחרוזות C++

ישנו התרגיל הבא:
כתבו תוכנית הקולטת משפט (מילים עם רווחים בניהן) מהמשתמש ומדפיסה את המילה הארוכה ביותר במשפט. המשפט מורכב מהאותיות 'A'-'Z' , 'a'-'z' ורווחים בלבד.

חשבתי להתחיל את התרגיל כך:

#include <stdio.h>
#include <conio.h>

void main(){
char S[300];
unsigned i=0, max0,cnt=0;
printf("Your sentence please: ");
gets(S);
while(S){
if (S!==' '){
cnt++;
if(cnt>max)max=cnt;
}
s++
}
if (S==' '){
cnt=0
}
}




אני לא בטוחה שהכתיבה שלי נכונה,
מה שרציתי לעשות זה לעבור על המחרוזת,אם אני פוגשת אות להגדיל את ה CNT ב-1 אז שמגיעים לרווח ואז לאפס את הCNT
אם CNT גדול מהמקסימום אז המקסימום שווה לCNT.ככה אני מנסה למצוא את המילה הארוכה ביותר.
אני אשמח לקבל תיקונים לגבי הכתיבה.

אבל איך אחרי זה אני מדפיסה את המילה??
 

פרסאוס

New member
צרי שתי מחרוזות נוספות

אחת למילה הנוכחית ואחת למילה הגדולה ביותר.
אם המילה הנוכחית גדולה מזו שבמחרוזות, החליפי.
 

OLR1

New member
איך אני עושה זאת?

אני שומרת את המילה במחרוזת?
 

nocgod

New member
יש רעיון יותר מעניין

אם כי טיפה יותר מסובך...
זה מצריך 3 מצביעים ומשתנה שלם
מצביעי ראשון char* traverser
מצביע שני char* currentLongest
מצביע שלישי char* longestWord
משתנה integer maxLength

בהתחלה traverser ו currentLongest מצביעים למילה הראשונה במשפט longestWord רייק (null) והמשתנה maxLength =0
אתה מתקדם עם traverser עד הרווח הראשון, ומונה את אורך המילה, אם המילה המתקבלת יותר ארוכה מהמילה אז מוצבעת על ידי currentLongest שאת האורך שלה אנחנו שומרים בmaxLength

בסוף הלולאה (כשתגיע לסוף המשפט) אתה תקצה זיכרון למילה הכי ארוכה תעתיק אותה ותדפיס אותה...
 

OLR1

New member
בסוף עשיתי כך:

#include <stdio.h>
#include <conio.h>

void main(){
char S[300];
unsigned i=0, cnt=0, max=0;
printf("Your sentence please: ");
gets(S);
while(S){
if (S==' '){
if (cnt>max){
max = cnt;

}
cnt=0;
}
else cnt++;
i++;
}
if (cnt>max){
max = cnt;

}



עכשיו איך אני מדפיסה את המילה עצמה?
 

ברנדל

New member
תשובה

#include <iostream>
#include <string>

int main()
{
std::cout<<"Your sentence please"<<std::endl;
std::string word;

int nMaxLetters = 0;
std::string sMaxWord;
while (std::cin >> word)
{
int nLenCurrent = word.size();
if (nLenCurrent > nMaxLetters)
{
sMaxWord = word;
nMaxLetters = nLenCurrent;
}

char ch;
std::cin.get(ch);
if (ch == 10)
break;
}

std::cout<<sMaxWord;
char ch;
std::cin.get(ch);

return 0;
}
 
תיקון לבאגוס

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
cout << "Your sentence please" << endl;
string word;

int nMaxLetters = 0;
string sMaxWord, line;
getline(cin, line);
istringstream stream(line);

while (getline(stream, word, ' '))
{
int nLenCurrent = word.size();
if (nLenCurrent > nMaxLetters)
{
sMaxWord = word;
nMaxLetters = nLenCurrent;
}
}

std::cout << sMaxWord << endl;

cin.get();
return 0;
}
 

OLR1

New member
תודה אבל..

אין לי מושג כל כך איך לקרוא את הקוד הזה.
לא למדנו מה המשמעות של :: , >>
 

ברנדל

New member
בכיף

אני לא בבית כרגע (עם המשפחה קצת) אחזור ב 14:00 וארשום לך את הקוד.
 

ברנדל

New member
בבקשה

#include <stdio.h>
#include <conio.h>

int main(array<System::String ^> ^args)
{
char S[300]; char LongestWord[300];
unsigned i=0;
unsigned nCurrentLen = 0;
unsigned nMaxLen = 0;
unsigned nStartWord = 0;
printf("Your sentence please: ");
gets(S);
while(true)
{
if (S == ' ' || S == 0)
{
if (nCurrentLen > nMaxLen)
{
nMaxLen = nCurrentLen;
nStartWord = i - nMaxLen;
nCurrentLen = 0;
}
if (S == 0)
break;
nCurrentLen = 0;
}
else
{
nCurrentLen++;
}
i++;
}

for (i = 0; i != nMaxLen ; i++)
{
LongestWord = S[nStartWord + i];
}
LongestWord = 0;
printf(LongestWord);

gets(S);

return 0;
}
 

ברנדל

New member
בכיף

בואי נקווה רק ש"טרול המתוכנן" לא ימצא לנו באגים לא קיימים ויחרבש לנו את הקוד.
 
זה בסדר גמור.

הבאגון הקודם - חשוב על הכנסת משפט שמסתיים ברווח, או משפט ריק.
 
למעלה