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;
}