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

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

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

ý bạn là code đó ko đúng chuẩn á

Như ý của bạn thắc mắc đấy.
Giả sử dùng while(true) mà bạn chỉ dùng if mà không dùng else điều gì sẽ xảy ra?

Lặp vô tận.

Thay vì đặt điều kiện trong if - else thì đưa nó lên thành điều kiện của vòng lặp luôn.
Vẫn chưa ổn, vì while là 1 vòng lặp. Gọi đến hàm Xoa(), chắc chắn trong hàm này vẫn có ít nhất 1 vòng lặp nữa. Sơ sơ là cần đến 2 vòng lặp.
Có thể dùng 1 mảng tạm để thực hiện loại bỏ mọi khoảng trắng dư thừa chỉ với 1 lần lặp.

4 Likes
/*CALCULATOR PROGRAM BY PIKAPIKA*/
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
#define pi 3.14159
// string str[] = { "+", "-", "*", "/", "sin", "cos", "mu", "canbac2"};
float addition(float a , float b) { 
    return a + b; 
}
float subtraction(float a, float b) {
    return a - b; 
}
float multiplication(float a, float b) { 
    return a * b; 
}
float division(float a, float b) { 
    return a / b; 
}
double Sin(double a) { 
    return sin(a); 
}
double Cos(double b) { 
    return cos(b); 
}
float exponential(float a, float b) { 
    return pow(a, b); 
}
float squareroot(float a) { 
    return sqrt(a); 
}
/*Hàm nhập giá trị cho biến tham trị*/
float getUserInput(){ 
    cout << "Enter a value: ";
    float value;
    cin >> value;

    return value;
}
void build(){
    cout << "This program is under construction." << endl;
    }
void calculator() {
    int option;
    float a, b;
    do {
        cout << "\t MENU \t" << endl;
        cout << "1. Addtiontion." << endl;
        cout << "2. Subtraction." << endl;
        cout << "3. Multiplication." << endl;
        cout << "4. Division." << endl;
        cout << "5. Sin." << endl;
        cout << "6. Cos." << endl;
        cout << "7. Exponential." << endl;
        cout << "8. Squarefoot." << endl;
        cout << "Input your selection: ";
        cin >> option;
    } while (option < 1 && option > 8);
    switch (option) {
    case 1:
        a = getUserInput();
        b = getUserInput();
        cout << a << " + " << b << " = " << addition(a, b) << endl;
        break;
    case 2:
        a = getUserInput();
        b = getUserInput();
        cout << a << " - " << b << " = " << subtraction(a, b) << endl;
        break;
    case 3:
        a = getUserInput();
        b = getUserInput();
        cout << a << " * " << b << " = " << multiplication(a, b) << endl;
        break;
    case 4:
        a = getUserInput();
        b = getUserInput();
        cout << a << " / " << b << " = " << division(a, b) << endl;
        break;
    case 5:
        a = getUserInput();
        cout << "Sin(" << a << ") = " << Sin(a*pi/180) << endl;
        break;
    case 6:
        a = getUserInput();
        cout << "Cos(" << a << ") = " << Cos(a*pi/180) << endl;
        break;
    case 7:
        a = getUserInput();
        b = getUserInput();
        cout << "a mu b = "<< pow(a, b) << endl;
        break;
    case 8:
        a = getUserInput();
        cout << "Can bac 2 cua " << a << " = " << sqrt(a) << endl;
        break;
    default:
        cout << "Lua chon khong hop le " << endl;
        return;
    }
}
int main() {
    int choice;
    do {
        cout << "\t MENU \t" << endl;
        cout << "1. Calculator Program." << endl;
        cout << "2. Other program." << endl;
        cout << "3. Exit" << endl;
        cout << "Input your selection: ";
        cin >> choice;
    } while (choice < 1 || choice > 3);
    switch (choice) {
        case 1:
            calculator();
            break;
        case 2:
            build();
            break;
        case 3:
            cout << "Existing..." << endl;
            exit;
    }
    system("pause");
    return 0;
}

Mình làm 2 menu cho dễ nhìn các cậu tham khảo

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