Canh số thẳng hàng khi xuất ma trận

Khi tạo mảng 2 chiều bên trên. Khi nhập chữ số ví dụ 1 2 … hoặc 34 hoặc 1234 thì khi xuất ra số hàng và cột bị lệch. Mình muốn tìm độ dài cực đại của mỗi số nhập vào để khi xuất ra thì hàng và cột đều nhau. Cụ thể:

new int max_size;
max_size= 0;
for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 5; j++)
	{
		cin >> pToArrPtr[i][j];
		if (pToArrPtr[i][j].length()>=max_size)
		{
			max_size = pToArrPtr[i][j].size();
		}
	}
}

Bạn nào biết giúp mình với. Mình cảm ơn.

Nên dùng setw rồi set 3, 6 hoặc 9.
Để tính con số đó thì bạn lấy max rồi tìm số chữ số.

1 Like

Mình cảm ơn, mình đọc thì thấy setw tạo ra khoảng trống cách dòng thôi.
Nếu dùng fix cứng thì không hoàn hảo lắm.
Mình muốn tìm cách linh hoạt cho mọi trường hợp.
Không biết có hàm nào đo được độ rộng của số nhập vào không?
Mình tìm mà chưa ra cách giải quyết.

Cụ thể, khai báo thêm <iomanip> thì mới dùng được setw

for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 5; j++)
	{
		cout << pToArrPtr[i][j] << setw(9);
	}
	cout << endl;
}

Tuy nhiên nếu độ dài của số nhập lớn hơn thì sẽ bị tràn.
Nếu tìm được độ dài cực đại của số nhập vào thì tất cả mọi trường hợp đều đúng.
Mình cũng đang tìm mà chưa ra. Nhờ Bạn nào tìm thử xem. Mình cũng mới học C++.
Mình xin cảm ơn.

1 Like

Không cần :smiley: đây là C++, cứ viết thôi :smiley:

Cái này hoàn toàn sai. Mà ý mình ko phải là set cứng mà là tính trước max rồi set đồng bộ.

1 Like

Vấn đề là tìm cách tính thôi? Cụ thể làm sao tính được độ rộng của số nhập và lấy Max?
Sau khi có Max thì mình dùng setw (Max) luôn.
Mình muốn có kết quả cụ thể dùng ra sao?
Hiện nay, mình tìm được 2 cách.

  • 1 cách thủ công là so sánh. Ví dụ số nguyên cơ số 10.
unsigned int v; // non-zero 32-bit integer value to compute the log base 10 of 
int r; // result goes here 
r = (v >= 1000000000) ? 9 : (v >= 100000000) ? 8 : (v >= 10000000) ? 7 : (v >= 1000000) ? 6 : (v >= 100000) ? 5 : (v >= 10000) ? 4 : (v >= 1000) ? 3 : (v >= 100) ? 2 : (v >= 10) ? 1 : 0;

Tài liệu: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10Obvious

  • 1 cách thì lập vòng lặp chia 10. Tuy nhiên cách này mình chạy thấy vẫn bị sai chưa đúng. Mình đang cố tìm chỗ sai.
#include<iostream>
using namespace std;
int lengthfunction(int number); //prototype
int main()
{   
       int number;
       cout<<"Enter the number: ";
       cin>>number;
       cout<<"The length of that number is: "<<lengthfunction<<"\n";
       return 0;
}
int lengthfunction(int number)
{    
      int counter=0;
      while(number)
     {        
            number=number/10;
            counter++;
       }
      return (counter);
}

Bạn nào có ý tưởng gì chỉ mình với. Có code cụ thể minh họa nhé.

Mình thử ghép vào rồi mà vẫn chưa được như ý mong muốn.
Mình đang tiếp tục tìm cái sai. Bạn nào giúp mình với. Mình cảm ơn nhé.

#include <cstring>
#include <iomanip>
#include <iostream>
#include <typeinfo>
using namespace std;

void lengthfunction(int& number, int v); // prototype

int main()
{
    // Define the 2Darray, the memory saves in stack
    //    //Define and determine the 2Darray
    //	int *pToArrPtr[3];
    //
    //	for(int i = 0; i < 3; i++)
    //	{
    //	pToArrPtr[i] = new int[5];
    //	}
    //	//Type each 2Darray element
    //	for(int i = 0; i < 3; i++)
    //	{
    //	for(int j = 0; j < 5; j++)
    //	{
    //		cin >> pToArrPtr[i][j];
    //	}
    //	}
    //	cout << "--------------------------------" << endl;
    //    //Print the 2Daarray
    //	for(int i = 0; i < 3; i++)
    //	{
    //	for(int j = 0; j < 5; j++)
    //	{
    //		cout << pToArrPtr[i][j] << " ";
    //	}
    //	cout << endl;
    //	}

    // Using pointer to pointer to move the memory in Heap
    int** pToArrPtr;

    // Allocate the memory for three pointer type int*
    pToArrPtr = new int*[3];

    // Each pointer will manage five elements type int
    for (int i = 0; i < 3; i++)
    {
        pToArrPtr[i] = new int[5];
    }

    // int *max_size = new int;
    //*max_size= 0;
    int number;
    int max_size = 0;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cin >> pToArrPtr[i][j];

            lengthfunction(number, pToArrPtr[i][j]);
            if (number >= max_size)
            {
                max_size = number;
            }
        }
    }

    cout << "--------------------------------" << endl;

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cout << pToArrPtr[i][j] << setw(max_size);
        }
        cout << endl;
    }
    cout << max_size << endl;
    // Delete the allocated memory of each pointer
    for (int i = 0; i < 2; i++)
    {
        delete[] pToArrPtr[i];
    }
    // Delete the allocated pointer to pointer memory
    delete[] pToArrPtr;
    return 0;
}

void lengthfunction(int& number, int v)
{
    // unsigned int v; // non-zero 32-bit integer value to compute the log base
    // 10 of int r; // result goes here
    number = (v >= 1000000000)
                 ? 9
                 : (v >= 100000000)
                       ? 8
                       : (v >= 10000000)
                             ? 7
                             : (v >= 1000000)
                                   ? 6
                                   : (v >= 100000)
                                         ? 5
                                         : (v >= 10000)
                                               ? 4
                                               : (v >= 1000)
                                                     ? 3
                                                     : (v >= 100)
                                                           ? 2
                                                           : (v >= 10) ? 1 : 0;
}

setw(w) trước rồi mới in số sau: cout << setw(max_size) << pToArrPtr[i][j]; mới đúng

hàm lengthfunction thì 100 phải là length 3 chứ, (v >= 100) ? 2 v = 100 trả về 2 là sai rồi :V

hàm lengthfunction ở post trước đúng rồi, chỉ có n == 0 phải trả về 1 thay vì trả về 0 là được

1 Like

Cảm ơn Bạn nhé. Mình hiểu sai setw.
setw đặt trước.

cout << setw(max_size)<<pToArrPtr[i][j];

còn function thì phải tăng thêm 1 mới đúng.

number = (v >= 1000000000) ? 10 : (v >= 100000000) ? 9 : (v >= 10000000)
 ? 8 : (v >= 1000000) ? 7 : (v >= 100000) ? 6 : (v >= 10000) 
 ? 5 : (v >= 1000) ? 4 : (v >= 100) ? 3 : (v >= 10) ? 2 : 1;
1 Like

chỗ cout ra phải thêm dấu cách ngăn cách 2 số ra nữa

code mình chấp vá lại: https://wandbox.org/permlink/rvqhyBe7Qri93LHD

#include <cstring>
#include <iomanip>
#include <iostream>
#include <typeinfo>
using namespace std;

int lengthfunction(int number); // prototype

int main()
{
    // Define the 2Darray, the memory saves in stack
    //    //Define and determine the 2Darray
    //	int *pToArrPtr[3];
    //
    //	for(int i = 0; i < 3; i++)
    //	{
    //	pToArrPtr[i] = new int[5];
    //	}
    //	//Type each 2Darray element
    //	for(int i = 0; i < 3; i++)
    //	{
    //	for(int j = 0; j < 5; j++)
    //	{
    //		cin >> pToArrPtr[i][j];
    //	}
    //	}
    //	cout << "--------------------------------" << endl;
    //    //Print the 2Daarray
    //	for(int i = 0; i < 3; i++)
    //	{
    //	for(int j = 0; j < 5; j++)
    //	{
    //		cout << pToArrPtr[i][j] << " ";
    //	}
    //	cout << endl;
    //	}

    // Using pointer to pointer to move the memory in Heap
    int** pToArrPtr;

    // Allocate the memory for three pointer type int*
    pToArrPtr = new int*[3];

    // Each pointer will manage five elements type int
    for (int i = 0; i < 3; i++)
    {
        pToArrPtr[i] = new int[5];
    }

    // int *max_size = new int;
    //*max_size= 0;
    int number;
    int max_size = 0;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cin >> pToArrPtr[i][j];

            number = lengthfunction(pToArrPtr[i][j]);
            if (number >= max_size)
            {
                max_size = number;
            }
        }
    }

    cout << "--------------------------------" << endl;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cout << setw(max_size) << pToArrPtr[i][j] << ' ';
        }
        cout << endl;
    }
    cout << max_size << endl;
    // Delete the allocated memory of each pointer
    for (int i = 0; i < 3; i++)
    {
        delete[] pToArrPtr[i];
    }
    // Delete the allocated pointer to pointer memory
    delete[] pToArrPtr;
}

int lengthfunction(int number)
{
    int counter = 0;
    while (number)
    {
        number = number / 10;
        counter++;
    }
    return (counter);
}

input

1561 21 5694 10 1
5 0 2680 0 9999
99 100 153 10000 2

in ra

--------------------------------
 1561    21  5694    10     1 
    5     0  2680     0  9999 
   99   100   153 10000     2 
5
1 Like

Cách chia 10 lại không hay vì có phép chia :smiley: trừ phi bạn muốn lấy chữ số (mod). Sửa lại thành do…while là được.

uint32_t countDecimalDigit(uint32_t number) {
   return number > 999999999? 10 : \
          number > 99999999 ?  9 : \
          number > 9999999  ?  8 : \
          number > 999999   ?  7 : \
          number > 99999    ?  6 : \
          number > 9999     ?  5 : \
          number > 999      ?  4 : \
          number > 99       ?  3 : \
          number > 9        ?  2 : 1;
}
1 Like

Để đảm bảo cách ra các số khi có nhiều số có độ dài bằng nhau.

cout << setw(max_size)<<pToArrPtr[i][j]<<" ";

Còn function con vẫn giữ nguyên. Cụ thể:

void lengthfunction (int &number, int v)
   {
   	//unsigned int v; // non-zero 32-bit integer value to compute the log base 10 of 
    //int r; // result goes here 
number = (v >= 1000000000) ? 9 : (v >= 100000000) ? 8 : (v >= 10000000)
 ? 7 : (v >= 1000000) ? 6 : (v >= 100000) ? 5 : (v >= 10000) 
 ? 4 : (v >= 1000) ? 3 : (v >= 100) ? 2 : (v >= 10) ? 1 : 0;
   }
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?