简单指针编程

1.围圈报数问题

有n个人围成一圈,顺序排号。从第一人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序的运行示例如下:
请输入人数:30
30个人中最后留下的是第29号。

//指针法 
#include<stdio.h>
int main()
{
	int a[1000],n,i,t,count=0;
	printf("请输入人数:");
	scanf("%d",&n);
	t=n;     //t表示剩余人数,用人数控制循环结束时机
	for(i=1;i<=n;i++)
		*(a+i)=i;//给每个数编号
	for(i=1;i<=n;i++)
	{
		if(*(a+i)!=0)  //未退出圈子的进行计数 
			count++;
		if(count==3) //注意,不是 count%3==0 
		{
			*(a+i)=0;  //退出圈子的人,标记为0 
			count=0;  //count清零,重新计数 
			t--; //每退出一个,总人数就减少一个 
		}  
		if(i==n)  
			i=0;  //围成一圈---循环 
		if(t==1) //只剩一个人的时候,退出循环 
			break; 
	}
	for(i=1;i<=n;i++)
	{
		if(*(a+i)!=0)
			printf("%d个人中最后留下的是第%d号。",n,*(a+i));
	}	
	return 0;
} 

2.统计所有单词平均长度

写一个程序读入一条句子中的所有单词,并计算该语句中所有单词的平均长度。假定句子以换行结束,单词间用空格分隔,并且每个单词长度不超过25个字符。

**提示信息:"请输入一行字符:"
**输出格式要求:"总共有%d个单词,平均长度为%d\n"

#include <stdio.h>

int main ()
{
	char a[80];
	char *p=a;
	int space=0,all=0,word,len;
	printf("请输入一行字符:");
	gets(a);
	while(*p)
	{
		if (*p==' ')
		space++;
		p++;
		all++;
		
	}
	word=space+1;
	len=(all-space)/word;
	printf("总共有%d个单词,平均长度为%d\n",word,len);
	return 0;
}

3.将字符串倒序输出并使用递归

将字符串s倒序输出,要求利用函数递归实现。
/***输入格式要求:"%s" 提示信息:"input your string:\n"
**输出格式要求:"%c"
程序运行的输入输出样例:
屏幕先输出提示信息:
input your string:
然后用户键盘输入:
abcdefg   
最后屏幕输出:
gfedcba
 

#include<stdio.h>
#include<string.h>
void reverse(char s[]);

int main(void)
{
	char s[100];
	
	printf("input your string:\n");
	scanf("%s", s);
	reverse(s);
}
 
void reverse(char s[])
{
	int lenth = strlen(s);//计算字符串长度 即结束符之前长度 
    if (lenth == 1)//设置出口,当长度等于1时,打印出第一个字符
		printf("%c", s[0]);
	else
	{
		reverse(s + 1);//比如字符串s="abcdefg\0",s+1="bcdefg\0"
		printf("%c", s[0]);
	}
}

4.在一个字符串中找出最大的字符并放在第一个位置上,并将该字符前的原字符往后顺序移动

在一个字符串中找出最大的字符并放在第一个位置上,并将该字符前的原字符往后顺序移动,如:cbyab变成ycbab。
**输入格式要求:用gets读入
**输出格式要求:用puts输出
程序运行的输入输出样例:
输入为:
cbyab
输出为:
ycbab?

#include<stdio.h>


int main()
{
    char a[100];
    char *p=a;
    char *max=a;
    char *i=max;
    char q;
    
    gets(a);
    while(*p)
    {
        if(*max<*p)
        max=p;
        p++;
        
    }
    q=*max;//找出最大字符,并将其装入q中 

    for(i=max;i>=a;i--)
    {
        
        *i=*(i-1);
        
    }//移位 
    *a=q;//将q装入第一位 
    
    puts(a);
    
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值