【头歌C语言程序与设计】数组

目录

写在开头

正文

第1关:选择法排序

第2关:二分段交换

第3关:计数器

第4关:复制字符数组

第5关:进制转换

第6关:回文判断

写在最后


写在开头

本文代码是我自己所作,可能部分代码不够简练,效率不高,但都能运行成功。本人水平有限,大家见谅,多多交流

正文

第1关:选择法排序

本关任务:使用选择法排序编写一个能为数组进行升序排序的程序。

根据提示,在右侧编辑器补充void inArray(int arr[],int n)void selectSort(int arr[],int n)void outArray(int arr[],int n)的函数定义,这三个函数的输入均是一个长度不大于100的无序数组arr,以及数组的长度n,请在函数selectSort中使用选择法对数组元素进行升序排序,函数inArray用于输入数组的n个元素,函数outArray用于输出数组的n个元素。

测试输入:

       5 //数组长度

       11 6 24 20 3 //数组的每个元素

预期输出:  3 6 11 20 24

#include<stdio.h>
void inArray(int arr[],int n)
{
    int i=0;
   for(i=0;i<n;i++)
   {
       scanf("%d",&arr[i]);
   }
}

void selectSort(int arr[],int n)
{
   int i,j,temp;
   for(i=0;i<n-1;i++)
   {
       for(j=i+1;j<n;j++)
       {
           if(arr[i]>arr[j])
           {
              temp=arr[i];
              arr[i]=arr[j];
              arr[j]=temp;
           }
       }
   }
}

void outArray(int arr[],int n)
{
   int i=0;
   for(i=0;i<n;i++)
   {
       printf("%d ",arr[i]);
   }

}

第2关:二分段交换

本关任务:输入n个整数到数组u中,再输入正整数k(0< k < n )k将数组un个元素划分为u[0],……,u[k-1]u[k],……,u[n-1]两段,将两段元素交换位置但仍然存放在数组u中,输出重新排列后的数组元素。

示例如下: 假设n=7k=3; 数组元素u[0],……,u[6]依次为1, 2, 3, 4, 5, 6, 7; 则被交换的两段元素是:u[0],……,u[6]交换的结果是4, 5, 6, 7, 1, 2, 3

测试输入:

                   7 //数组长度
                   1 2 3 4 5 6 7 //数组元素
                   3 //正整数k
预期输出: 4 5 6 7 1 2 3

#include<stdio.h>
void move(int arr[],int n,int k){
	/**********  Begin  **********/
    int i=0;
    int tmp;
    int j=k-1;
    int m=n-1;
    while(i<j)
    {
       tmp=arr[i];
       arr[i]=arr[j];
       arr[j]=tmp;
       i++;
       j--;
    }
    i=0;
    j=k;
    while(j<m)
    {
       tmp=arr[j];
       arr[j]=arr[m];
       arr[m]=tmp;
       j++;
       m--;
    }
    i=0;
    m=n-1;
    while(i<m)
    {
       tmp=arr[i];
       arr[i]=arr[m];
       arr[m]=tmp;
       i++;
       m--;
    }
	/**********  End  **********/
}

//1 2 3   4 5 6 7  原顺序

//3 2 1   4 5 6 7  前k个逆置
//3 2 1   7 6 5 4  后面逆置
//4 5 6   7 1 2 3  整体逆置

第3关:计数器

本关任务:编程统计输入的一段文字中每个数字字符、 每个英文字符(不区分大小写)和其他字符出现的次数(要求用数组元素作为每个数字字符、每个英文字符、和其他字符出现的次数的计数器)。

如:输入 12L C,统计的结果为:11121L1C,一个其他字符(空格)。

测试输入:hust is my home!2019!

预期输出:

0:1
1:1
2:1
9:1
E:1
H:2
I:1
M:2
O:1
S:2
T:1
U:1
Y:1
others:5
#include<stdio.h>
#include<ctype.h>
int main()
{
    /**********  Begin  **********/
    // [0-9]    digit
    // [10-35]  alpha
    // [36]     others
    char ch;
    int counter[37] = { 0 };//把37个空间全部赋0,方便计数
    while ((ch = getchar()) != '\n')
    {
        if (isdigit(ch))//不想用函数可以写成 if(ch>='0'&&ch<='9')
            counter[ch - '0']++;
        else if (isalpha(ch))//或者 if(toupper(ch)>='A'&&toupper(ch)<='Z'),toupper函数是小写转大写
            counter[toupper(ch) - 'A' + 10]++;
        else
            counter[36]++;//空格的情况
    }
    for (char ch = '0'; ch <= '9'; ch++)
        if (counter[ch - '0'])//这里很巧妙,如果某数没有出现,就不输出它的计数器
            printf("%c:%d\n", ch, counter[ch - '0']);
    for (char ch = 'A'; ch <= 'Z'; ch++)
        if (counter[ch - 'A' + 10])
            printf("%c:%d\n", ch, counter[ch - 'A' + 10]);
    if (counter[36]) printf("others:%d\n", counter[36]);
    /**********  End  **********/
    return 0;
}

第4关:复制字符数组

本关任务:编写函数strnCpy(t,s,n)

它将字符数组s中的前n个字符复制到字符数组t中,并形成字符串。

测试输入:

lang
9
预期输出:lang
#include<stdio.h> 
void strnCpy(char t[],char s[],int n)
{
	/**********  Begin  **********/
    int i=0;
    for(i=0;(s[i]!='\0')&&i<n;i++)
    {
    	t[i]=s[i];
	}
    t[i]='\0';
    //printf("%s",t);
	/**********  End  **********/
}

第5关:进制转换

本关任务:输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\0')结束转换。

1.测试输入:55 //程序的输入不会有十六进制的前缀

预期输出:85

2.测试输入:f1r2 //程序的输入不会有十六进制的前缀

预期输出:241

#include<stdio.h>
#include<string.h>
void conversion(char str[]) 
{
    /**********  Begin  **********/
    int i = 0, j=0,num = 0, sum = 0,len=0;
    //int len = strlen(str);//这种方法会将非16进制数记录在内
    while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
    {
        len++;
        i++;
    } //遍历数组记录16进制数的个数,非16进制数不计在内 
    i = 0;
    while (str[i] != '\0')
    {
        //字符转数字
        if (str[i] >= '0' && str[i] <= '9')
            num = str[i] - '0';
        else if (str[i] >= 'a' && str[i] <= 'f')
            num = str[i] - 'a' + 10;
        else if (str[i] >= 'A' && str[i] <= 'F')
            num = str[i] - 'A' + 10;
        else
            break;//遇到'\0'之前的第一个非十六进制数就停止循环
        for (j = 0; j < len - 1; j++)
        {
            num = num * 16;
        }
        sum += num;
        i++;
        len--;
    }
    printf("%d\n", sum);
    /**********  End  **********/
}

第6关:回文判断

本关任务:编写一个测试一个串是否为回文的递归函数,是回文,函数返回1;不是回文,返回0。并且在主函数中调用该函数,判断输入的字符串是否为回文串。

回文是正读和反读都一样的串,例如:“abcba”“otto”就是回文。主函数中若输入的字符串是回文,则输出“Yes”,否则输出“No”

测试输入:abcdedcba

预期输出:Yes

#include<stdio.h>
#include<string.h>
#define SIZE 100
/**** 在下面编写满足任务要求的递归函数isPalindrome,是回文返回1,不是返回0 *******/ 
/**********  Begin ***********/
int isPalindrome(char arr[],int len)
{
   int i=0;
   while(arr[i]==arr[len-1]&&i<len-1)
    {
        i++;
        len--;
    }
    if(i>=len-1) 
       return 1;
    else
       return -1;
}

/**********  End  **********/

int main()
{
	/**** 输入字符串,调用函数isPalindrome判断是否为回文串,然后输出结果 *******/ 
    /**********  Begin ***********/
    char arr[SIZE];
    scanf("%s",arr);
    int len=strlen(arr);
    int num=isPalindrome(arr,len);
    if(num==1)
       printf("Yes");
    else
       printf("No");
	/**********  End  **********/
	return 0;
}

写在最后

👍🏻点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值