佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1878|回复: 36

C/C++讨论区~~(会写C/C++的大大们请进来下下...)

[复制链接]
发表于 22-6-2008 06:08 PM | 显示全部楼层 |阅读模式
想问些学术上的问题,请问有谁可以帮忙下?
http://img113.imageshack.us/my.php?image=45329384ij0.png

http://img113.imageshack.us/my.php?image=81090241ix0.png

[ 本帖最后由 无言的豆腐 于 27-6-2008 07:51 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 23-6-2008 12:32 PM | 显示全部楼层
把你的switch放在while loop的外面。
回复

使用道具 举报

 楼主| 发表于 24-6-2008 06:30 PM | 显示全部楼层
原帖由 文世杰 于 23-6-2008 12:32 PM 发表
把你的switch放在while loop的外面。

你在开玩笑啊?还是做来看看?
回复

使用道具 举报

发表于 24-6-2008 07:52 PM | 显示全部楼层
你在哪里读programming?
回复

使用道具 举报

发表于 25-6-2008 01:10 AM | 显示全部楼层
原帖由 无言的豆腐 于 24-6-2008 06:30 PM 发表

你在开玩笑啊?还是做来看看?


哇!你要人家帮你语气还这么恶劣哦?虽然他的答案并不正确。

你的问题出在,你每loop一次都把当时的答案(未完成计算的暂时答案)给cout出来。你应该在计算完后(loop结束后)才一次过cout答案出来。 而且你竟是在case里面的default里面print 句子?? 如果你的输入纯粹只有vowels的话,你将不会看到任何输出!!我也跟文世杰一样很好奇你在哪里读programming的。

另外,你缺乏一个terminate case, 也就是说你必须输入超过21个char才能终止你的while loop。

再另外,你可以把输入的char转换成全小写或全大写的,那就不必浪费资源去检查两个case了。

我个人从来不用cin和cout所以无法给你example code。

第二个问题,尝试使用getch()或者getche()吧。它们应该是stdio.h 或者 conio.h 里的 function,不完全是C++的手段,但是还是可以把工作完成的。
回复

使用道具 举报

发表于 25-6-2008 09:16 AM | 显示全部楼层
我也想知道你在哪里读programming的

While( input = 23 )
{

}


'=' is for assignment
'==' is for comparison
回复

使用道具 举报

Follow Us
发表于 25-6-2008 11:42 AM | 显示全部楼层
第一题五楼已经说明了。如果硬要用cin的话最好把input设成char[xxx],再用cin.getline()。详细的上网找找咯。

第二题的话其实用iostream就行了。在最后加上
cin.ignore();
cout<<"ress any key to continue...";
cin.get();

在大学园地版看过你,开学了啊?呵呵
回复

使用道具 举报

 楼主| 发表于 25-6-2008 12:52 PM | 显示全部楼层
原帖由 geekman 于 25-6-2008 01:10 AM 发表


哇!你要人家帮你语气还这么恶劣哦?虽然他的答案并不正确。

你的问题出在,你每loop一次都把当时的答案(未完成计算的暂时答案)给cout出来。你应该在计算完后(loop结束后)才一次过cout答案出来。 而且你竟 ...

我只是看到他的回答有点流汗罢了...
并没有要贬低他的意思... 只是要他写来看看(真的不懂怎样把switch搬去while loop外面)...
(如果你认为我语气真的那么恶劣的话... 跟你(to : 文世杰) 说声对不起啦... 不好意思哦 )

[ 本帖最后由 无言的豆腐 于 25-6-2008 01:02 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 25-6-2008 12:53 PM | 显示全部楼层
原帖由 lewisksh 于 25-6-2008 09:16 AM 发表
我也想知道你在哪里读programming的



'=' is for assignment
'==' is for comparison

不好意思,那边我post了上去才发现到,改了改了
回复

使用道具 举报

 楼主| 发表于 25-6-2008 01:01 PM | 显示全部楼层
原帖由 geekman 于 25-6-2008 01:10 AM 发表
...你的问题出在,你每loop一次都把当时的答案(未完成计算的暂时答案)给cout出来。你应该在计算完后(loop结束后)才一次过cout答案出来。而且你竟是在case里面的default里面print 句子??如果你的输入纯粹只有vowels的话,你将不会看到任何输出!!我也跟文世杰一样很好奇你在哪里读programming的。

另外,你缺乏一个terminate case, 也就是说你必须输入超过21个char才能终止你的while loop。

再另外,你可以把输入的char转换成全小写或全大写的,那就不必浪费资源去检查两个case了。

我个人从来不用cin和cout所以无法给你example code。

第二个问题,尝试使用getch()或者getche()吧。它们应该是stdio.h 或者 conio.h 里的 function,不完全是C++的手段,但是还是可以把工作完成的。



第一个我也早早改了(lowyat那边的人教我的),  之前粗心没有发现到
就是不懂怎样set terminate case,不过我用另一个方法代替了,等下post上来给你看...
怎样转lower and upper case??
除了iostream.h和math.h其他我都不会用了(学院还没教到),不好意思咧~
回复

使用道具 举报

 楼主| 发表于 25-6-2008 01:04 PM | 显示全部楼层
原帖由 咕咕叫 于 25-6-2008 11:42 AM 发表
第一题五楼已经说明了。如果硬要用cin的话最好把input设成char[xxx],再用cin.getline()。详细的上网找找咯。

第二题的话其实用iostream就行了。在最后加上
cin.ignore();
cout

cin.ignore()... cin.getline()... char[xxx]... 这些东西我也还没学到,不好意思
开学了啊,两个月去了,你还记得我哦?哈哈哈
to 要知道我读哪里的人: INTI International College Penang
回复

使用道具 举报

 楼主| 发表于 25-6-2008 01:41 PM | 显示全部楼层
完成版~~ 不过自己认为还不够好...


回复

使用道具 举报

发表于 25-6-2008 03:05 PM | 显示全部楼层
嗯。。grammar也要改进啊
回复

使用道具 举报

发表于 25-6-2008 04:29 PM | 显示全部楼层
所谓的terminate case就是设定一个可以中断/停止接受输入,以判定使用者已经完成输入,然后你就可以执行需要的运算。一般上你可以检测如果使用者按下ENTER键,就表示他已经完成输入,你可以开始计算里面的consonents & vowels 了。

转换大/小写:
  1. char to_Lower(char original)
  2. {
  3.     if(original >= 'A' && original <='Z')
  4.         return (char)(original + 32);
  5.     else
  6.         return original;
  7. }
复制代码
  1. char to_Upper(char original)
  2. {
  3.     if(original >= 'a' && original <='z')
  4.         return (char)(original - 32);
  5.     else
  6.         return original;
  7. }
复制代码
察看ASCII表你就会发现英文字母大小写的代号相差32,所以转换很简单的。

一下附上一个很久以前我写的C Program,用来转换Lower case / Upper case的。因为我采用了gets(),所以当使用者按下ENTER键就自动形成terminate case(使用者完成输入)。我使用的是C++ Builder。
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #pragma hdrstop
  6. //---------------------------------------------------------------------------
  7. #pragma argsused

  8. char char_to_lower(char);
  9. char char_to_upper(char);
  10. void string_to_lower(char *);
  11. void string_to_upper(char *);

  12. void main(void)
  13. {
  14.     char string[255];

  15.     clrscr();
  16.     printf("Please enter a word: ");
  17.     gets(string);

  18.     string_to_lower(string);
  19.     printf("Lower Case: %s\n", string);
  20.     string_to_upper(string);
  21.     printf("Upper Case: %s\n", string);

  22.     printf("\nPress any Key to continue:");
  23.     getch();
  24. }
  25. //---------------------------------------------------------------------------
  26. char char_to_lower(char original)
  27. {
  28.     if(original >= 'A' && original <= 'Z')
  29.         return (original + 32);
  30.     else
  31.         return original;
  32. }
  33. //---------------------------------------------------------------------------
  34. char char_to_upper(char original)
  35. {
  36.     if(original >= 'a' && original <= 'z')
  37.         return (original - 32);
  38.     else
  39.         return original;
  40. }
  41. //---------------------------------------------------------------------------
  42. void string_to_lower(char *original)
  43. {
  44.     int length = strlen(original);
  45.     for(int i=0; i<length; i++)
  46.     {
  47.         original[i] = char_to_lower(original[i]);
  48.     }
  49. }
  50. //---------------------------------------------------------------------------
  51. void string_to_upper(char *original)
  52. {
  53.     int length = strlen(original);
  54.     for(int x=0; x<length; x++)
  55.     {
  56.         original[x] = char_to_upper(original[x]);
  57.     }
  58. }
  59. //---------------------------------------------------------------------------
复制代码
回复

使用道具 举报

 楼主| 发表于 25-6-2008 05:57 PM | 显示全部楼层
原帖由 咕咕叫 于 25-6-2008 03:05 PM 发表
嗯。。grammar也要改进啊

别管我的grammar啦,我知道我英文差
(其实我也想知道grammar错哪里... )
回复

使用道具 举报

 楼主| 发表于 25-6-2008 06:04 PM | 显示全部楼层
原帖由 geekman 于 25-6-2008 04:29 PM 发表
所谓的terminate case就是设定一个可以中断/停止接受输入,以判定使用者已经完成输入,然后你就可以执行需要的运算。一般上你可以检测如果使用者按下ENTER键,就表示他已经完成输入,你可以开始计算里面的consonents ...

讲真我可以说是完全看不懂你在写什么... 我是不是应该先学C Language才去学C++咧?
(我学院一开始就教C++了,所以我连C的基础都没有)
回复

使用道具 举报


ADVERTISEMENT

发表于 25-6-2008 08:11 PM | 显示全部楼层
我认为C和C++根本就是分不开的,C++是从C进化而来的,所以两者根本就不应该被当成完全不同的语言。

我的那个program只是使用了stdio.h和conio.h里面的function。printf() 相当于cout,只是它能够把输出的文字句子根据一定的格式(例如 %s 就是表示 string)来输出。而gets() 则是相当于cin,只是这个function 是专门用来读取string (char *) 的,而cin的功能比较广泛。getch() 则是单单读取一个char,它会一直等待直到使用者按下任何一个按键,所以常常被用来当作暂停program运行的方法,相当于cin.ignore()(如果你不打算处理它所读取的char)

你并不需要先熟悉C才来学习C++,C++已经可以做到C的一切,甚至更进一步拥有如Object-Oriented之类的C无法做到的功能。
回复

使用道具 举报

 楼主| 发表于 25-6-2008 08:41 PM | 显示全部楼层
原帖由 geekman 于 25-6-2008 08:11 PM 发表
我认为C和C++根本就是分不开的,C++是从C进化而来的,所以两者根本就不应该被当成完全不同的语言。

我的那个program只是使用了stdio.h和conio.h里面的function。printf() 相当于cout,只是它能够把输出的文字句子 ...

o... 酱如果我要set一个terminated case的话,我只需要在我command的结尾写个cin.ignore()就可以咯?
不过你们老手写的program我都看不懂咧...
回复

使用道具 举报

发表于 26-6-2008 11:09 AM | 显示全部楼层
不,cin.ignore() 或 getch() 并不是terminate case。所谓的 terminate case 只是指一个中断或停止 loop (while loop, for loop) 的条件。一般上人们习惯在输入资料完毕时按下 ENTER 键,这个就可以被当作 terminate case 的条件。例如你要获取可能很长的资料,比如名字,其长度可能从十数个字母到数十个字母甚至上百个字母不等。你总不能规定每个人只能/一定要输入20个字母的名字吧?在这种情形之下,你只能设定一个合逻辑的最大值:
  
char name[255];

然后准许使用者输入介于1个字母到255个字母的名字。可是要如何知道使用者已经完成输入了呢?他的名字可能是15个字母,也可能是45个字母,可以是任何一个数目。所以我们就要侦测一个条件,也就是当使用者按下 ENTER 键,就代表他已经完成输入。
  1. char name [255];
  2. int count = 0;
  3. bool is_complete = false;
  4. char input;

  5. while (count < 255 && is_complete == false)
  6. {
  7.    input = getche(); //相当于 cin >> input;   
  8.    switch(input)
  9.    {
  10.        case 13: is_complete = true; //13是 ENTER (Carriage Return) 的 ASCII 代码
  11.                      break;
  12.        default: name[count] = input;      
  13.    }
  14.    count++; //相当于count = count + 1;
  15. }
复制代码
在上面的例子中,case 13: 就是 terminate case, 而 is_complete = true; 就是让它中断 loop 的关键。因为这个 while loop 的条件是 while count is less than 255 AND is_complete is equal to 'false'。当发现使用者的输入是 ENTER 键时,is_complete 就被设定为 true,从而中断 while loop 让程式继续之后的运算(或者你可以使用 break 或者 continue 来中断或跳过一部分的 loop 运算)。

这应该能让你明白了吧?不明白也不用紧,你现在还是初学者,对C/C++语言的了解还不够,以后你就会慢慢了解的了。

在结尾放一个 getch() 或 cin.ignore() 的作用只是让program 暂停运作,等待使用者按下一个按键罢了,也就是 “Press a key to continue...“ 的作用。
回复

使用道具 举报

 楼主| 发表于 26-6-2008 11:38 PM | 显示全部楼层
原帖由 geekman 于 26-6-2008 11:09 AM 发表
不,cin.ignore() 或 getch() 并不是terminate case。所谓的 terminate case 只是指一个中断或停止 loop (while loop, for loop) 的条件。一般上人们习惯在输入资料完毕时按下 ENTER 键,这个就可以被当作 terminat ...

哦,谢啦,大概看得懂你在写什么了,也学到怎样用array和boolean(好像是酱写,没错吧?)来做terminate case了,谢谢哦!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 24-12-2025 12:51 AM , Processed in 0.149011 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表