我写这道题时出了错误,char *p和char p[100]区别,
在c++编程中char *p 其实完整的写法是:const char *p,只读,不能对指针的内容进行修改,在常量区分配空间。
char p[100] 是在栈上面分配了一个100的空间 ,可读,可写。
1. 编写函数,实现字符串逆序
//编写函数,实现字符串逆序
#include <iostream>
using namespace std;
void str(char *x)
{
int n = strlen(x)-1;
char *p = x+n;
while(x<p)
{
char k = *x;
*x = *p;
*p = k;
x++;
p--;
}
}
void main()
{
char p[]="hello";
str(p);
cout<<p<<endl;
cin.get();
}
2. 编写一个c函数,将“I am from shanghai”,倒置为“shanghai from am I”,及将句子的单词位置倒置,而不改变单词内部结构
//编写一个c函数,将“I am from shanghai”倒置为“shanghai from am I”,及将句子的单词位置倒置,而不会改变单词内部结构
//思路:先将字符串中单词的倒置,再将字符串倒置
#include <iostream>
using namespace std;
void change(char *p)
{
int n = 0;
int length = strlen(p); //字符串的长度
for(int i = 0;i<length+1;i++)
{
//判断字符串中空格的位置,和结束的位置
if((*(p+i+1) ==' ')||(*(p+i+1) == '\0'))
{
//*(p+i+1)是判断当前位置后一位是否为空格或者指针结束的位置
int m = i;
//*(p+n)上一个空格的后一位即当前单词的首字母,*(p+m)当前单词的末字母
for(;n<m;n++,m--)
{
char temp = *(p+m);
*(p+m) = *(p+n);
*(p+n) = temp;
}
n = i+2;
}
*(p+i)是判断当前位置是否为空格或者指针结束的位置
//if(*(p+i) == ' '||*(p+i) == 0)
//{
*(p+n)上一个空格的后一位即当前单词的首字母,*(p+m)当前单词的末字母
// int m = i-1;
// for(;n<m;n++,m--)
// {
// char temp = *(p+m);
// *(p+m) = *(p+n);
// *(p+n) = temp;
// }
// n = i+1;
// }
}
//将字符串整体倒置
for(int i = 0;i<length; i++,length--)
{
char temp = *(p+length-1);
*(p+length-1) = *(p+i);
*(p+i) = temp;
}
}
void main()
{
char str[] ="I am from shanghai";
cout<<"正序:"<<str<<endl;
change(str);
cout<<"倒序:"<<str<<endl;
cin.get();
}
3. 写一个函数找出一个整数数组中,第二大的数
//写一个函数找出一个整数数组中,第二大的数
#include <iostream>
using namespace std;
int search(int *str)
{
int max = str[0];
int second = 0;
int i = 0;
while(str[i] != '\0')
{
if(second <=str[i])//比第二大
{
if(max <= str[i])//比第一大
{
//第二继承第一,第一继承str[i]
second = max;
max = str[i];
}
else//比第一小
second = str[i];
}
i++;
}
return second;
}
void main()
{
int str[100]={90,84,65,95,87};
int second = search(str);
cout<<second<<endl;
cin.get();
}
4. 通过编程实现输出2的1000次方
//通过编程实现输出2的1000次方
#include<iostream>
#define N 1000
using namespace std;
void count(int *num)
{
*num = 1;
int opt = 0;
for(int i = 0;i<N;i++)
{
for(int j = 0;j<999;j++)//将数组里面的每一位*2
{
*(num+j) *= 2;
}
for(int j = 0;j<999;j++)
{
//判断数组里面的每一位是否大于9,进位
if(*(num + j) > 9)
{
*(num +j+1) += 1;
*(num + j) %= 10;
}
}
}
for(int i = 998;i >= 0; i--)
{
if(num[i] != 0)
{
opt = 1;
}
if(opt == 1)
{
cout<<*(num+i);
}
}
cout<<endl;
}
void main()
{
int num[999];
memset(num,0,sizeof(num));//将数组里面的内容清0
count(num);
cin.get();
}
6.有一分数序列:1/2,1/4,1/6,1/8.....,用函数调用的方法,此数列前20项的和
//有一分数序列:1/2,1/4,1/6,1/8.....,用函数调用的方法,此数列前20项的和
//我用的递归的方法
#include <iostream>
using namespace std;
double num(double N)
{
if(N == 42)
{
return 0;
}
return 1/N + num(N+2);
}
void main()
{
double N = 2;
cout<<num(N)<<endl;
system("pause");
}