给学妹写C程——中国海洋大学C语言程序设计课作业(三)

这次是第七章,关于函数以及字符串和数组

 

7_1 报数退出

【问题描述】m个人围成一圈,1,2,3循环报数,报到3的人退出,并将退出的序号依次存到数组p中,包括最后一个人的序号。输出最后退出的是原来的第几号(最初的序号,以1起始)。若m=6,则最后退出的是1号,退出的顺序是 : 3 6 4 2 5 1;若m=10,则最后退出的是4号,退出顺序是: 3 6 9 2 7 1 8 5 10 4;若m=100,则最后退出的是91号,退出顺序是: 3 6 9……100 58 91。

编写函数int fun(int m ,int  p[ ])实现上述功能,返回m个人中最后退出人的序号,并将退出的序号顺序写入p指向的数组中。在主函数中输入人数,调用fun后输出实参数组中保存的退出序号。每行输出10个数据。

本问题限定人数m不超过200人。

【输入形式】输入人数(不大于200的整数)

【输出形式】输出最后退出人的序号,以及退出的顺序

【样例输入1】Input numbe:6

【样例输出1】

Last exit person is 1

Exit order:

3 6 4 2 5 1

【样例输入2】Input numbe:100

【样例输出2】

Last exit person is 91

Exit order:

3 6 9 12 15 18 21 24 27 30

33 36 39 42 45 48 51 54 57 60

63 66 69 72 75 78 81 84 87 90

93 96 99 2 7 11 16 20 25 29

34 38 43 47 52 56 61 65 70 74

79 83 88 92 97 1 8 14 22 28

35 41 49 55 62 68 76 82 89 95

4 13 23 32 44 53 64 73 85 94

5 19 37 50 67 80 98 17 40 59

86 10 46 77 26 71 31 100 58 91

【样例说明】输入样例中下划线上是输入数据;输出时以1个空格分隔数据,每行输出10个数

# include<stdio.h>

int * fun(int m, int *p)
{
	int a[m];
	int i, po = 0;
	for (i = 0; i < m; i++)
		a[i] = i+1;
	int count = 0;
	int num_ans = 0;
	while(1)
	{
		int pp = po % m;
		po ++ ;
		if(a[pp] == 0)
		{
			continue;
		}
		count ++ ;
		if (count == 3)
		{
			count = 0;
			p[num_ans] = a[pp];
			num_ans ++ ;
			a[pp] = 0;
		}
		if (num_ans == m)
			break ;
	}
	return p;
}

int main()
{
	int m, i;
	printf("input:");
	scanf("%d", &m);
	int *pl;
	int p[m];
	pl = fun(m, p);
	printf("Last exit person is %d\n", *(pl+m-1));
	printf("Exit order:");
	for(i = 0; i < m; i++)
	{
		if(i%10 == 0)
			printf("\n");
		printf("%d ", *(pl + i));
	}
}

分析

这道题如果想的复杂一些,回想怎样把数组连接成一个环,其实完全可以每次遍历到最后一位置,再从头开始。

每次数到3,就把这个位置置为0,每次遇到0,就跳过

 

7_2 从数组中删除数据

【问题描述】

定义长度20的int数组,键盘读入20个1位数写入数组。键盘再输入一个要删除的数,从数组中删除此数。

编写函数int delnum(int a[20] , int n , int num),功能是:在数组a的前n个元素中,删除值为num的元素。删除后数组中剩余数据的个数作为函数的返回值返回。注意,要删除的数num在数组中可能不只一个。

从数组中删除一个数,所做的操作是该元素后面的各数据全部前移一个存储位置。

#include<stdio.h>

#define N 20

int delnum(int p[],int n,int num);

int main()

{

    int a[N],num,len,i,seed;

    printf("Input 20 num:");

    for(i=0;i<20;i++)           //给数组N个元素赋值 

        scanf("%d",&a[i]);

    puts("========array========");

    for(i=0;i<N;i++)           //输出数组中所有数据 

        printf("%d ",a[i]);

    puts("");

    printf("Please input delete num:");

    scanf("%d",&num);

    len=delnum(a,N,num);         //调用函数,删除数组a中的num,返回剩余数据个数

    puts("========array========");

    for(i=0;i<len;i++)          //输出删除后的数组数据

        printf("%d ",a[i]);     //注意,这里只输出len个数据

    puts("");

    return 0;

}

int delnum(int p[],int n,int num)
{
	int len = N;
	int *p2 = p;
	int i, j=0;
	for(i = 0; i < n; i++)
	{
		if(p2[i] == num)
		{
			p2[i] = -1;
			len -- ;
		}
	}
	for(i = 0; i < N; i++)
	{
		if(p2[i] != -1)
		{
			p[j] = p2[i];
			j ++ ;
		}
	}
	return len;
}

 

7_3 统计字符串中不同字符的个数

【问题描述】统计字符串str中不同字符的个数输出。

【输入形式】从标准输入中输入一个字符串

【输出形式】将生成的个数输出到标准输出中

【样例输入】One world,One dream!

【样例输出】13

【样例说明】统计包含标点符号和空格,大写和小写视为不同字符。

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

int main()
{
	char str[10000];
	char type[10000] ;
	int nums = 0;
	gets(str);
	int len = strlen(str);
	int i, j, flag;
	for(i = 0; i < len; i++)
	{
		flag = 0;
		for(j = 0; j < nums; j++)
		{
			if(type[j] == str[i])  // 该类型已记录
			{
				flag = 1;
				break ;
			}
		}
		if(flag == 0)
		{
			type[nums] = str[i];
			nums ++ ;
		}
	}
	printf("%d", nums);
}

分析

对于字符串的 输入,这里采用gets函数,建立一个数组存放每种字符,每遍历一个,就看一下是否已存在

 

7_4 十进制转二进制

【问题描述】实现十进制整数x到二进制的转换。输入一个十进制整数,将其转换为二进制数并以字符串形式存放于字符数组中并输出。

【输入形式】

从标准输入中输入一个整数

【输出形式】

将转换后的二进制数字符串输出

【样例输入1】

13

【样例输出1】

1101

【样例输入2】

-13

【样例输出2】

-1101

【样例输入3】

0

【样例输出3】

0

【样例说明】

考虑正数、负数和零的情况

# include<stdio.h>

int main()
{
	int a ;
	int bin[10000] ;
	int p = 0 ;
	int neg = 0 ;
	scanf("%d", &a);
	if(a == 0)
	{
		printf("0");
		return 0;
	}
	if(a < 0)
	{
		a = -a;
		neg = 1;
	}
	while(1)
	{
		int b = a % 2 ;
		a = a / 2 ;
		bin[p++] = b ;
		if(a == 0)
			break ;
	}
	int i;
	if(neg == 1)
			printf("-");
	for(i = p-1; i >= 0; i--)
	{
		printf("%d", bin[i]);
	}
	return 0;
}

分析

这道题考察了10进制与2进制转化过程:即除二取余,具体可百度。以及数组的输出。

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值