Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Откриване на празни полета

Featured Replies

Здравейте,

Отново се затруднявам с решаването на една задача. Условието е следното:

 

Write a program that reads the country data in the file worldpop.txt (included with the
book’s source code). Do not edit the file. Use the following algorithm for processing
each line. Add non-white space characters to the country name. When you encounter
a white space, locate the next non-white space character. If it is not a digit, add a
space and that character to the country name. Otherwise unget it and read the
number. Print the total of all country populations 

Засега съм написал този код като неясното ми е как точно да открия празните полета при четенето на текстовия файл и как да открия дали не е цифра. Знам, че трябва да се използват функциите get и unget. Също така се притеснявам дали стринга в който съхранявам текста няма да получи овърфлоу при по-дълъг текст Как чрез указател към тип стринг и new да алокирам адрес с подходящ разбер при рънтайм? Много неяснотии имам. :(

 


void readFileContent(const string& filename, ifstream &f, string &text)
{
    f.open(filename.c_str(), fstream::in);
    
    if(f.fail()){
        
        cout << "Error! Cannot open file. Please check file name." << endl;
    }else{
        

        string newtext;
        int i;
        while(getline(f, text)){

            newtext += text;

            cnewtext.push_back('\n');
            
            
        }

	while(newtext[i] != \0’){
		if(newtext[i] ==  ’){
			if(newtext[i+1] != \0 && newtext[i+1] !=  ’){
				newtext[i] = newtext[i+1]; 
			}
		}
	}
      f.close();  
    
    
    }

}

int main(){



	string filename = text.txt”;
	string* text = new string;
	ifstream f;
	
	readFileContent(filename, f, text);




	return 0;
}

 

Трябва да дадеш някаква примерна записка във файла.

Ако не ми е ясна структурата на файла, как да помогна.

Доколкото разбирам от условието, идеята е че има държави състоящи се от повече от една дума. Буркина Фасо държава ли е, да не се изложа. В библиотеката на езика С има хедър "ctype.h". В С++ се инклудва с #include <cctype>. Бряг на слоновата кост, много спейси. Ползвай int isspace(int c); Връща нула, ако символа не е уайт спейс, и число различно от нула, ако символа е уайт спейс. В описанието по долу е показано, кои символи са уайт спейс и кои не са.

Там ги има функциите

int isalnum(int c);
isalpha(c) or isdigit(c)
int isalpha(int c);
isupper(c) or islower(c)
int iscntrl(int c);
is control character
int isdigit(int c);
is decimal digit
int isgraph(int c);
is printing character other than space
int islower(int c);
is lower-case letter
int isprint(int c);
is printing character (including space)
int ispunct(int c);
is printing character other than space, letter, digit
int isspace(int c);
is space, formfeed, newline, carriage return, tab, vertical tab
int isupper(int c);
is upper-case letter
int isxdigit(int c);
is hexadecimal digit
int tolower(int c);
return lower-case equivalent
int toupper(int c);
return upper-case equivalent

Редактирано от Реджеп Иведик (преглед на промените)

  • Автор
преди 2 часа, Реджеп Иведик написа:

Трябва да дадеш някаква примерна записка във файла.

Ако не ми е ясна структурата на файла, как да помогна.

Доколкото разбирам от условието, идеята е че има държави състоящи се от повече от една дума. Буркина Фасо държава ли е, да не се изложа. В библиотеката на езика С има хедър "ctype.h". В С++ се инклудва с #include <cctype>. Бряг на слоновата кост, много спейси. Ползвай int isspace(int c); Връща нула, ако символа не е уайт спейс, и число различно от нула, ако символа е уайт спейс. В описанието по долу е показано, кои символи са уайт спейс и кои не са.

Там ги има функциите

int isalnum(int c);
isalpha(c) or isdigit(c)
int isalpha(int c);
isupper(c) or islower(c)
int iscntrl(int c);
is control character
int isdigit(int c);
is decimal digit
int isgraph(int c);
is printing character other than space
int islower(int c);
is lower-case letter
int isprint(int c);
is printing character (including space)
int ispunct(int c);
is printing character other than space, letter, digit
int isspace(int c);
is space, formfeed, newline, carriage return, tab, vertical tab
int isupper(int c);
is upper-case letter
int isxdigit(int c);
is hexadecimal digit
int tolower(int c);
return lower-case equivalent
int toupper(int c);
return upper-case equivalent

Не се сетих, че има и готови функции за тази работа. :D Ми принципно в условието не ми е дадено съдържанието на текстовия файл. Сега ще пробвам с тези функции.

Съдържанието на файла е имена на държави и население, програмата трябва да сметне общия брой на населението, а не да тъпче всичко в един стринг.

#include <cctype>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;


int main()
{
	int i, sum;
	ifstream ifs("worldpop.txt");
	string s;
	vector <long> mong;
	while (ifs >> s)
	{
		if (isdigit(s[0]))
		{
			mong.push_back(strtol(s.c_str(), 0, 10));
		}
	}
	ifs.close();
	sum = 0;
	for (i = 0; i < mong.size(); i++)
	{
		sum = sum + mong[i];
	}
	cout << "total population is: " << sum;
	return 0;
}

 

Редактирано от Реджеп Иведик (преглед на промените)

не че се заяждам, ама не разбрах защо ги тъпчеш във вектор като може директно да ги събираш числата.

И освен това int е малко малък да побере сичкото китаец и сичкото индийски мангал

#include <cctype>
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;


int main()
{
	int i
  	long long sum;
	ifstream ifs("worldpop.txt");
	string s;
	sum = 0;
	while (ifs >> s)
	{
		if (isdigit(s[0]))
		{
			sum = sum + (strtol(s.c_str(), 0, 10));
		}
	}
	ifs.close();
	cout << "total population is: " << sum;
	return 0;
}

Е, поправих се

Редактирано от Реджеп Иведик (преглед на промените)

Ще минат, че и оттатък. Който не е ходил в Китай и Индия не знае какво значи много народ. Много народ и много народ не е едно и също. Да се чете strtoll

  • Автор

По условие не може да се използват вектори. Може ли да ми обясните неяснотиите от първия ми пост, за да я оправя задачата?

Ми аз нали я написах отдолу без вектор.

Ползвай оператор >>, той и без това чете до уайт спейс по рождение. Провери дали първия символ на прочетеното е цифра и ако е добави числото към сумата. Ако не е, дискард и донт кеъ

Пък ако доценката ти върже двете ръце и десния крак, миоже и с левия, на чисто С

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>


int main()
{
	long long sum = 0;
	int i;
	char buffer[64];
	char check, checkm1;
	FILE* d;
	d = fopen("worldpop.txt", "rb");
	while (!feof(d))
	{
		fread(&check, 1, 1, d);
		if (isdigit((int)check)&& isspace(checkm1))
		{
			for (i = 0;; i++)
			{
				buffer[i] = check;
				fread(&check, 1, 1, d);
				if ((!isdigit((int)check)) || (feof(d)))
				{
					buffer[i + 1] = 0;
					break;
				}
			}
			sum = sum + strtoll(buffer, 0, 10);
		}
		else checkm1 = check;
	}
	printf("total population is %lld", sum);
	return 0;
}

 

Редактирано от Реджеп Иведик (преглед на промените)

преди 24 минути, Реджеп Иведик написа:

Ми аз нали я написах отдолу без вектор.

Ползвай оператор >>, той и без това чете до уайт спейс по рождение. Провери дали първия символ на прочетеното е цифра и ако е добави числото към сумата. Ако не е, дискард и донт кеъ

Решенията ти не отговарят на условието, в което си е направо описан алгоритъмът, че и функциите който трябва да се ползват.

 

преди 19 часа, frozener написа:

 Също така се притеснявам дали стринга в който съхранявам текста няма да получи овърфлоу при по-дълъг текст

Една от основните идеи на този клас е да те отърве от подобни притеснения.

Ни съм съгласен, че на С все едно ти режат двете ръце и единия крак - и там си има благинки

http://pastebin.com/t71VMFcN

Редактирано от ined (преглед на промените)

#include <iostream>
#include <fstream>
using namespace std;

void read_till_whitespace(ifstream& ifs)
{
	char c;
	while ( (ifs.get(c)) && (!isspace(c)));
}

void discard_white_space(ifstream& ifs)
{
	ifs >> ws;
}


int main()
{
	long long sum = 0;
	long long number;
	char c;
	ifstream ifs("worldpop.txt");
	while (!ifs.eof())
	{
		read_till_whitespace(ifs);
		discard_white_space(ifs);
		ifs.get(c);
		if (!isdigit(c)) continue;
		ifs.unget();
		ifs >> number;
		sum += number;
	}
	ifs.close();
	cout << sum;
	return 0;
}

А сега кажете нещо де

Редактирано от Реджеп Иведик (преглед на промените)

Безсмислено е да се чете по редове, защото символа(ите) за край на ред е (са) също уайт спейси, които така или иначе дискардваме правилно с горепосочената логика.

  • Автор

Честно казано в момента нямам време да се занмимавам със задачата, но тези дни ще ви постна решението ми.

  • Автор

Пробвах се да оправя функцията ми, обаче никаква промяна на прави във файла ми.


 

void readFileContent(const string& filename, ifstream &f, string &text)
{
    f.open(filename.c_str(), fstream::in);
    
    if(f.fail()){
        
        cout << "Error! Cannot open file. Please check file name." << endl;
    }else
    {
        

        string newtext;
        int i= 0;
        while(getline(f, text)){

            newtext += text;

            newtext.push_back('\n');
            
            
        }

        while(!f.eof()){
            if(isspace(newtext[i]) && isdigit(newtext[i])){
                
                while(newtext[i] != ' '){
                
                    i++;
                
                }
            
            }else{
            
            
                newtext[i] = ' ';
            
            }
        
        i++;
    }
    
      f.close();  
    
    }
}

 

Редактирано от frozener (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.