首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请达人帮小弟我看看程序要怎么实现上面的输入输出,谢谢

2013-03-04 
请达人帮我看看程序要如何实现下面的输入输出,多谢!本帖最后由 blackkettle 于 2013-03-01 12:32:48 编辑

请达人帮我看看程序要如何实现下面的输入输出,多谢!
本帖最后由 blackkettle 于 2013-03-01 12:32:48 编辑 请教达人,我想在 Visual C++里实现如下的输入输出,可是写出的代码总不尽如人意。

输入
2
1 3
3
4 5 6
0

输出
2 1 3
3 4 5 6

其中,第一行的 2表示第二行中有两个数,第二行显示是哪两个数;第三行的 3表示第四行有三个数,第四行显示是哪三个数。第五行的 0表示输入结束。

输出的第一行表示输入的第一行和第二行的数;第二行表示输入的第三行和第四行的数。

我想要加上如下条件,

1.在输入的第一行的 2后(刚敲完 2),如果用户敲击了非数字键(包括字母键,符号键,空格,回车),程序就把光标移到下一行。

2.在第二行的输入时,即使输入了数目大于两个的数,比如 1 3 7,最后的输出里也不会有 7.

我写的代码如下:

#include <conio.h>
#include <iostream>

using namespace std;

const int m = 2;
const int n = 4;

int main(){
int a[m][n];
char buff[256];
int top = 0, k, i, j;
int row;

i = 0;

memset(buff,NULL,sizeof(buff));

while(true){
k = getch();
if(isdigit(k) == 0){
cout<<endl;

if(atoi(buff) == 0)
break;
else{
a[i][0] = atoi(buff);

for(j = 1; j < a[i][0] + 1; j++){
cin >> a[i][j];
}

memset(buff,NULL,sizeof(buff));
top = 0;
i++;
cin.sync();
}
}
else{
buff[top] = k; 
putchar(k); 
top++; 
}
}
buff[top] = '\0'; 

row = i;

for(i = 0; i < row; i++){
for(j = 0; j < a[i][0] + 1; j++){
cout << a[i][j] << ' ';
}
cout << endl;
}

return 0;
}


请达人帮我看看如何改进。谢谢!
[解决办法]
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.

#include <windows.h>
#include <stdio.h>

void ConPrint(char *CharBuffer, int len);
void ConPrintAt(int x, int y, char *CharBuffer, int len);


void gotoXY(int x, int y);
void ClearConsole(void);
void ClearConsoleToColors(int ForgC, int BackC);
void SetColorAndBackground(int ForgC, int BackC);
void SetColor(int ForgC);
void HideTheCursor(void);
void ShowTheCursor(void);

int main(int argc, char* argv[])
{
   HideTheCursor();
   ClearConsoleToColors(15, 1);
   ClearConsole();
   gotoXY(1, 1);
   SetColor(14);
   printf("This is a test...\n");
   Sleep(5000);
   ShowTheCursor();
   SetColorAndBackground(15, 12);
   ConPrint("This is also a test...\n", 23);
   SetColorAndBackground(1, 7);
   ConPrintAt(22, 15, "This is also a test...\n", 23);
   gotoXY(0, 24);
   SetColorAndBackground(7, 1);
   return 0;
}

//This will clear the console while setting the forground and
//background colors.
void ClearConsoleToColors(int ForgC, int BackC)
{
   WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //not used but we need to capture this since it will be
   //written anyway (passing NULL causes an access violation).
   DWORD count;

   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   SetConsoleTextAttribute(hStdOut, wColor);
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

//This will clear the console.
void ClearConsole()
{
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);


   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //   not used but we need to capture this since it will be
   //   written anyway (passing NULL causes an access violation).
   DWORD count;
   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

//This will set the position of the cursor
void gotoXY(int x, int y)
{
   //Initialize the coordinates
   COORD coord = {x, y};
   //Set the position
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

//This will set the forground color for printing in a console window.
void SetColor(int ForgC)
{
   WORD wColor;
   //We will need this handle to get the current background attribute
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   CONSOLE_SCREEN_BUFFER_INFO csbi;

   //We use csbi for the wAttributes word.
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //Mask out all but the background attribute, and add in the forgournd color
      wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
      SetConsoleTextAttribute(hStdOut, wColor);
   }
}

//This will set the forground and background color for printing in a console window.
void SetColorAndBackground(int ForgC, int BackC)
{
   WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
}

//Direct console output


void ConPrint(char *CharBuffer, int len)
{
   DWORD count;
   WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), CharBuffer, len, &count, NULL);
}

//Direct Console output at a particular coordinate.
void ConPrintAt(int x, int y, char *CharBuffer, int len)
{
   DWORD count;
   COORD coord = {x, y};
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleCursorPosition(hStdOut, coord);
   WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
}

//Hides the console cursor
void HideTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = FALSE;
  SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}

//Shows the console cursor
void ShowTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = TRUE;
  SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}


[解决办法]

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    std::multimap<int, int*> input_map;
    int num = 0;
    int i = 0;
    cin >> num;
    while(0!=num)
    {
        int *value = new int[num];
        for(i=0; i<num; ++i)
        {
            cin >> value[i];
        }
        input_map.insert(std::multimap<int, int*>::value_type(num, value));
        cin >> num;
    }

    multimap<int, int*>::const_iterator itr;
    for (itr=input_map.begin(); itr!=input_map.end(); ++itr)
    {
        cout << itr->first << " ";
        for (i=0; i<itr->first; ++i)
        {
            cout << itr->second[i] << " ";
        }
        cout << endl;
    }


    
    return 0;
}



new的空间没有delete。
自己看着完善吧。

热点排行