Thiết kế chương trình dựa trên khái niệm Function C/C++

dấu = là phép gán. khi bạn viết s[i] = ' ' thì có nghĩa là bạn gán cho s[i] là khoảng trắng.
còn dấu == là phép so sánh. khi bạn viết s[i] == ' ' thì có nghĩa là bạn đang so sánh s[i] với khoảng trắng :slight_smile:

cho mình hỏi ý tưởng ban đầu của bạn như thế nào để có thể viết ra được chương trình này. Mình đọc thì cũng hiểu nhưng cũng có những chỗ khá rối như là bạn trên dựa trên ý tưởng như thế nào để đặt thêm biến 'isInText'

và ý tưởng của bạn như thế nào để biết và có thể chia ra những trường hợp như vậy

Là để kiểm tra xem text.at(loop) nó có ở “trong” từ nào đó không ý mà.

  • Nếu không mà đó là ký tự thì viết hoa lên (chữ cái đầu) và cho isInText = true; để biết là giờ nó đang ở “trong” từ.
  • Nếu có, chứ viết hoa thì biến thường lại.
  • Nếu không và bắt đầu ra ngoài 1 “từ” nào đó thì cho isInText = false;.
  • Nếu có nữa thì xoá dấu cách đó luôn. :stuck_out_tongue:
  • Xoá hết dấu cách thừa trước và sau đoạn văn.
  • Đổi văn bản theo tiêu chuẩn C-Style String.

Hết :smile:

1 Like

Thật ra mình ghi là C-style string có nghĩa là sử dụng các hàm trong thư viện string.h để thao tác trên mảng kí tự (char []), và để phân biệt với Cpp-style string là (std::string). Chứ C-style string không phải là cái chuẩn gì cả.

Mình ghi đề là chuẩn hóa C-style string về dạng chuẩn nào đó là muốn các bạn tự thiết kế hàm và để thao tác với mảng kí tự (char []) sẽ tốt hơn là dùng sẵn mấy operator hay methods trong class của std::string cung cấp. Nhưng mà cũng tùy các bạn, vì làm đúng yêu cầu cũng coi như xong việc.

3 Likes
float value1; float value2; chứ anh ơi ?
Cái này chưa xét điều kiện value2 khác 0 ạ ?

bác bỏ ra vài phút xem code của e nhé. Nó cũng dựa trên code của bác, phần removespace e copy lại còn phần viết hoa e viết theo cách của e nhưng hàm removespace hình như bị chương trình bỏ qua còn hàm viết hoa vẫn hoạt động bình thường, bác xem e sai ở đâu rồi chỉ giúp e nhé, tks :slight_smile:

#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>

using namespace std;

void removespace(string &text)
{
	while (text.front() == ' ')
	{
		text.erase(text.begin());
	}

	while (text.back() == ' ')
	{
		text.pop_back();
	}
}


void upper_lower(string &hoten, int sokitu)
{
	hoten[0] = toupper(hoten[0]);
	for (int i = 1; i < sokitu; i++)
	{
		if (hoten[i] == ' ')
		{
			hoten[i+1] = toupper(hoten[i+1]);
		}
		else if (isgraph(hoten[i]) && hoten[i - 1] != ' ')
		{
			hoten[i] = tolower(hoten[i]);
		}
	}
}

int main()
{
	string hoten;
	cout << "Nhap ho va ten:";
	getline(cin, hoten);
	int sokitu = hoten.size();
	removespace(hoten);
	upper_lower(hoten, sokitu);
	cout << "ho va ten sau khi sua:" << hoten;
	cout << endl;
	system("pause");
	return 0;
}

tại sao trong hàm removeSpcae lại khai báo là &text vậy ạ?

2 posts were merged into an existing topic: Topic chứa các reply được cho là off-topic - version 2

2 Likes

2 posts were split to a new topic: Thắc mắc lỗi trong C++

3 Likes

Mình sử dụng hàm xóa khoảng trắng đầu tiên và cuối cùng của bạn Tankhoa.

void removeSpace(std::string &);
void changeStyle(std::string &);

Mình cũng sử dụng vòng for để xóa được.
Còn lại Hàm xóa khoảng trắng ở giữa và in hoa thì mình thấy của bạn hay. Tuy nhiên thêm tham số bool. Mình cũng thử 1 cách khác hơn 1 tý thôi. Gửi mọi người xem. Mình mới bắt đầu học C++.

#include<iostream>
#include<string>

using namespace std;

//The first way you can use while
//Note you use &name for a string
void Deletespace (string &name)
   {
    while (name.front()==32)
        {
        	name.erase(name.begin());
		}
	while (name.back()==32)
	    {
	    	name.pop_back();
		}
   }
   
//The second way you can use for 
//Note you ca use & for a string
//However the string length is not change	
//void Deletespace (string &name, int position)
//    {
//    	int n = name.length();
//    	for (int i = 0; i<n; i++)
//    	    {
//    	    	name[i] = name[i+1];
//			}
//			n--;
//	}	
   
//Delete the space in the string
void Deleteinline (string &name)
    {
     int n = name.length();
	 for (int i=0; i<n; i++)
	    {
	       //First make upper the first element
	       //and make the lower for the others
		   if (name[0]!=32) 
	    	    {
	    	    	name[0] = toupper(name[0]);
 				}
 			else
			      {
			      	name[i] = tolower(name[i]);
				  }
            //Check and delete the space in line
            //and create upper for the next letter
	       if (name[i]==32&&name[i+1]==32)
	    	//!isgraph(name.at(i))
	    	   	{
				name.erase(name.begin() + i);
				i--;
				} 
		   else if (name[i]==32&&name[i+1]!=32)
			      {
			      	name[i+1] = toupper(name[i+1]);
				  }
		
		}	
	}
	 
int main()
{
	//type the string in the screen
	string name;
	cout<<"Type the string: ";
	getline(cin,name);
	cout<<name<<endl;
	cout<<name.length()<<endl;
	Deletespace (name);
	cout<<name<<endl;
	cout<<name.length()<<endl;
	Deleteinline (name);
	cout<<name<<endl;
	cout<<name.length()<<endl;
	return 0;
}

arr_char_end

  • Em giả sử mảng ký tự gồm:inputString[5] = {khoảng trắng thứ 1, khoảng trắng thứ 2, a, b, c}
  • Anh chị cho em hỏi là trong hình trên khi em thưc hiện hàm xóa của anh Tien_​​Ability_​​Ete thì em thấy là các ký tự chuyển về phía cuối mảng thì
    inputString[indexMoveBack] = inputString[indexMoveBack + 1];
    tương đương tới lúc: "inputString[indexMoveBack] = ‘\0’
    thì mình không cần phải “numCharOfString–;” nữa vì lúc này khi gọi hàm “strlen(inputString);” nó sẽ trả về giá trị 4. Do hàm “srtlen()” không nhận giá trị ‘\0’ ạ.
  • Vậy thì mình xóa mảng ký tự như vậy có được coi là đúng không ạ.

Mỗi lần gọi strlen là phải chạy hết chuỗi đó bạn.

5 Likes

đúng nhưng ko tối ưu

5 Likes

Em cám ơn rogp​10tntxtnt a. :yum::yum:

#include <iostream>
#include <string>
#include <Windows.h>
#include <cstdlib>

using namespace std;

#define MAX_SIZE 100;

//chuong trinh chuan hoa kieu nhap du lieu

//xoa ki tu trang o dau
void xoaKiTuDau(string Ham)
{

for (int i = 0; i < Ham.size(); i++)
{
	Ham[i] = Ham[i + 1];
}
}

//xoa ki tu trang o cuoi 
void xoaKiTuCuoi(string Ham)
{
Ham.pop_back(); 
} 

//Moi tu trong string cach nhau boi khoang trang
void Xoa(string Ham) 
{
 for (int i = 0; i < Ham.size(); i++)
{
 	if (Ham[i] == ' ' && Ham[i + 1] == ' ')
	{
		Ham[i] = Ham[i + 1];
	}
}
}

   //In hoa chu dau va in thuong con lai
   void inHoaVaThuong(string Ham)
  {
for (int i = 0; i < Ham.size(); i++)
{
	tolower(Ham[i]);
}

for (int i = 0; i < Ham.size(); i++)
{
	if (Ham[i - 1] == ' ')
	{
		toupper(Ham[i]);
	}
}
 }

//nhap Ham
string nhapHam()
{
cout << "Nhap ham ma ban muon chuan hoa ";
string Ham;
getline(cin, Ham);

return Ham;
}

//chuan hoa Ham
void chuanHoa()
{

string Ham = nhapHam();

if (Ham[1] == ' ')
{
	xoaKiTuDau(Ham);
}
else if (Ham.back() == ' ')
{
	xoaKiTuCuoi(Ham);
}

Xoa(Ham);
inHoaVaThuong(Ham);

cout << "Ham sau khi chuan hoa la " << Ham << endl;
}

int main()
{
cout << "***CHAO MUNG BAN DEN VOI CHUONG TRINH CHUAN HOA***" << endl;
cout << endl << endl;

cout << "NHAP LUA CHON CUA BAN" << endl;
cout << "(1) Chuan hoa Ham" << endl;
cout << "(2) Thoat chuong trinh" << endl;

int nhap;

do {

	cout << "Lua chon cua ban: "; cin >> nhap;
	switch (nhap)
	{
	case 1:
		chuanHoa();
		break;
	case 2:
		cout << "Cam on ban da su dung chuong trinh" << endl;
		break;
	default:
		break;
	}
} while (nhap =! 2);

system("pause");
return 0;
}


mấy bác cho em hỏi là lỗi này là lỗi gì, vì sao có vậy ạ?? em cám ơn

String subscript out of range.
Bạn xét xem có đoạn nào bạn truy xuất chuỗi ngoài phạm vi chuỗi không. Như truy xuất đến Ham[-1] hoặc chuỗi chỉ dài 5 nhưng lại gọi Ham[5].

3 Likes

Mình cám ơn nhiều <3

while(true) để làm gì ạ . Với lại chỗ if else í sao lại ko dùng mình if thôi , else trong trường hợp này có nghĩa là gì vậy ạ , ai giải thích cho mình hiểu với

Không nên đọc post đó.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?