/// 
// Program; Project2.cpp
// Date; 
// Purpose: 
// Description: 
// Input: 
// Output: 
// Use: This program is compiled and executed using 
//   Microsoft Visual Studio C++.net 2003 Version 7.1


#include "stdafx.h"
#include <iostream>  // access input/output stream.
#include <string>
#include <cctype>

using namespace std;

int StateNumber(char, char);
void StateText(string);

int main()
{
       int a;                // to hold the output screen
    char firstLetter;   // can you set char's = 0?
    char secondLetter;
    string stateName;

    cout << "       STATE POSTAL CODE CONVERTER\n\n";
    cout << "Enter the two character Postal Code to see\n"
        << "it's corresponding State. (for example AK)\n\n";
    cin >> firstLetter >> secondLetter;
    
    while ( (firstLetter != 'E') && (secondLetter != 'X') )

    {
        switch (StateNumber(firstLetter, secondLetter))
        {
            case 6575:
                StateText("Alaska");
                break;
            case 6576:
                StateText("Alabama");
                break;
            case 6582:
                StateText("Arkansas");
                break;
            case 6590:
                StateText("Arizona");
                break;
            case 6765:
                StateText("California");
                break;
            case 6779:
                StateText("Colorado");
                break;
            case 6784:
                StateText("Connecticut");
                break;
            case 6869:
                StateText("Delaware");
                break;
            case 7076:
                StateText("Florida");
                break;
            case 7165:
                StateText("Georgia");
                break;
            case 7273:
                StateText("Hawaii");
                break;
            case 7365:
                StateText("Iowa");
                break;
            case 7368:
                StateText("Idaho");
                break;
            case 7376:
                StateText("Illinois");
                break;
            case 7378:
                StateText("Indiana");
                break;
            case 7583:
                StateText("Kansas");
                break;
            case 7589:
                StateText("Kentucky");
                break;
            case 7665:
                StateText("Louisiana");
                break;
            case 7765:
                StateText("Massachusetts");
                break;
            case 7768:
                StateText("Maryland");
                break;
            case 7769:
                StateText("Maine");
                break;
            case 7773:
                StateText("Michigan");
                break;
            case 7778:
                StateText("Minnesota");
                break;
            case 7779:
                StateText("Missouri");
                break;
            case 7783:
                StateText("Mississippi");
                break;
            case 7784:
                StateText("Montana");
                break;
            case 7867:
                StateText("North Carolina");
                break;
            case 7868:
                StateText("North Dakota");
                break;
            case 7869:
                StateText("Nebraska");
                break;
            case 7872:
                StateText("New Hampshire");
                break;
            case 7874:
                StateText("New Jersey");
                break;
            case 7877:
                StateText("New Mexico");
                break;
            case 7886:
                StateText("Nevada");
                break;
            case 7889:
                StateText("New York");
                break;
            case 7972:
                StateText("Ohio");
                break;
            case 7975:
                StateText("Oklahoma");
                break;
            case 7982:
                StateText("Oregon");
                break;
            case 8065:
                StateText("Pennsylvania");
                break;
            case 8273:
                StateText("Rhode Island");
                break;
            case 8367:
                StateText("South Carolina");
                break;
            case 8368:
                StateText("South Dakota");
                break;
            case 8478:
                StateText("Tennessee");
                break;
            case 8488:
                StateText("Texas");
                break;
            case 8584:
                StateText("Utah");
                break;
            case 8665:
                StateText("Virginia");
                break;
            case 8684:
                StateText("Vermont");
                break;
            case 8765:
                StateText("Washington");
                break;
            case 8773:
                StateText("Wisconsin");
                break;
            case 8786:
                StateText("West Virginia");
                break;
            case 8789:
                StateText("Wyoming");
                break;
            default:
                cout << '\n' << firstLetter << secondLetter << " is not a valid Postal Code!\n\n";
        }


        cout << "Enter another State Postal Code or \"EX\" to exit\n\n";
        cin >> firstLetter >> secondLetter;
    }

    cout << "\nGOOD BYE!";
    for(a = 1; a < 3000000000; a++);  // acts as a pause before the output screen goes away
    return 0;
}

int StateNumber(char chr1, char chr2)
{
    int stateValue = 0;
    int A = 0;
    int B = 0;

    A = (int)chr1;
    B = (int)chr2;

    stateValue = (A * 100 + B);
    return stateValue;
}

void StateText(string stateName)
{
    cout << "The State you selected is " << stateName << "!" << endl;
        

}

Dani AI

Generated

The long switch of numeric case labels works, but it is hard to read, maintain, and is error‑prone for a homework constraint that requires two char values (no std::string or possibly no std::map). A compact, fast alternative that stays within the two‑char rule is a 26×26 direct lookup table keyed by the two letters. It is O(1) lookup, uses only C‑style strings (char pointers), and requires only about 676 pointers of storage (trivial memory).

A simple pattern to implement:

#include <cctype>
#include <cstring>

static const char* table[26*26];

inline int idx(char a, char b) {
    if (!isalpha((unsigned char)a) || !isalpha((unsigned char)b)) return -1;
    a = toupper((unsigned char)a);
    b = toupper((unsigned char)b);
    return (a - 'A') * 26 + (b - 'A');
}

void init_table() {
    memset(table, 0, sizeof(table));
    table[idx('A','K')] = "Alaska";
    table[idx('A','L')] = "Alabama";
    /* fill remaining entries as needed */
}

const char* lookup_state(char a, char b) {
    int i = idx(a,b);
    return (i < 0) ? NULL : table[i];
}

Practical tips: always validate idx() before indexing to avoid undefined behavior, convert input letters with toupper to make the lookup case‑insensitive, and initialize the table once at program start. To populate the table more easily, keep a short initializer list (abbr + name) or read a small data file rather than hardcoding 50 assignments. Replace the busy wait at the end with a proper pause like cin.ignore()/cin.get().

This approach addresses the maintainability concerns raised by , avoids std::string as noted is disallowed for your assignment, and sidesteps the large switch that found awkward. If later allowed, std::map or std::unordered_map would be the simplest solution.

Recommended Answers

All 9 Replies

you could use a map c++ container.

how would that work

google for "c++ map". Here is one example

thanks , but I already did that


Thanks again I'll give it a try

Okay, I am going to ask you why rely on characters if you have strings at your disposal. I havent as such seen the whole code but I think what you are trying to do is to accept the input from the user in string form as abbr and display the corresponding state.

The thing I dont understand is why work at the character level. Why not make use of the string class which greatly simplifies a lot of things.

Also as Mr. Dragon suggested, try using maps which will greatly simplify your task

int main()
{
    int a = 0; // initialize variables always

// dont use two characters, use string as you have already used instead
     char firstLetter = '\0' ;   // setting char to null char
    char secondLetter;

    string stateName;

    cout << "       STATE POSTAL CODE CONVERTER\n\n";
    cout << "Enter the two character Postal Code to see\n"
        << "it's corresponding State. (for example AK)\n\n";
    cin >> firstLetter >> secondLetter;
    
// replace this cryptic while loop and switch 
// use string compare operator == instead
     while ( (firstLetter != 'E') && (secondLetter != 'X') )
    {       
       <--snipped-->
        cout << "Enter another State Postal Code or \"EX\" to exit\n\n";

// you have to press enter two times and the program is case
// sensitive and works for only uppercase characters.

        cin >> firstLetter >> secondLetter;
    }

// dont use this loop, use [I]cin.get( )[/I] instead

    for(a = 1; a < 3000000000; a++);  // acts as a pause before the output screen goes away

    return 0;
}


// dont preform cryptic calculations at character level
// use std::string instead.

int StateNumber(char chr1, char chr2)
{
    int stateValue = 0;
    int A = 0;
    int B = 0;

    A = (int)chr1;
    B = (int)chr2;

    stateValue = (A * 100 + B);
    return stateValue;
}

school homework and we can't use strings it has to be two char

but thanks

BTW, just wanted to tell you that I ran your code and it worked fine for me. Any specific you are encountering ?

Member Avatar for Member #46692

If he/she can't use std::strings it is unlikely they will be allowed to use std::map.

Personally, if it works I don't see how that will affect the grading of your assignment, but I wouldn't know fo'sho.

for(a = 1; a < 3000000000; a++);  // acts as a pause before the output screen goes away

That's funny.

if you can't use a std::map or std::string, then you can use two string arrays and replace that switch statement with a simple loop, something like this:

char *state_abbr[]= {"AL","OK",... , NULL}
char *state_names = {"ALASKA","OKLAHOMA", ..., NULL}
...
...
char *abbr = "OK";
for(int i = 0; state_abbr[i] != NULL; i++)
{
   if( strcmp(state_abbr[i],abbr) == 0)
   {
         // found it!
         cout << state_names[i] << endl;

   }
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.