C++ 陣列問題 急迫 20點!!

2009-11-20 11:39 pm
user可輸入一串數值 如 12345
需要能判斷出這串數值裡面的字元是否有重複
範例
Input a number: 12345
No repeated digit.
---------------------------------
Input a number: 4523222
Repeated!!.

限制
需要在陣列a[ ]裡面放進1,2,3,.....0十個數字
讓user輸入最多long int 的一串數字
將這串數字用%解構後跟陣列a[ ]裡面的值比對

這串程式怎麼寫比較完美?
感激!!

回答 (5)

2009-11-22 8:11 am
✔ 最佳答案
單純的事,沒必要複雜化!

#include <stdio.h>
#include <stdlib.h>

int main()
{
long int n;
int i, a[10];
while (1)
{
printf("Enter a Integer: ");
if (scanf("%d", &n) < 1 || n < 0)break; //輸入負數或非數字則結束
for (i = 0; i < 10; ++i) a[i] = 0; //計數陣列歸零
while (a[n % 10]++ ? 0 : n /= 10); //由個位數起檢測是否重複
printf("%s\n\n", n ? "Repeated!!." : "No repeated digit."); //顯示結果
}

system("pause");
return 0;
}

/*
執行例:
Enter a Integer: 12345
No repeated digit.

Enter a Integer: 43322
Repeated!!.

Enter a Integer: 22
Repeated!!.
*/
2009-11-23 1:39 am
小羊絕對不強!
他最近最了一大堆的不良示範!
這題也是!

所以,建烈建議初學者,不要看他的程式!
看看 ???的,再看東邪的,你還會覺得小羊的程式好嗎?

他的程式,超特級化簡為繁!
並有多處表示他對 OS, NULL, class, constructor, speed, compiler, compatibility 等的認知,
 有根本性的錯誤!
2009-11-21 4:59 am
0.0
兩種寫法都好強喔...!!
怎麼到達這種境界的@@

2009-11-20 21:24:43 補充:
QQ
一樓用四行就做完有特別練過嗎??
OO用看的我是還可以,
只是很少寫~
但是你這種寫法 , 用windows.h ~
string::iterator it = this->a.begin()
有書本這樣介紹@@?
2009-11-21 4:51 am
// Headers and Macros
#ifndef _MSC_VER
#undef NULL
#define NULL 0
#endif
#include <iostream>
#include <cstdlib>
using namespace std;
//
#include <string>
#include <Windows.h>
#include <conio.h>
#define MAX_LENGTH 10
class CHW
{
public:
CHW(void)
{
// 要求輸入數字字串
cout<<"Input a number: ";
this->MSDOS_InputBufferLength( a, MAX_LENGTH);
// 檢查是否為數字字元
for ( string::iterator it = this->a.begin(); it != this->a.end(); it ++)
{
if ( isdigit((*it)) == NULL )
{
cout<<"It's not decimal-digit character."<<endl;
return;
}
}
// 檢查重複的數字
this->bFlag = true;
for ( string::iterator it1 = this->a.begin(); it1 != this->a.end(); it1 ++)
{
string::iterator it2 = it1;
it2 ++;
for ( ;it2 != this->a.end(); it2 ++)
{
if ( (*it1) == (*it2) )
{
this->bFlag = false;
cout<<"Repeat digit!!!"<<endl;
return;
}
}
}
if ( this->bFlag )
{
cout<<"No repeat digit!!!"<<endl;
}
}
void MSDOS_InputBufferLength( string& StringBuffer, size_t NumberOfChar)
{
string& a = StringBuffer;
while ( true )
{
bool bSaveChar = true;
int ch;
ch = -1;
ch = getch();
switch ( ch )
{
case VK_BACK:
bSaveChar = false;
if ( ! a.empty() )
{
cout<<"\b \b";
a.erase(a.end() - 1);
}
break;
case VK_RETURN:
cout<<endl;
return;
default:
if ( bSaveChar )
{
if ( a.size() < NumberOfChar )
{
cout<<(char)ch;
a.push_back(ch);
}
}
break;
}
}
}
// Rule of Three in C++
// 1. Copy Constructor
CHW(CHW& clone){}
// 2. Copy Assignment Operator
CHW& operator=(CHW& clone)
{
if ( this != &clone ){}
return *this;
}
// 3. Destructor
~CHW(){}
private:
string a;
bool bFlag;
};
//Main Function
#ifndef _MSC_VER
int
#else
void
#endif
main(int argc, char** argv)
{
//==START==//
CHW ClassHomeWork;
//==END==//
system("PAUSE");
return
#ifndef _MSC_VER
EXIT_SUCCESS
#endif
;
}



2009-11-20 21:12:12 補充:
=__=!
買(或借)本 C/C++ 的書籍來念就會了…
網路上也有一堆參考資料,像是物件導向的 Design patterns 可以參考這個網址:http://www.vincehuston.org/

2009-11-21 18:14:06 補充:
=__=!
只是引用 windows.h 定義的常數而已…
因為懶得再去做定義,所以用現成的定義值。

string 是 STL 的字串資料型態…
在這裡 iterator 是計數器,實際上它用中文翻譯是「迭代器」,很像指標,用法也像指標,但是不可以像指標那樣隨便亂用,例如四則運算等等。

基本上寫小程式寫到可以執行就可以了,除非你想考量到記憶體、系統、演算法、樹、資料結構等雜七雜八的,那就另當別論。

2009-11-21 18:14:37 補充:
有!書本有介紹。

作者:Bjarne Stroustrup(C++ 發明人)
書名:The C++ Programming Language
迭代器的介紹部分:
Part III: The Standard Library
Iterators and Allocators(第 549 頁)

或者你去書局或圖書館找 C++ 的書籍也有相關的介紹。
2009-11-20 11:57 pm
int IsRep(long int N)
{
int A[10]={0};
for(N = N < 0 ? -N : N ; N ; N /= 10 )
if(A[N%10]++)
return 1;
return 0;
}


收錄日期: 2021-04-27 17:15:21
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20091120000015KK04204

檢視 Wayback Machine 備份