今天对昨天的字符数组进行实际数据编写
一、对一组字符串中的词组进行逆序
#include <stdio.h>
int len(char *pa) //计算数组长度
{
int len=0;
while(*(pa++))
{
len++;
}
return len;
}
void f(char *left,char *right) //单词逆序
{
while(left<right)
{
char temp=*right;
*right=*left;
*left=temp;
left++;
right--;
}
}
char *f1(char *pa)
{
if(pa == NULL)
return;
char *first=pa;
char *last=pa+len(pa)-1;
while(*pa) //找到空格前面的单词,将其单词的首位和末尾开始逆序
{
char *p1=pa; //p1是单词首位,pa是用了判断是否到空格,也就是单词的末尾
while(*pa != ' ' && *pa != '\0')
{
pa++;
}
f(p1,pa-1);
if (*pa != '\0')
{
pa++;
}
else //判断数组是否结束
break;
}
f(first,last); //将整个数组的单词逆序
return first;
}
int main()
{
char a[]="i am a good boy";
printf("%s\n",f1(a));
return 0;
}
编写思路:先利用2个指针找到数组的第一个位置和最后一个位置,将其中的所有单词进行逆序排列。在用一个新的指针指向数组开头,将其往后移,找到是空格并且不是‘\0’的位置,在将这空格前的所有单词逆序。
二、一个数如果恰好等于它的因子之和,这个数被成为”完数”,例如:6=1+2+3.请编程找出1000以内的完数
#include <stdio.h>
void f(int i,int j)
{
for(i=3;i<=1000;i++)
{
int sum=1;
for(j=2;j<i;j++)
{
if(i%j==0)
{
sum+=j;
}
}
if(sum == i)
{
printf("%d\n",i);
}
}
}
int main()
{
int i,j;
f(i,j);
return 0;
}
这题只要明白因数比原来的数,运用for循环将从2开始的数看是否能整出,找出因数。
三、编写程序,打印菱形星号组合(菱形中间空心)
#include <stdio.h>
void f(int n)
{
int i,j;
for(i=n;i>=-n;i--) //确定菱形的行数
{
int m=i;
if(m<0)
m=-m; //m<0是菱形下半部分
for(j=0;j<2*n+1;j++)
{
if((j == m) || (j == n*2-m)) //(j == m)是上半部分的‘*’, (j == n*2-m)是下半部分的‘*’
printf("*");
else
printf(" ");
}
printf("\n");
}
}
int main()
{
int n;
scanf("%d",&n);
f(n);
return 0;
}
思路:n是菱形上半部分和下半部分的行数,运用for循环打印出对应的‘*’位置。