#include
void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a>b) swap(&a,&b);
if(a>c) swap(&a,&c); //第一个数a为最小的数
if(b>c) swap(&b,&c); //再找出第二小的数
printf("%d%d%d",a,b,c);
}
#include
#include
void swap(char* p1,char* p2){
char p[20];
strcpy(p,p1);
strcpy(p1,p2);
strcpy(p2,p);
}
int main(){
char str1[20],str2[20],str3[20];
printf("input three line:\n");
gets(str1);
gets(str2);
gets(str3);
if(strcmp(str1,str2)>0) swap(str1,str2);
if(strcmp(str1,str3)>0) swap(str1,str3);
if(strcmp(str2,str3)>0) swap(str2,str3);
printf("now,this order is:\n");
printf("%s\n%s\n%s\n",str1,str2,str3);
}
#include
void max_min_value(int* a){
int *min,*max,*p,temp;
max = min = a;
for(p = a;p < a+10;p++)
if(*p > *max) max = p;//找最大
temp = a[9];a[9] = *max;*max = temp;
for(p = a;p < a+10;p++)
if(*p < *min) min = p;//找最小
temp = a[0];a[0] = *min;*min = temp;
}
int main(){
int a[10] = {32,24,56,78,1,98,36,44,29,6};
max_min_value(a);
for(int i = 0 ;i < 10;i++){
printf("%-3d",a[i]);
}
}
1 2 3 4 5 移动2位
4 5 1 2 3
#include<stdio.h>
//法1:借用指针+递归
void move1(int a[],int n,int m){
int *p,a_end;
a_end = *(a+n-1); //保存最后一个元素的值
for(p = a+n-1;p > a;p--)
*p = *(p-1); //整个数组向后移动一位
*p = a_end; //给第一个元素赋值为变化前最后一个元素
m--; //一趟向后移动一位 m-1
if(m > 0) move1(a,n,m); //递归调用
}
//法二:利用新数组
void move2(int a[],int n,int m){
int b[5],*p;
for(int i = 0;i < 5;i++){
b[ (i+m)%n ] = a[i]; //求模赋值
}
for(int i = 0;i < 5;i++){
*(a+i) = *(b+i);
// printf("%-3d",a[i]);
}
}
int main(){
int a[5] = {1,2,3,4,5};
// move1(a,5,2);
// for(int i = 0;i < 5;i++)
// printf("%-3d",a[i]);
move2(a,5,2);
for(int i = 0;i < 5;i++)
printf("%-3d",a[i]);
}
#include
int main(){
int num[50],k,i,n,m,*p;
printf("请输总共有多少人:\n");
scanf("%d",&n);
p = num;
for(i = 0;i < n;i++)
*(p+i) = i+1; //1到n编号
i = 0; //i为每次循环时计数变量
k = 0; //k为按1,2,3报数时的计数变量
m = 0; //m为退出人数
while(m < n-1){ //当退出人数比n-1少时(既未退出人数大于1时)执行循环体
if( *(p+i) != 0 ) k++;
if(k == 3){
*(p+i) = 0; //退出的人编号置为0
printf("%d号淘汰\n",i+1);
k = 0;
m++; //淘汰人数加1
}
i++;
if(i == n) i=0; //报数到尾后,i回复为0
}
while(*p == 0) p++;
printf("最后剩下的元素为: %d\n",*p);
return 0;
}
#include
int strlen(char *s){//求字符串长度
printf("strlen\n");
int len = 0;
char *p = s;
while(*p != '\0'){ //报错 p != '\0'
p++;
len++;
}
return len;
}
int main(){
char s[20];
gets(s); //输入字符串
//puts(s);
int len = strlen(s);
printf("s的长度为:%d\n",len);
}
#include
#include
void copystr(char* p1,char* p2,int m);
int main(){
char str1[20],str2[20];
int m;
printf("请输入要复制字符串:\n");
gets(str1);
printf("请输入从第几位开始复制\n");
scanf("%d",&m);
if(strlen(str1) < m)
printf("输入有误\n");
else{
copystr(str1,str2,m);
printf("复制后的字符串为:\n");
printf("%s",str2
);
}
}
void copystr(char* p1,char* p2,int m){
printf("copystr~~~\n");
int n=0;
while(n < m-1){
n++;
p1++;
}
while(*p1 != '\0'){
*p2 = *p1;
p1++;
p2++;
}
*p2 = '\0';
}
#include
int main(){
int upper=0,lower=0,digit=0,space=0,other=0,i=0;
char *p,s[20];
printf("input string: ");
while( ( s[i]=getchar() )!='\n') i++;
p = s;
while(*p != '\n'){
if( (*p >= 'A')&&(*p <= 'Z') )
++upper;
else if((*p >= 'a')&&(*p <= 'z'))
++lower;
else if(*p == ' ')
++space;
else if((*p >='0' )&&(*p <='9'))
++digit;
else
other++;
p++;
}
printf("upper case:%d lower case:%d",upper,lower);
printf(" space case:%d digit case :%d other case:%d\n",space,digit,other);
}
#include
//a[i][j]的地址是p+3*i+j
//a[j][i]的地址是p+3*j+i
//a[i][j] a[j][i]地址相同
void move(int *p){
int i,j,t;
for(i = 0;i < 3;i++){
for(j = i;j < 3;j++){ //j=i 不是 j=0
t = *(p+3*i+j);
*(p+3*i+j) = *(p+3*j+i);
*(p+3*j+i) = t;
}
}
}
void move2(int a[][3]){
int i,j,t;
for(i = 0;i < 3;i++){
for(j = i;j < 3;j++){ //j=i 不是 j=0
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
}
int main(){
int i,j,*p;
int a[3][3]={1,2,3,4,5,6,7,8,9};
p = &a[0][0];
for(i = 0;i < 3;i++){
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
//move(p);
move2(a);
printf("变化后\n");
for(i = 0;i < 3;i++){
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
}
#include
void change(int *p){
int i,j,temp;
int *max,*min;
max = min = p;
for(i = 0;i < 5;i++){
for(j = 0;j < 5;j++){
if(*max < *(p+5*i+j)) max = p+5*i+j;
if(*min > *(p+5*i+j)) min = p+5*i+j;
}
}
temp = *(p+12); //将最大值与中间元素互换
*(p+12) = *max;
*max = temp;
temp = *p; //将最小值与左上角元素互换
*p = *min;
*min = temp;
min = p+1; //将a[0][1]的最地址给min,从该位置开始找最小的值
for(i = 0;i < 5;i++){
for(j = 0;j < 5;j++){
if(i == 0 && j == 0) continue;
if(*min > *(p+5*i+j)) min = p+5*i+j;
}
}
temp = *min; //将第二小的值跟右上角的互换
*min = *(p+4);
*(p+4) = temp;
min = p + 1; //找到第三小的值
for(i = 0;i < 5;i++){
for(j = 0;j < 5;j++){
if((i==0 && j==0)||(i==0 && j==4)) continue;
if(*min > *(p+5*i+j)) min = p+5*i+j;
}
}
temp = *min; //将第三小的值跟左下角的互换
*min = *(p+20);
*(p+20) = temp;
min = p + 1; //找到第四小的值
for(i = 0;i < 5;i++){
for(j = 0;j < 5;j++){
if((i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0)) continue;
if(*min > *(p+5*i+j)) min = p+5*i+j;
}
}
temp = *min; //将第四小的值跟右下角的互换
*min = *(p+24);
*(p+24) = temp;
}
int main(){
int a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
int i,j,*p;
p = &a[0][0];
change(p);
//打印变化后的数组
for(i = 0;i < 5;i++){
for(j = 0;j < 5;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
}
#include
#include
void sort(char s[3][6]){ //形参s是指向6个元素一组的指针
int i,j;
char *p,temp[10]; //temp为临时容器长度要大于6
p = temp;
//字符串版的冒泡排序 由于下面if是s[j]与s[j+1]比较所有i不能到3否则数组会溢出
for(i = 0;i < 2;i++){
for(j = 0;j < 2-i;j++){
if(strcmp(s[j],s[j+1])>0){
//以下三行是将s[j]指向的一维数组与s[j+1]指向的一维数组的内容互换
strcpy(p,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],p);
}
}
}
}
int main(){
int i;
char str[3][6]; //主要是算法数组大小无所谓
printf("输入3个长度为6的字符串\n");
for(i = 0;i < 3;i++)
scanf("%s",str[i]);
sort(str);
printf("排序后为:\n");
for(i = 0;i < 3;i++)
printf("%s\n",str[i]);
return 0;
}
#include
#include
void sort(char *s[]){
int i,j;
char *temp; //temp为临时容器长度要大于6
//字符串版的冒泡排序
for(i = 0;i < 4;i++){
for(j = 0;j < 4-i;j++){
if(strcmp(*(s+j),*(s+j+1))>0){
temp = *(s+j);
*(s+j) = *(s+j+1);
*(s+j+1) = temp;
}
}
}
}
int main(){
int i;
char *p[5],str[5][20]; //主要是算法,数组大小无所谓
for(i = 0;i < 5;i++)
p[i]=str[i]; //将第i个字符的首地址赋予指针数组p的第i个元素
printf("输入5个字符串\n");
for(i = 0;i < 5;i++)
scanf("%s",p[i]);
//sort(p);
printf("排序后为:\n");
for(i = 0;i < 5;i++)
printf("%s\n",p[i]);
return 0;
}
说明:sin,cos,exp已在系统的数学函数库中.
#include
#include
int main()
{float integral(float(*)(float),float,float,int);//对integarl函数的声明
float fsin(float); //对fsin函数的声明
float fcos(float); //对fcos函数的声明
float fexp(float); //对fexp函数的声明
float a1,b1,a2,b2,a3,b3,c,(*p)(float);
int n=20;
printf("input a1,b1:");
scanf("%f,%f",&a1,&b1);
printf("input a2,b2:");
scanf("%f,%f",&a2,&b2);
printf("input a3,b3:");
scanf("%f,%f",&a3,&b3);
p=fsin;
c=integral(p,a1,b1,n);
printf("The integral of sin(x) is:%f\n",c);
p=fcos;
c=integral(p,a2,b2,n);
printf("The integral of cos(x) is:%f\n",c);
p=fexp;
c=integral(p,a3,b3,n);
printf("The integral of exp(x) is:%f\n",c);
return 0;
}
float integral(float(*p)(float),float a,float b,int n)
{int i;
float x,h,s;
h=(b-a)/n;
x=a;
s=0;
for(i=1;i<=n;i++)
{x=x+h;
s=s+(*p)(x)*h;
}
return(s);
}
float fsin(float x)
{return sin(x);}
float fcos(float x)
{return cos(x);}
float fexp(float x)
{return exp(x);}
#include
void sort(char* p,int m){
int i;
char temp,*p1,*p2; //双指针,一头一尾同时工作,替换值
for(i=0;i<m/2;i++){ //i只到m的中间
p1 = p+i;//从头到中间
p2 = p+(m-1-i);//从尾到中间
temp = *p1; //首尾交换
*p1 = *p2;
*p2 = temp;
}
}
int main(){
int i,n;
char *p,num[20];
printf("input n:");
scanf("%d",&n);
printf("input this numbers:\n");
for(i=0;i<n;i++){ //i要从0开始
scanf("%d",&num[i]);
}
p = &num[0];
sort(p,n);
for(i=0;i<n;i++){
printf("%d ",num[i]);
}
}
#include
/*
输入课程
English
computer
math
physics
chemistry
输入成绩
101 34 56 88 99 89
102 27 88 99 67 78
103 99 90 87 86 89
104 78 89 99 56 77
*/
void avsco(float *,float *); // 求每个学生的平均成绩的函数
void avcour1(char (*)[10],float *); // 求第一课程的平均成绩的函数
void fali2(char course[5][10],int num[],float *pscore,float aver[4]); // 找两门以上课程不及格的学生的函数
void good(char course[5][10],int num[4],float *pscore,float aver[4]); //满足③
int main()
{
int i,j,*pnum,num[4];
float score[4][5],aver[4],*pscore,*paver;
char course[5][10],(*pcourse)[10];
printf("input course:\n");
pcourse=course;
for (i=0;i<5;i++)
scanf("%s",course[i]);
printf("input NO. and scores:\n");
printf("NO.");
for (i=0;i<5;i++)
printf(",%s",course[i]);
printf("\n");
pscore=&score[0][0];
pnum=&num[0];
for (i=0;i<4;i++)
{
scanf("%d",pnum+i); //pnum记录学号 num[i][0]
for (j=0;j<5;j++)
scanf("%f",pscore+5*i+j); //pscore 记录分数
}
paver=&aver[0];
printf("\n\n");
avsco(pscore,paver); // 求出每个学生的平均成绩
avcour1(pcourse,pscore); // 求出第一门课的平均成绩 (pcourse指向课程数组)
printf("\n\n");
fali2(pcourse,pnum,pscore,paver); // 找出2门课不及格的学生
printf("\n\n");
good(pcourse,pnum,pscore,paver); // 找出成绩好的学生
return 0;
}
void avsco(float *pscore,float *paver) // 求每个学生的平均成绩的函数
{
int i,j;
float sum,average;
for (i=0;i<4;i++)
{
sum=0.0;
for (j=0;j<5;j++)
sum=sum+(*(pscore+5*i+j)); //累计每个学生的各科成绩
average=sum/5; //计算平均成绩
*(paver+i)=average; //paver是存每个学生平均成绩的数组
}
}
//char (*pcourse)[10]:是一个数组指针,这个指针是指向一个度大小为10的字符数组;
void avcour1(char (*pcourse)[10],float *pscore) // 求第一课程的平均成绩的函数
{int i;
float sum,average1;
sum=0.0;
for (i=0;i<4;i++)
sum=sum+(*(pscore+5*i)); //累计每个学生的得分 sum最终为第一列值的和
average1=sum/4; //计算平均成绩
printf("course 1:%s average score:%7.2f\n",*pcourse,average1);
}
void fali2(char course[5][10],int num[],float *pscore,float aver[4])
// 找两门以上课程不及格的学生的函数
{
int i,j,k,labe1;
printf(" ==========Student who is fail in two courses======= \n");
printf("NO. ");
for (i=0;i<5;i++)
printf("%11s",course[i]);
printf(" average\n");
for (i=0;i<4;i++)
{
labe1=0; //记录不及格的科目数
for (j=0;j<5;j++)
if (*(pscore+5*i+j)<60.0) labe1++;
if (labe1>=2)
{
printf("%d",num[i]);
for (k=0;k<5;k++)
printf("%11.2f",*(pscore+5*i+k)); //输出有两门不及格学号的所有成绩
printf("%11.2f\n",aver[i]); //直接输出之前记录下的平均值
}
}
}
void good(char course[5][10],int num[4],float *pscore,float aver[4])
// 找成绩优秀学生(各门85以上或平均90分以上)的函数
{
int i,j,k,n;
printf(" ======Students whose score is good======\n");
printf("NO. ");
for (i=0;i<5;i++)
printf("%11s",course[i]);
printf(" average\n");
for (i=0;i<4;i++)
{n=0;
for (j=0;j<5;j++)
if (*(pscore+5*i+j)>85.0) n++;
if ((n==5)||(aver[i]>=90))
{printf("%d",num[i]);
for (k=0;k<5;k++)
printf("%11.2f",*(pscore+5*i+k));
printf("%11.2f\n",aver[i]);
}
}
}
a123x456 17960? 302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123存入在a[0],456存放在a[1]……统计共有多少整数,并输出这些数。
#include
int main()
{
char str[50],*pstr;
int i,j,k,m,e10,digit,ndigit,a[10],*pa;
printf("input a string:\n");
gets(str);
pstr=&str[0]; /*字符指针pstr置于数组str 首地址*/
pa=&a[0]; /*指针pa置于a数组首地址*/
ndigit=0; /*ndigit代表有多少个整数*/
i=0; /*代表字符串中的第几个字符*/
j=0; /*记录数字连续的个数*/
while(*(pstr+i)!='\0')
{if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
j++;
else
{if (j>0)
{digit=*(pstr+i-1)-48; /*将个数位赋予digit,字符 0对应的ascii码为 48*/
k=1;
while (k<j) /*将含有两位以上数的其它位的数值累计于digit*/
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; /*e10代表 该位数所应乘的因子*/
digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值\累加于digit*/
k++; /*位数K自增*/
}
*pa=digit; /*将数值赋予数组a*/
ndigit++;
pa++; /*指针pa指向a数组下一元素*/
j=0;
}
}
i++;
}
if (j>0) /*以数字结尾字符串 j还是>0不能处理,或者是全是数字的情况下 j也是 >0*/
{digit=*(pstr+i-1)-48; /*将个数位赋予digit*/
k=1;
while (k<j) /* 将含有两位以上数的其它位的数值累加于digit*/
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; /*e10代表位数所应乘的因子*/
digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值累加于digit*/
k++; /*位数K自增*/
}
*pa=digit; /*将数值赋予数组a*/
ndigit++;
j=0;
}
printf("There are %d numbers in this line, they are:\n",ndigit);
j=0;
pa=&a[0];
for (j=0;j<ndigit;j++) /*打印数据*/
printf("%d ",*(pa+j));
printf("\n");
return 0;
}
#include
int mystrcmp(char *p1,char *p2){
int i = 0;
while( *(p1+i) == *(p2+i) )
if( *(p1+i++) == '\0' ) return 0; //相等时返回结果0
return (*(p1+i) - *(p2+i)); //不等时返回第一个结果不相等字符的差值
}
int main(){
int m;
char str1[20],str2[20],*p1,*p2;
printf("请输入两串字符串\n");
gets(str1);
gets(str2);
p1 = str1;
p2 = str2;
m = mystrcmp(p1,p2);
printf("%d",m);
}
#include
/*
void someFunc(char *someStr);
再看这个函数调用:
someFunc("I'm a string!");
把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。
为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。
而理论上,我们传给函数的字面常量是没法被修改的。
所以说,比较和理的办法是把参数类型修改为const char *。
这个类型说背后的含义是:给我个字符串,我只要读取它。
*/
int main()
{
const char * month[13]={"illegal","January", "Februray", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"};
int n;
printf("Please enter month: \n");
scanf("%d", &n);
if ( (n <= 12) && (n >= 1) )
printf("It is %s.\n",*(month+n));
else{
printf("Error!\nPlease enter month: ");
scanf("%d", &n);
//output(m, month);
}
return 0;
}
new为关键字自己写函数不要用这个new命名
#include
#define NEWSIZE 1000 //指定开辟存储区的最大容量
int newbuf[NEWSIZE]; //定义字符串数组newbuf
int *newp = newbuf; //定义指针变量newp,指向存储区的始 端
int* my_new(int n){ //定义开辟存储区的函数new,开辟数组后返回指针
if(newp+n <= newbuf+1000){ //开辟区未超过newbuf数组的大小
newp += n; //newp指向存储区末尾
return newp-n; //返回首地址
}
else
return NULL; //存储区不够分配时,返回一个空指针
}
void my_free(int *p){ //释放存区函数
if(p >= newbuf && p<newbuf+1000)
newp = p;
}
int main(){
int *p = my_new(5);
for(int i=0;i<5;i++){
p[i]=i;
}
my_free(p); //让newp回到初始位置
for(int i=0;i<5;i++){
printf("%d\n",newp[i]); //此时newp的位置等于 p[0]
}
}
/* 测试数据
China
America
India
Philippines
Canada
排序后输出为:
America
Canada
China
India
Philippines
AZZ
B
C
D
E
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
void sort(char **p) //冒泡排序交换字符串
{
char **q, **s, *t;
for (q = p; q < p + 4; q++)
{
for (s = p+4; s > q; s--)
{
if (strcmp(*q, *s) > 0)
{
printf("*q_初始地址=%d\n",*q);
printf("*s_初始地址=%d\n",*s);
printf("\n");
printf("*q_字符串=%s\n",*q);
printf("*s_字符串=%s\n",*s);
printf("\n");
t = *q;
*q = *s;
*s = t;
printf("*q_排序后地址=%d\n",*q);
printf("*s_排序后=%d\n",*s);
printf("\n");
printf("*q_排序后值=%s\n",*q);
printf("*s_排序后值=%s\n",*s);
printf("\n");
}
}
for (int i = 0; i < 5; i++)
{
printf("*p[%d]=%s\n",i, *(p+i) );
}
printf("\n");
}
}
int main()
{
char *a[5], **p;
char b[5][100];
int i;
for (i = 0; i < 5; i++)
a[i] = b[i]; //将第i个字符串的首地址赋值予指针数组a的第i个元素
printf("请依次输入五个字符串:\n");
for (i = 0; i < 5; i++)
scanf("%s", a[i]);
p = a;
sort(p);
printf("排序后输出为:\n");
for (i = 0; i < 5; i++)
{
printf("%s\n", a[i]);
}
system("pause");
return 0;
}
#include
void sort(int **p,int n){
int i,j,*temp;
for(i = 0;i < n-1;i++)
for(j = n-1;j > i;j--){
if( **(p+j-1) > **(p+j) ){ //*p表示数组的地址,* *p表示取数组地址的值.
temp = *(p+j-1);
*(p+j-1) = *(p+j);
*(p+j) = temp;
}
}
}
int main(){
int i,n,*pstr[20],**p;
int a[20]={34,98,56,12,22,65,1};//n=7
printf("请输入n:\n");
scanf("%d",&n);
printf("排序前:\n");
for(i = 0;i < n;i++){
pstr[i] = &a[i];
printf("%d ",a[i]);
}
p = pstr;
sort(p,n); //改变的是指针数组*pstr[]里面存放 a[]数组的地址 的顺序
printf("\n排序后:\n");
for(i = 0;i < n;i++)
printf("%d ",*pstr[i]);
//printf("%d ",a[i]); //a[i]数组的值位置没有发生变化
}