2020年MOOCC语言程序设计精髓第十周编程题练兵

1有趣的“回文”检测
题目内容:
英文中有很多的回文词,回文词的拼法十分有趣,无论是从前往后拼读,还是从后往前拼读,他们的拼法和词义都不变。例如:dad(爸爸),mum(妈妈),noon(中午),eve(前夕),eye(眼睛),pop(流行),deed(行为),level(水平)等。简单地说,“回文”就是指顺读和倒读都一样的字符串。现在请你编程输入一个单词,判断它是否是回文。
提示:
(1)设置两个指针pStart和pEnd,让pStart指向字符串首部,让pEnd指向字符串尾部。
(2)利用循环从字符串两边对指针所指字符进行比较,当对应的两字符相等且两指针未超越对方时,使指针pStart向前移动一个字符位置(加1),使指针pEnd向后移动一个字符位置(减1),一旦发现两字符不等或两指针已互相超越(不可能是回文),则立即停止循环。
(3)根据退出循环时两指针的位置,判断字符串是否为回文。

#include <stdio.h>
#include <string.h>

int Loop(char c[],int n){
    int pStart=0,pEnd=n-1;
    while(pStart<=pEnd){
        if(c[pStart]==c[pEnd]){
            pStart++;
            pEnd--;
        }
        else
            return 0;
    }
    return 1;
}

int main()
{
    char str[100];
    printf("Input string:");
    gets(str);
    if(Loop(str,strlen(str)))
        printf("Yes!\n");
    else
        printf("No!\n");
    return 0;
}

3程序改错——1
题目内容:
下面程序的功能是,从键盘输入两个字符串,分别存放在字符数组d和s中,通过调用子函数MyStrcat( )将这两个字符串连接起来,并将连接后的字符串存放在字符数组r中,同时输出连接后的字符串。已知每个字符数组的最大长度为80。下面给出的程序存在错误,找到错误的原因后,请修改正确。并按照给出的程序运行结果示例检查你的程序。
已知函数原型:char* MyStrcat(char *dest, char *source);//函数返回连接后的字符串的首地址

#include <stdio.h>
#include <string.h>
int main(void)
{
        char *first, *second, *result;
        printf("Input the first string:\n");
        gets(first);
        printf("Input the second string:\n");
        gets(second);
        result = MyStrcat(first, second);
        printf("The result is : %s\n", result);
        return 0;
}
char* MyStrcat(char *dest, char *source)
{
        int i = 0;
        while (*(dest+i)!='\0')   i++;
        for (; *(source+i)!='\0'; i++)
        {
            *(dest+i) = *(source+i);   
        }
        return dest;
}

改错后:

#include <stdio.h>
#include <string.h>
#define MAX 10

//未声明函数
char* MyStrcat(char *dest, char *source);
int main(void)
{
        //这里要注意的是如果采用给字符串指针赋初值的方法后面是不能对字符串进行修改的
        char *first, *second, *result;
        //给指针分配空间
        first=(char*)malloc(MAX*sizeof(char));
        printf("Input the first string:\n");
        gets(first);
        //给指针分配空间
        second=(char*)malloc(MAX*sizeof(char));
        printf("Input the second string:\n");
        gets(second);
        //给指针分配空间
        result=(char*)malloc(MAX*sizeof(char));
        result = MyStrcat(first, second);
        printf("The result is : %s\n", result);
        return 0;
}
char* MyStrcat(char *dest, char *source)
{
        int i = 0;
        while (*(dest+i)!='\0')   i++;
        //从source字符串第一位开始处理
        int temp=i;
        for (; *(source+i-temp)!='\0'; i++)
        {
            *(dest+i) = *(source+i-temp);
        }
        //字符串结尾加上结束符
        *(dest+i)='\0';
        return dest;
}

4程序改错——2
题目内容:
下面程序的功能是输出如示例所示形式的数据,目前程序中存在错误,找到错误的原因后,请修改正确,并按照给出的程序运行结果示例检查你的程序。
程序中用到的函数原型如下:
void YH(int a[][ARR_SIZE], int n);
void PrintYH(int a[][ARR_SIZE], int n);
程序运行结果示例:
1
1 1
1 2 1
1 3 3 1

#include<stdio.h>
#define  ARR_SIZE  5
void  YH(int a[][ARR_SIZE], int  n);
void  PrintYH(int a[][ARR_SIZE], int  n);
int main(void)
{
        int  a[ARR_SIZE][ARR_SIZE];
        YH(a, ARR_SIZE);
        PrintYH(a, ARR_SIZE);
        return 0;
}
void YH(int a[][ARR_SIZE], int n)
{
        int  i, j ;
        for (i=1; i<=n; i++)
        {  
             a[i][1] = 1;
             a[i][i] = 1;
        }
        for (i=3; i<=n; i++)
        {
            for (j=2; j<=i-1; j++)
            {
                 a[i][j] = a[i-1][j-1] + a[i-1][j];
            }       
        }
}
void PrintYH(int a[][ARR_SIZE], int n)
{
        int i , j ;
        for (i=1; i<n; i++)
        {
            for (j=1; j<=i; j++)
            {
                printf("%4d", a[i][j]);
            }
             printf("\n");
        }
}

改错后:

#include<stdio.h>
#define  ARR_SIZE  5
void  YH(int a[][ARR_SIZE], int  n);
void  PrintYH(int a[][ARR_SIZE], int  n);
int main(void)
{
        int  a[ARR_SIZE][ARR_SIZE];
        YH(a, ARR_SIZE);
        PrintYH(a, ARR_SIZE);
        return 0;
}
void YH(int a[][ARR_SIZE], int n)
{
        int  i, j ;
        //下标越界
        for (i=1; i<n; i++)
        {
             a[i][1] = 1;
             a[i][i] = 1;
        }
        //下标越界
        for (i=3; i<n; i++)
        {
            for (j=2; j<=i-1; j++)
            {
                 a[i][j] = a[i-1][j-1] + a[i-1][j];
            }
        }
}
void PrintYH(int a[][ARR_SIZE], int n)
{
        int i , j ;
        for (i=1; i<n; i++)
        {
            for (j=1; j<=i; j++)
            {
                printf("%4d", a[i][j]);
            }
             printf("\n");
        }
}

5出售金鱼
题目内容:
买买提将养的一缸金鱼分五次出售:第一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出剩下的11条。问原来鱼缸中共有几条鱼?
设第 i 次有x条,第i+1次有y条,则 i i + 1 x − 1 i + 1 = y \frac{i}{i+1}x-\frac{1}{i+1}=y \quad i+1ixi+11=y则有 x = i + 1 i y + 1 i x=\frac{i+1}{i}y+\frac{1}{i} x=ii+1y+i1故可编程如下

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

int main()
{
    float fish=11,i;
    for(i=4;i>0;i--)
    {
        fish=(i+1)/i*fish+1/i;
    }
    printf("There are %d fishes at first.\n",(int)fish);
    return 0;
}

6找最值
题目内容:
从键盘任意输入10个整数,用指针变量作函数参数编程计算最大值和最小值,并返回它们所在数组中的位置。函数原型如下所示:
int FindMax(int num[], int n, int *pMaxPos);//函数返回最大值,pMaxPos返回最大值所在的下标
int FindMin(int num[], int n, int *pMinPos);//函数返回最小值,pMaxPos返回最小值所在的下标

#include<stdio.h>
#define  MAX  10

int FindMax(int num[], int n, int *pMaxPos){
    int i;
    *pMaxPos = 0;
    for(i=0;i<n;i++){
        if(num[i]>num[*pMaxPos])
            *pMaxPos = i;
    }
    return num[*pMaxPos];
}

int FindMin(int num[], int n, int *pMinPos){
    int i;
    *pMinPos = 0;
    for(i=0;i<n;i++){
        if(num[i]<num[*pMinPos])
            *pMinPos = i;
    }
    return num[*pMinPos];
}

int main(){
    int num[MAX],n=10,pMaxPos,pMinPos,i;
    printf("Input 10 numbers:\n");
    for(i=0;i<n;i++){
        scanf("%d",&num[i]);
    }
    int max = FindMax(num,n,&pMaxPos);
    int min = FindMin(num,n,&pMinPos);
    printf("Max=%d,Position=%d,Min=%d,Position=%d\n",max,pMaxPos,min,pMinPos);
}

7杨辉三角形
题目内容:
编程打印具有如下形式的杨辉三角形,其中输出数据的行数n从键盘输入,并且n<=10。

#include<stdio.h>
#define  MAX  10

int YH(int num[][MAX],int n){
    int i,j;
    for(i=0;i<n;i++){
        num[i][0] = 1;
        num[i][i] = 1;
    }
    for(i=2;i<n;i++){
        for(j=1;j<i;j++){
            num[i][j] = num[i-1][j-1] + num[i-1][j];
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<=i;j++){
            printf("%4d",num[i][j]);
        }
        printf("\n");
    }
    return 0;
}

int main(){
    int n,num[MAX][MAX]={0};
    printf("Input n (n<=10):\n");
    scanf("%d",&n);
    YH(num,n);
    return 0;
}

8颠倒句子中的单词顺序
题目内容:
从键盘输入一个句子(假设字符数小于100个),句子中的单词之间用空格分隔,句子必须以一个标点符号作为结尾,句子开头和末尾标点符号前均没有空格,以回车表示输入结束,请编程颠倒句中的单词顺序并输出。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define  MAX  100

int Reverse(char str[],int len){
    int number=0,letter=0,i;
    char words[20][10];
    char symbol;
    for(i=0;i<len;i++){
        if(str[i]==' '){
            words[number][letter] = '\0';
            number++;
            letter=0;
        }
        else if(i==len-1){//末尾标点符号
            words[number][letter] = '\0';
            number++;
            symbol = str[i];
        }
        else
            words[number][letter++] = str[i];
    }
    for(i=number-1;i>0;i--){
        printf("%s ",words[i]);
    }
    printf("%s%c\n",words[i],symbol);
    return 0;
}

int main(){
    char str[MAX];
    printf("Input a sentence:");
    gets(str);
    int len = strlen(str);
    Reverse(str,len);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值