پیدا کردن نام ستون اکسل برای یک شماره ستون — راهنمای کاربردی

ستون‌های نرم‌افزار اداری اکسل (Excel) دارای الگوی نام‌گذاری به صورت AAB ،AAA ، ZZ ،… ،BB ،BA ،AZ ،… ،AC، AB ،AA ،Z ،… ،C ،B ،A و به همین ترتیب است. به بیان دیگر، ستون ۱ با عنوان «A» و ستون ۲ با عنوان «B» و بهمین ترتیب نام‌گذاری شده است و مثلا، ستون شماره ۲۷ با عنوان «AA» نام گذاری شده است. اکنون مسئه این است که برای یک شماره ستون داده شده، عنوان ستون متناظر با آن، بازگردانده شود. در ادامه، مثال‌هایی در این راستا ارائه شده است.

Input          Output
 ۲۶             Z
 ۵۱             AY
 ۵۲             AZ
 ۸۰             CB
 ۶۷۶            YZ
 ۷۰۲            ZZ
 ۷۰۵            AAC

روش اول برای پیدا کردن نام ستون اکسل برای یک شماره ستون

فرض می‌شود که عدد n و برای مثال، عدد ۲۸، موجود است. اکنون، نیاز است تا نام متناظر با ستون شماره ۲۸ چاپ شود. در این راستا، یک روش در ادامه بیان شده است.

باید باقیمانده عدد n که در اینجا ۲۸ است، در تقسیم بر عدد ۲۶، محاسبه شود.

در صورتی که باقیمانده عدد n بر ۲۶ برابر با ۰ باشد (برای اعدادی مانند ۲۶، ۵۲ و به همین ترتیب)، رشته Z در خروجی چاپ می‌شود و n جدید برابر با n/26 -1 خواهد بود. زیرا در اینجا فرض شده که ستون شماره ۲۶ همان ستون Z است، در حالی که با احتساب A، خانه شماره ۲۵ می‌شود.

در صورتی که خروجی عددی غیر صفر باشد، (اعدادی مانند ۱، ۲، ۳ و به همین ترتیب)، نیاز به درج کاراکتری مطابق با رشته و انجام عمل n = n/26 است. در نهایت، رشته معکوس و چاپ می‌شود. برای درک بهتر مطلب، مثال زیر قابل توجه است.

n = ۷۰۰

باقیمانده تقسیم n بر ۲۶ (یعنی n%26)، برابر با ۲۴ است. بنابراین، کاراکتر x در رشته خروجی قرار م‌گیرد و n برابر با n/26 قرار می‌گیرد که در حاصل آن، ۲۶ است.باقیمانده n جدید بر ۲۶ (یعنی ۲۶%۲۶) برابر با ۰ است. بنابراین، Z در رشته خروجی قرار می‌گیرد و n برابر با n/26 -1 است که حاصل آن، ۰ می‌شود. در ادامه، پیاده‌سازی روش بیان شده در زبان‌های برنامه‌نویسی ++C، جاوا (Java)، پایتون (Python) و سی‌شارپ (#C) ارائه شده است.

پیاده‌سازی در C++‎

// C++ program to find Excel
// column name from a given
// column number
#include <bits/stdc++.h>
#define MAX 50
using namespace std;
 
// Function to print Excel column name for a given column number
void printString(int n)
{
    char str[MAX]; // To store result (Excel column name)
    int i = 0; // To store current index in str which is result
 
    while (n > 0) {
        // Find remainder
        int rem = n % 26;
 
        // If remainder is 0, then a 'Z' must be there in output
        if (rem == 0) {
            str[i++] = 'Z';
            n = (n / 26) - 1;
        }
        else // If remainder is non-zero
        {
            str[i++] = (rem - 1) + 'A';
            n = n / 26;
        }
    }
    str[i] = '\0';
 
    // Reverse the string and print result
    reverse(str, str + strlen(str));
    cout << str << endl;
 
    return;
}
 
// Driver program to test above function
int main()
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
    return 0;
}

پیاده‌سازی در جاوا

// Java program to find Excel
// column name from a given
// column number
 
public class ExcelColumnTitle {
    // Function to print Excel column
    // name for a given column number
    private static void printString(int columnNumber)
    {
        // To store result (Excel column name)
        StringBuilder columnName = new StringBuilder();
 
        while (columnNumber > 0) {
            // Find remainder
            int rem = columnNumber % 26;
 
            // If remainder is 0, then a
            // 'Z' must be there in output
            if (rem == 0) {
                columnName.append("Z");
                columnNumber = (columnNumber / 26) - 1;
            }
            else // If remainder is non-zero
            {
                columnName.append((char)((rem - 1) + 'A'));
                columnNumber = columnNumber / 26;
            }
        }
 
        // Reverse the string and print result
        System.out.println(columnName.reverse());
    }
 
    // Driver program to test above function
    public static void main(String[] args)
    {
        printString(26);
        printString(51);
        printString(52);
        printString(80);
        printString(676);
        printString(702);
        printString(705);
    }
}
 
// This code is contributed by Harikrishnan Rajan

پیاده‌سازی در پایتون

# Python program to find Excel column name from a 
# given column number
 
MAX = 50
 
# Function to print Excel column name 
# for a given column number
def printString(n):
 
    # To store result (Excel column name)
    string = ["\0"] * MAX
 
    # To store current index in str which is result
    i = 0
 
    while n > 0:
        # Find remainder
        rem = n % 26
 
        # if remainder is 0, then a 
        # 'Z' must be there in output
        if rem == 0:
            string[i] = 'Z'
            i += 1
            n = (n / 26) - 1
        else:
            string[i] = chr((rem - 1) + ord('A'))
            i += 1
            n = n / 26
    string[i] = '\0'
 
    # Reverse the string and print result
    string = string[::-1]
    print "".join(string)
 
# Driver program to test the above Function
printString(26)
printString(51)
printString(52)
printString(80)
printString(676)
printString(702)
printString(705)
 
# This code is contributed by BHAVYA JAIN

پیاده‌سازی در C#‎

// C# program to find Excel
// column name from a given
// column number
using System;
 
class GFG{
     
static String reverse(String input)
{
    char[] reversedString = input.ToCharArray();
    Array.Reverse(reversedString);
    return new String(reversedString);
}
 
// Function to print Excel column
// name for a given column number
private static void printString(int columnNumber)
{
     
    // To store result (Excel column name)
    String columnName = "";
 
    while (columnNumber > 0)
    {
         
        // Find remainder
        int rem = columnNumber % 26;
 
        // If remainder is 0, then a
        // 'Z' must be there in output
        if (rem == 0) 
        {
            columnName += "Z";
            columnNumber = (columnNumber / 26) - 1;
        }
         
        // If remainder is non-zero
        else
        {
            columnName += (char)((rem - 1) + 'A');
            columnNumber = columnNumber / 26;
        }
    }
 
    // Reverse the string
    columnName = reverse(columnName);
     
    // Print result
    Console.WriteLine(columnName.ToString());
}
 
// Driver code
public static void Main(String[] args)
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
}
}
 
// This code is contributed by amal kumar choubey

خروجی قطعه کد بالا، به صورت زیر است. 

Z
AY
AZ
CB
YZ
ZZ
AAC

روش دوم برای پیدا کردن نام ستون اکسل برای یک شماره ستون

مسئله، مشابه با تبدیل یک عدد اعشاری به ارائه دودویی آن است. اما به جای یکس یستم مبنای دو که در آن تنها دو رقم ۰ و ۱ وجود دارد،  در اینجا ۲۶ کاراکتر از A تا Z وجود دارد. بنابراین، به جای مبنای ۲، با مبنای ۲۶ کار می‌شود. باید توجه داشت که در این سیستم عددی، ۰ وجود ندارد و ستون شماره ۱ برابر با A، ستون B برابر با ۲ و به همین ترتیب، Z برابر با ۲۶ است. برای آنکه مسئله به خوبی قابل درک باشد، مسئله در دو گام مورد بررسی قرار می‌گیرد. این دو گام در ادامه بیان شده‌اند.

  • با تبدیل عدد به مبنای ۲۶، عدد ۰ نیز در سیستم وجود خواهد داشت.
  • ارائه عدد را به یک بدون داشتن ۰ در آن سیتسم، تبدیل کنید.

گام اول:

فرض می‌شود که عدد ۶۷۶ وجود دارد. چطور می‌توان آن را در سیستم مبنای ۲۶ نشان داد؟ راهکار مشابهی برای سیستم دودویی وجود دارد ولی در آن، به جای تسیم و باقیمانده بر ۲، تقسیم و باقیمانده بر ۲۶ محاسبه می‌شود.

Base 26 representation of 676 is : 100

گام دوم:

اکنون و چنانکه پیش از این نیز به آن اشاره شد، صفر در این ارائه وجود ندارد. زیرا که صفر بشی از سیستم عددی مورد استفاده نیست. پرسشی که در این وهله مطرح می‌شود این است که چطور می‌توان صفرها را از میان برداشت؟ این کار ساده است، اما پیش از انجام آن و در ادامه، یک ترفند ریاضی جالب که برای این کار قابل استفاده است، بیان شده است.

در تفریق اگر برای مثال هدف محاسبه ۹ – ۵۰۰۰ باشد، چطور باید ۹ را از ۰ کم کرد؟ در این حالت، از رقم کناری، قرض گرفته می‌شود. 

  • در سیستم اعداد اعشاری، برای کار کردن با صفر، یک ده‌تایی از عدد بعدی قرض گرفته می‌شود و یک (۱) از آن عدد (عدد بعدی) کم می‌شود.
  • در سیستم مبنای ۲۶، برای کار کردن با صفر، ۲۶ قرض گرفته می‌شود و ۱ از عدد بعدی کم می‌شود.

بنابراین، باید ۱۰۰۲۶ به سیستم عددی تبدیل شود که ۰ ندارد. خروجی، یک ارائه نمادین به صورت ۲۶(۲۵ ۲۶) است که در واقع، معادل با رشته YZ است. در ادامه، پیاده‌سازی روش بیان شده در بالا، در زبان‌های برنامه‌نویسی ++C، جاوا، پایتون و C#‎ انجام شده است. 

پیاده‌سازی در C++‎

#include <iostream>
using namespace std;
 
void printString(int n)
{
    int arr[10000];
    int i = 0;
 
    // Step 1: Converting to number assuming
    // ۰ in number system
    while (n) {
        arr[i] = n % 26;
        n = n / 26;
        i++;
    }
 
    // Step 2: Getting rid of 0, as 0 is
    // not part of number system
    for (int j = 0; j < i - 1; j++) {
        if (arr[j] <= 0) {
            arr[j] += 26;
            arr[j + 1] = arr[j + 1] - 1;
        }
    }
 
    for (int j = i; j >= 0; j--) {
        if (arr[j] > 0)
            cout << char('A' + arr[j] - 1);
    }
 
    cout << endl;
}
 
// Driver program to test above function
int main()
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
    return 0;
}
 
// This code is contributed by Ankur Goel

پیاده‌سازی در جاوا

import java.util.*;
 
class GFG{
 
static void printString(int n)
{
    int []arr = new int[10000];
    int i = 0;
 
    // Step 1: Converting to number 
    // assuming 0 in number system
    while (n > 0)
    {
        arr[i] = n % 26;
        n = n / 26;
        i++;
    }
 
    // Step 2: Getting rid of 0, as 0 is
    // not part of number system
    for(int j = 0; j < i - 1; j++)
    {
        if (arr[j] <= 0)
        {
            arr[j] += 26;
            arr[j + 1] = arr[j + 1] - 1;
        }
    }
 
    for(int j = i; j >= 0; j--)
    {
        if (arr[j] > 0)
            System.out.print(
                (char)('A' + arr[j] - 1));
    }
    System.out.println();
}
 
// Driver code
public static void main(String[] args)
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
}
}
 
// This code is contributed by amal kumar choubey

پیاده‌سازی در پایتون

def printString(n):
     
    arr = [0] * 10000
    i = 0
 
    # Step 1: Converting to number
    # assuming 0 in number system
    while (n > 0):
        arr[i] = n % 26
        n = int(n // 26)
        i += 1
         
    #Step 2: Getting rid of 0, as 0 is
    # not part of number system
    for j in range(0, i - 1):
        if (arr[j] <= 0):
            arr[j] += 26
            arr[j + 1] = arr[j + 1] - 1
 
    for j in range(i, -1, -1):
        if (arr[j] > 0):
            print(chr(ord('A') +
                  (arr[j] - 1)), end = "");
 
    print();
 
# Driver code
if __name__ == '__main__':
     
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
 
# This code is contributed by Princi Singh

پیاده‌سازی در C#‎

using System;
class GFG{
 
static void printString(int n)
{
  int []arr = new int[10000];
  int i = 0;
 
  // Step 1: Converting to 
  // number assuming 0 in 
  // number system
  while (n > 0)
  {
    arr[i] = n % 26;
    n = n / 26;
    i++;
  }
 
  // Step 2: Getting rid of 0, 
  // as 0 is not part of number 
  // system
  for(int j = 0; j < i - 1; j++)
  {
    if (arr[j] <= 0)
    {
      arr[j] += 26;
      arr[j + 1] = arr[j + 1] - 1;
    }
  }
 
  for(int j = i; j >= 0; j--)
  {
    if (arr[j] > 0)
      Console.Write((char)('A' + 
                     arr[j] - 1));
  }
  Console.WriteLine();
}
 
// Driver code
public static void Main(String[] args)
{
  printString(26);
  printString(51);
  printString(52);
  printString(80);
  printString(676);
  printString(702);
  printString(705);
}
}
 
// This code is contributed by 29AjayKumar

خروجی قطعه کد بالا به صورت زیر است. 

Z
AY
AZ
CB
YZ
ZZ
AAC

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

منبع [+]

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *