C语言作业1

第一题

从键盘输入一个英文句子,统计其中的单词个数,然后输出。出于方便考虑,本题所说的单词,是指仅由英文字母组成最长序列。下面样例中的U.S.理解为2个单词。假定句子不超过128个字符。

提示:对表示句子的字符串中的内容依次进行检查。应该需要一个变量来记录当前是否已经遇到一个单词。

输入样例:

On October 26, U.S. News & World Report released the 2022 Best Global Universities Rankings. 

输出结果:

13

思路:

单词以字母开始以字母结束,只需要判断这个就可以了(注意字母的范围是A-Z和a-z,非字母的范围是小于A,大于Z且小于a,大于z)

代码:

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

int main()
{
    char ch;
    int count = 0;
    while((ch = getchar()) != '\n')
    {


       if((ch <= 'z'&&ch >= 'a')||(ch <= 'Z'&&ch >= 'A'))
        {
            while(1)//无条件进入循环
            {
                ch = getchar();//这里的ch会覆盖掉最上面的那个ch
                if((ch > 'z')||(ch < 'a'&&ch > 'Z')||(ch < 'A'))//非字母的范围
                {
                    count++;//计数
                    break;//不管break在哪个位置,只要在循环里出现就可以跳出循环
                }
            }

        }

        }
        printf("%d\n",count);
        return 0;

    }

第二题

从键盘输入若干个从小到大排列的整数,再输入一个整数a,为了把a插入到该已经排序的整数序列中,需要从前往后或者从后往前依次查找应该插入的位置(如序列中存在相同整数,则插入到该整数之前。位置从1开始计数)。具体地说,如果序列中有n个元素,新来的a如果应该插入到第n个元素之前,则输出n。如果应该放在最后一个元素之后,则输出n+1。假定输入的整数序列中整数的个数不超过10。

在下面的样例中,第一行为将要输入的整数个数,第二行为输入的整数序列,第三行为要插入的数。

输入样例1:

5

0 3 4 7 8

6

输出结果1:

4

输入样例2:

5

0 3 4 7 8

9

输出结果2:

6

输入样例3:

4

1 3 4 8

-2

输出结果3:

1

思路:

不用管插入新数之后的数组,只需要确定新数插入的位置即可,做一个判断,如果遇到比输入的数大的数,直接打印该数在数组中的位置,并跳出循环(注意数组的下标从0开始),如果遇到的数一直都比输入的数大的话,直接打印数组中数的个数加一,过程中可用一个标记数。

代码:

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

int main()
{
    int arr[10],i,a,x,tmp=0;
    scanf("%d",&a);//确定数组中数的个数
    for(i = 0;i<a;i++)
    {
        scanf("%d",&arr[i]);
    }//构造数组
    scanf("%d",&x);//确定要输入的新数
    for(i = 0;i<a;i++)
    {
        if(x < arr[i])
        {
            printf("%d\n",i+1);//因为数组的下标从0开始,所以这里打印的是i+1
            tmp=1;//tmp做中间的判断量
            break;//跳出循环
        }
    }
    if(tmp==0)
        printf("%d\n",a+1);//注意这里不能用输入的x跟arr[n]比较,这里的arr[n]应该是个地址量,不                                            是整数型
    return 0;
}

第三题

对于一个已经排序的序列,要查找某个数在其中的位置,并不需要按顺序逐一比较,可以找位于这个序列中间位置的元素,判断要查找的数在它之前还是之后,然后就可以缩小范围,这样做下去一定会确定是否找到,该方法被称为二分法。

从键盘输入若干个整数,对它们进行排序,然后再输入一个整数a,通过二分法查找a在之前排好序的整数序列中的序号(从1开始),打印该序号。如果没有找到,则打印no。

在下面的样例中,第一行为将要输入的整数个数,第二行为输入的整数序列,第三行为要查找的数。

假定输入的整数序列中整数的个数不超过40。

提示:因为二分查找算法相对独立,建议把二分查找写成一个函数,在main中进行调用

输入样例1:

5

0 8 7 3 4

6

输出结果1:

no

输入样例2:

6

9 2 6 4 8 7

6

输出结果2:

3

思路:

输入数的过程和第二题一样,但下面的部分看不明白

代码:

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

int main()
{
    int k,n,i=0;
    scanf("%d\n",&n);
    int arr[n];
    for(;i<n;i++)
        scanf("%d",&arr[i]);
    scanf("%d",&k);
    int sz = sizeof(arr)/sizeof(arr[0]);
    int left=0;
    int right=sz-1;
while (left<=right)
{
        int mid=(left+right)/2;
    if(arr[mid]>k)
    {
        right=mid-1;
    }
    else if(arr[mid]<k)
    {
        left=mid+1;
    }
    else
    {
        printf("%d\n",mid+1);
        break;
    }
}
if(left>right)
    printf("no");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值