华中农业大学mooc编程题

Posted on 2019-10-07 11:02  金色的省略号  阅读(9150)  评论(0编辑  收藏  举报
仅作参考,请指正(都提交通过,但是,也可能有错误)
1、英文单词数量统计

题目内容:

输入一个英文句子,句子中的单词用空格隔开,隔开单词的空格可能不止一个,现要求去掉单词之间多余的空格,使得两个单词之间只有一个空格,且句子开头无空格,再统计句子中单词的个数并输出。

输入格式:

输入占一行,是一个包含空格的英文句子,以回车结束

输出格式:

输出包括两行,第一行是去掉多余空格后的英文句子;第二行是一个数值,表示句子中单词的个数。 

输入样例:

      I  am        happy.

输出样例:

I  am  happy.

3

 1 #include <iostream>
 2 using namespace std;
 3 #define N 250
 4 
 5 int main()
 6 {
 7     char str[N] = "";
 8     char *p = str,*p1=str;
 9     gets(str);
10     int count = 0;
11     
12     while(*p)
13     {
14         if(*p!=' ')
15         {            
16             *p1++ = *p;
17             if(*(p+1)==' '||!(*(p+1)))
18             {
19                 count++;
20                 *p1++ = ' ';
21             }
22         }
23         p++;
24     }
25     *(p1-1)='\0';
26     
27     cout<<str<<endl;
28     cout<<count<<endl;
29   
30     return 0;
31 }
2、时间类

题目内容:

设计一个时间类(class Time),其中有表示“时、分、秒”的数据成员,设计初始化3个数据成员的构造函数,实参缺省时均初始化为0;设计拷贝构造函数,用一个已经存在的Time对象初始化正在创建的新对象;设计成员函数SetTime设置时间的值;设计成员函数Print以24小时格式输出时间(如“09:20:45”、“14:30:00”)。注意,若表示时、分、秒的数据不在合理范围内,则将不合理的数据取0值。以下是主函数:
int main()
{
  int h,m,s;
  cin>>h>>m>>s;    //从键盘依次输入时、分、秒的值
  Time t1(h);
  t1.Print();
  t1.SetTime(h,m,s);
  t1.Print();
  Time t2(t1);
  t2.Print();
  return 0;
}

 

输入格式:

输入3个整型数,分别表示时、分、秒,数据之间以空格隔开。

输出格式:

输出包括三行,每行都是一个以24小时格式输出的时间。

输入样例:

4 50 66

输出样例:

04:00:00

04:50:00

04:50:00

请注意:提交代码时,需要完整的程序,即除了类的设计,还需要包括以上主函数。

 1 #include <iostream>
 2 #include <iomanip>
 3 using namespace std;
 4 
 5 class Time{
 6     int hour,minute,second;
 7 public:
 8     Time(int h=0,int m=0,int s=0){
 9         if(h>=24) h=0;
10         if(m>=60) m = 0;
11         if(s>=60) s = 0;
12         hour = h;
13         minute = m;
14         second = s;
15     }
16     Time(const Time &t)
17     {
18         hour = t.hour;
19         minute = t.minute;
20         second = t.second;
21     }
22     void SetTime(int h,int m,int s){
23         if(h>=24) h=0;
24         if(m>=60) m = 0;
25         if(s>=60) s = 0;
26         hour = h;
27         minute = m;
28         second = s;
29     }
30     void Print(){
31         cout<<setw(2)<<setfill('0')<<hour<<":";
32         cout<<setw(2)<<setfill('0')<<minute<<":";
33         cout<<setw(2)<<setfill('0')<<second<<endl;    
34     }
35 };
36 int main()
37 {
38     int h,m,s;
39     cin>>h>>m>>s;    //从键盘依次输入时、分、秒的值
40     Time t1(h);
41     t1.Print();
42     t1.SetTime(h,m,s);
43     t1.Print();
44     Time t2(t1);
45     t2.Print();
46   
47     return 0;
48 }

 3、逆序字符串

用指针处理从键盘输入的字符串,使其逆序并输出。重复这个过程直到输入空串为止。

 1 //修正
 2 #include "iostream"
 3 #include <string.h>
 4 using namespace std;
 5 #define N 100
 6 int main()
 7 {
 8     char s[N] = "";//gets(s);
 9     while(cin.getline(s,N)&& strcmp(s,"\0"))
10     {
11         int n = strlen(s); //字符串长度
12         char *p = s + n -1;//字符串尾指针
13         cout<<"逆序后:";
14         while(n--)         //从后向前打印
15         {
16             cout<<*p--;
17         }
18         cout<<endl;
19     }
20     cout<<"输入了空串,程序终止"<<endl;
21     return 0;
22 }

4、动态创建整形数组

编写程序,根据用户输入的值n,建立长度为n的整型数组,再向数组输入n个元素的值,并求其所有元素之和。

 1 ​#include "iostream"
 2 using namespace std;
 3 int main()
 4 {  
 5     int n,sum = 0;
 6     cout<<"n=?"<<endl;
 7     cin>>n;
 8     int *p = new int[n];
 9     
10     for(int i=0; i<n; ++i)
11     {
12         cin>>p[i];
13         sum += p[i];
14     }
15     cout<<"数组元素的和为:"<<sum<<endl;
16     delete(p);
17     return 0;
18 }

5、合并字符串

输入两个字符串a和b,并动态构造一个新的字符串c。要求是:将a和b对应字符中的较大者存入c对应的位置上,若a和b不一样长,则将较长字符串多出部分的字符全部依序存入c中。

 1 #include "iostream"
 2 #include <string.h>
 3 using namespace std;
 4 #define N 100
 5 int main()
 6 {  
 7     char a[N] = "", b[N] = "", c[2*N] = "";
 8     cout<<"请输入两个字符串:"<<endl;
 9     cin>>a>>b;
10     char *pa=a,*pb=b,*pc=c;
11     
12     while(*pa&&*pb)
13     {
14         if(*pa>*pb)
15             *pc=*pa;
16         else
17             *pc=*pb;
18         pa++,pb++,pc++;
19     }
20     
21     if(pa)
22         strcat(c,pa);
23     if(pb)
24         strcat(c,pb);
25     cout<<"新的字符串是:"<<c<<endl;
26     return 0;
27 }

6、编写程序,求能被7整除 且个位数字为9的所有三位数,将满足条件的数每10个一行显示,并输出满足条件的数的个数。

 1 #include <iostream>
 2 using namespace std;
 3  
 4 int main()
 5 {
 6     cout<<"满足条件的数有:"<<endl;
 7     int count = 0;
 8     for(int i=109; i<=999; ++i){
 9         if(i%7==0 && i%10==9){
10             count++;
11             cout<<i<<" ";
12             if(count%10==0){
13                 cout<<endl;
14             }
15         }   
16     }
17     cout<<endl<<"满足条件的数共有:"<<count<<""<<endl;
18     return 0;
19 }

7、编写程序,输入两个正整数m和n,求出这两个数的最大公约数并显示出来。

 1 #include <iostream>
 2 using namespace std;
 3 int GCD(int x, int y);
 4 int main()
 5 {
 6     cout<<"请输入两个正整数:";
 7     int a,b;
 8     cin>>a>>b;
 9     cout<<a<<""<<b<<"的最大公约数"<<GCD(a,b)<<endl;
10     return 0;
11 }
12 int GCD(int x, int y){
13     return y == 0 ? x : GCD(y, x%y); 
14 }

8、猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第五天早上想再吃时,见只剩下一个桃子了。请编程求第一天共摘了多少个桃子?

 1 #include <iostream>
 2 using namespace std;
 3  
 4 int main()
 5 {
 6     int day = 4, remain = 1;
 7     //因为第5天早上想吃的时候只剩一个,从计算第4天吃之前的桃子数开始
 8     for(day =4; day>0; --day)
 9     {
10         remain = 2 * (remain + 1);//第一轮计算第4天早上的没吃的时候的桃子,以此类推      
11     }
12      
13     cout<<"第一天一共摘了"<<remain<<"个桃子"<<endl;
14     return 0;
15 }

9、输入整型数组的元素个数n,依次输入n个数组元素,求其中负数的和。

 1 #include<iostream>
 2 using namespace std;
 3  
 4 int main()
 5 {
 6     cout<<"请输入数组元素个数:"<<endl;
 7     const int N = 100;
 8     int arr[N] = {0}, n, index=0, sum = 0;
 9      
10     cin>>n;
11     while(n--)
12     {
13         cin>>arr[index];
14         if(arr[index]<0)
15             sum += arr[index];
16         index++;
17     }
18     cout<<"数组中负数元素的和为:"<<sum<<endl;
19     return 0;
20 }

10、求一个n阶矩阵的转置。输入n值及矩阵的所有元素,存储在二维数组a中,要求在a中进行转置。

 1 #include<iostream>
 2 using namespace std;
 3 const int N = 100;
 4  
 5 void Print(int arr[][N], int n);
 6 int main()
 7 {   
 8     cout<<"请输入矩阵阶数:"<<endl;
 9     int arr[N][N] = {0}, n;
10     cin>>n;
11      
12     /* 输入矩阵 */
13     for(int i=0; i<n; ++i){
14         for(int j=0; j<n; ++j){
15             cin>>arr[i][j];       
16         }
17     }
18     /* 输出矩阵 */
19     cout<<"原矩阵为:"<<endl;
20     Print(arr,n);
21      
22     /* 转置矩阵 */
23     for(int i=0; i<n; ++i){
24         for(int j=0; j<i; ++j){
25             int t = arr[i][j];
26             arr[i][j] = arr[j][i];
27             arr[j][i] = t;
28         }
29     }
30     /* 输出转置矩阵 */
31     cout<<"转置后矩阵为:"<<endl;
32     Print(arr,n);   
33     return 0;
34 }
35  
36 void Print(int arr[][N], int n)
37 {
38     for(int i=0; i<n; ++i){
39         for(int j=0; j<n; ++j){
40             cout<<arr[i][j]<<"\t";
41         }
42         cout<<endl;
43     }
44 }

11、假设一个字符串中不含空格,输入该字符串并统计其中字母和非字母的个数。

 1 #include<iostream>
 2 using namespace std;
 3  
 4 int main()
 5 {   
 6     cout<<"请输入一个不含空格的字符串:"<<endl;
 7     const int N = 100;
 8     char arr[N] = "";
 9     cin>>arr;
10      
11     int count1 = 0, count2 = 0;
12     for(int i=0; arr[i]; ++i){
13         if(arr[i]>='a'&&arr[i]<='z' || arr[i]>='A'&&arr[i]<='Z')
14             count1++;
15         else 
16             count2++;
17     }
18     cout<<"字符串中字母的个数为:"<<count1<<endl;    
19     cout<<"字符串中非字母的个数为:"<<count2<<endl;
20     return 0;
21 }

12、输入不含空格的字符串s及待删除的字符ch,将s中所有与ch相同的字符都删除掉,输出删除后得到的新串。要求直接在数组s中进行删除,得到的新串仍然在数组s中。

 1 #include<iostream>
 2 #include <string.h>
 3 using namespace std;
 4 #define N 100
 5  
 6 void deletechar(char s[],char c);
 7 int main()
 8 {
 9     cout<<"请输入一个不含空格的字符串:"<<endl;
10     char s[N] = "", c;
11     cin>>s;
12      
13     cout<<"请输入要删除的字符:"<<endl;   
14     cin>>c;
15      
16     deletechar(s,c);
17     cout<<"删除后的字符串为:"<<s<<endl;
18     return 0;
19 }
20 void deletechar(char s[],char c){
21     char t[N] = "";
22     char *p = s, *q = t;
23     while(*p)
24     {
25         if(*p!=c)
26             *q++ = *p;
27         p++;
28     }
29     strcpy(s,t);
30 }
 1 void deletechar(char s[],char c){
 2     char *p = s, *q = s;
 3     while(*p)
 4     {
 5         if(*p!=c)
 6             *q++ = *p;
 7         p++;
 8     }
 9     *q = '\0';
10 }

13、用指针处理从键盘输入的字符串,使其逆序并输出。重复这个过程直到输入空串为止。

  栈中变量地址分配是从高地址到低地址的顺序压栈,数据是从低位向高位存储

#include <stdio.h>
#include <string.h>
 
int main()
{
    int x = 'a';
    char str[10] = "123456789";    
    putchar(str[10]);  //栈从高地址到地地址顺序压栈
    putchar('\n');
    
    strcpy(str,"0123456789b"); // x 最低一个字节 被'b'覆盖
    printf("%d,%d\n",x,'b');
    
    int boo = *((char*)&x+1) == '\0'; //x地址向上一字节是字符串结束标志'\0'
    printf("%d\n",boo);
    
    x = ('b'<< 8) + 'b'; //strcpy(str,"0123456789bb"); 即x为"bb"覆盖
    printf("%d\n", x);
    return 0;
}
View Code

  字符数组越界

#include "iostream"
#include <string.h>
using namespace std;
#define N 100
int main()
{
    char s[N] = "";//gets(s);
    while(cin.getline(s,N)&& strcmp(s,"\0"))
    {
        char *p = s+strlen(s)-1;
        cout<<"逆序后:";
        while(*p)  //错误!
        {
            cout<<*p--;
        }
        cout<<endl;
    }
    cout<<"输入了空串,程序终止"<<endl;
    return 0;
}
有问题代码
#include "iostream"
#include <string.h>
using namespace std;
#define N 100
int main()
{
    char s[N] = "";//gets(s);
    while(cin.getline(s,N)&& strcmp(s,"\0"))
    {
        int len = strlen(s);
        char *p = s+len-1;
        cout<<"逆序后:";
        while(len--)  //!
        {
            cout<<*p--;
        }
        cout<<endl;
    }
    cout<<"输入了空串,程序终止"<<endl;
    return 0;
}

14、编写程序,根据用户输入的值n,建立长度为n的整型数组,再向数组输入n个元素的值,并求其所有元素之和。

 1 #include "iostream"
 2 using namespace std;
 3 int main()
 4 {  
 5     int n,sum = 0;
 6     cout<<"n=?"<<endl;
 7     cin>>n;
 8     int *p = new int[n];
 9      
10     for(int i=0; i<n; ++i)
11     {
12         cin>>p[i];
13         sum += p[i];
14     }
15     cout<<"数组元素的和为:"<<sum<<endl;
16     delete(p);
17     return 0;
18 }

15、输入两个字符串a和b,并动态构造一个新的字符串c。要求是:将a和b对应字符中的较大者存入c对应的位置上,若a和b不一样长,则将较长字符串多出部分的字符全部依序存入c中。

 1 #include "iostream"
 2 #include <string.h>
 3 using namespace std;
 4 #define N 100
 5 int main()
 6 {  
 7     char a[N] = "", b[N] = "", c[2*N] = "";
 8     cout<<"请输入两个字符串:"<<endl;
 9     cin>>a>>b;
10     char *pa=a,*pb=b,*pc=c;
11      
12     while(*pa&&*pb)
13     {
14         if(*pa>*pb)
15             *pc=*pa;
16         else
17             *pc=*pb;
18         pa++,pb++,pc++;
19     }
20      
21     if(pa)
22         strcat(c,pa);
23     if(pb)
24         strcat(c,pb);
25     cout<<"新的字符串是:"<<c<<endl;
26     return 0;
27 }

16、计算4名学生3门课程成绩的平均分。在主函数中给定各门课程的成绩和输出计算得到的各平均分,avg函数用于计算各课程的平均分。

 1 #include<iostream>
 2 using namespace std;
 3  
 4 double avg(double a, double b, double c){
 5     return (a+b+c)/3;
 6 }
 7  
 8 int main()
 9 {
10     int n = 4;
11     double a,b,c;
12     while(n--)
13     {
14         cin>>a>>b>>c;
15         cout<<avg(a,b,c)<<endl;
16     }
17     return 0;
18 }

17、编写程序,求出输入的一个正整数n的阶乘。要求设计递归函数求出n的阶乘。

 1 #include<iostream>
 2 using namespace std;
 3  
 4 long fac(int n){
 5     if(n==1)
 6         return 1;
 7     return n*fac(n-1);
 8 }
 9  
10 int main()
11 {
12     int n;
13     cin>>n;
14     cout<<fac(n)<<endl;
15     return 0;
16 }

18、编写程序。输入一个正整数判断其是否是质数。要求设计一个函数对正整数n是否是质数进行判断,是质数函数返回1,不是质数返回0。

 1 #include<iostream>
 2 using namespace std;
 3  
 4 bool isPrime(int n){
 5     for(int i=2; i<n; ++i)
 6         if(n%i==0)
 7             return false;
 8     return true;
 9 }
10  
11 int main()
12 {
13     int n;
14     cin>>n;
15     if(isPrime(n))
16         cout<<"是质数\n"<<endl;
17     else
18         cout<<"不是质数\n"<<endl;
19     return 0;
20 }