1、输入三个数字,输出最大值
#include<stdio.h>
int main()
{int a,b,c;
int max;
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
{
if(a>c)
{
max=a;
}
else
max=c;
}
else
{
if(b>c)
{
max=b;
}
else
max=c;
}
printf("max=%d",max);
return 0;
}
2、输入任意数字、当输入-1时结束输入,求这些数字的平均数
3、依次输入10个数,要求输出其中的最大数。
4、求两个数的最大公约数
5、有三个数要求按大小的顺序输出
6将100-200之间的素数输出
7、数值常量也就是常数。
x/=y+3 ====>>x=x/(y+3)
格式字符用于输出有符号的
十进制整数
putchar输出单个字符一条语句输出一个字符
getchar输入一个字符
在使用sqrt()等数学函数时,需要在头文件中,加入#include<math.h>
scanf语句做输入时,分号内不留空格。如scanf("%lf%lf%lf",&a,&b,&c);
8、两个数字从小到大排列,===》可以延伸到三个数字的排列
示例程序如;
#include<stdio.h>
int main()
{
float a=0,b=0,t;
scanf("%f%f",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
printf("%f,%f",a,b);
}
else
printf("%f,%f",a,b);
return 0;
}
9、a=3,b=2,c=1;f=a>b>c;该表达式最后结果f=1;关系运算的优先级较高,且自左向右执行。
10、与或非 (&& || !) 双目运算符 优先顺序为从低到高为:赋值运算符、&&和||、关系运算符、算术运算符、!(非)
定义逻辑变量用到_Bool,
11、max=(a>b)?a:b; 如果a>b为真,则表达式的值为max=a;否则为b 。 表达式1:?表达式2:表达式3
12、循环输入50个学生的成绩,求出每位学生的平均成绩
#include<stdio.h>
int main()
{
float score1,score2,score3,score4,score5,aver;
int i=1;
while(i<=50)
{
scanf("%f,%f,%f,%f,%f",&score1,&score2,&score3,&score4,&score5);
aver=1.0*(score1+score2+score3+score4+score5)/5;
printf("aver=%7.2f",aver);
i++;
}
return 0;
}
double输出浮点数,%lf long输出时,%ld
sizeof为静态的. double a; sizeof(a+1.0)=8 a=6; sizeof(a++)=6而不是7
unsigned,没有负数的部分。。。。类型输出格式为%u %o八进制 %x十六进制 %e科学计数 %.30f输出小数点后30位
nan不存在的浮点数 inf表示无穷大
fab()求绝对值的函数,记得在头 文件中加#include<math.h>
1为1,'1’为49,asci码 \t制表符
char short int long longlong
int float double 为由小变大
强制转换(类型)值 比如:(int)10.2 (short)32 (short)32768注意安全性,short最大表示32767 强制类型转换的优先级高于四则运算
#include<stdbool.h> 之后可以使用bool false ture 比如:
#include<stdio.h>
#include<stdbool.h>
int main()
{
bool b=6>5;
bool t=ture;
t=2;
printf("%d",b);
return 0;
}
优先级 !>&&>|| 逻辑运算自左向右
函数调用 求和
#include<stdio.h>
void sum(int begin,int end)
{ int i;
int sum=0;
for(i=begin;i<=end;i++)
{
sum=sum+i;
}
printf("sum=%d\n",sum);
}
int main()
{
sum(1,10);
sum(10,20);
sum(20,30);
return 0;
}
#include<stdio.h>
void chwwr()
{
printf("我爱海大\n");
}
int main()
{
chwwr();
return 0;
}
#include<stdio.h>
void swap(int x,int y)
{
int t;
t=x;
x=y;
y=t;
printf("%d,%d",x,y);
}
int main()
{
int a=5;
int b=6;
scanf("%d,%d",&a,&b);
swap(a,b);
return 0;
}
比较四个数的大小
#include<stdio.h>
int main()
{ int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("请输入四个数:");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d",max);
return 0;
}
int max4(int a,int b,int c,int d)
{
int max2(int a,int b);
int max;
max=max2(a,b);
max=max2(max,c);
max=max2(max,d);
return max;
}
int max2(int a,int b)
{
if(a>=b)
return a;
else
return b;
}
阶乘用到的递归
#include<stdio.h>
int main()
{
int jiecheng(int n);
int n;
scanf("%d",&n);
printf("%d的阶乘为%d",n,jiecheng(n));
return 0;
}
int jiecheng(int n)
{
int c;
if(n==1||n==0)
c=1;
else
{
c=jiecheng(n-1)*n;
}
return c;
}
数组数组
#include<stdio.h>
int main()
{
int x;
double sum=0;
int cnt=0;
int number[100];
scanf("%d",&x);
while(x!=-1)
{
number[cnt]=x;
sum+=x;
cnt++;
scanf("%d",&x);
}
if(cnt>0)
{
int i;
double average=sum/cnt;
for(i=0;i<cnt;i++)
{
if(number[i]>average)
{
printf("%d",number[i]);
}
}
}
return 0;
}
*point1=100,这是一种错误的写法,因为point1为指针变量,100为整数而非变量。 *p表示指针p指向的对象
C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”,用指针变量作参数同样要遵循这一原则。不可能通过执行调用函数来改变实参指针变量的值,但可以改变实参指针所指变量的值。。
#include<stdio.h>
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void exchange(int *q1,int *q2,int *q3)
{ void swap(int *p1,int *p2);
if(*q1<*q2)
swap(q1,q2);
if(*q1<*q3)
swap(q1,q3);
if(*q2<*q3)
swap(q2,q3);
}
int main ()
{
int *point1,*point2,*point3;
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
point1=&a;
point2=&b;
point3=&c;
exchange(point1,point2,point3);
printf("max=%d,med=%d,min=%d",*point1,*point2,*point3);
return 0;
}
数组指针的定义,,int*p=&a[0]等价于int *p;p=&a[0]这两条语句
数组中for循环scanf输入后,指针的指向为数组的最后一个元素,,有时需要重新进行指向定义。
p++,因为和++为相同的优先级,结合方向按照自右向左,(p++),先输出p的值,再进行p+1
(p++)和(++p)不同,第一个执行为a[0],第二个执行完为a[1]
*(arr+i)和arr[i]等价
四个等价 int sum(int *ar,int n);
int sum(int *,int);
int sum(int ar[],int n);
int sum(int [],int);
数组变量本身表达地址,所以,int a[10];int *p=a;//无需用&取地址
但是数组的单元表达的是变量,需要用&取地址
a==&a[0]
[]运算符可以对数组做,也可以对指针做;
p[0]==>a[0]
指针是const 表示一旦得到某个变量的地址,不能再指向其他变量
int *const q=&i;//q是const
q=26;//OK
q++;/ERROR
所指的是const 表示不能通过这个指针去修改那个变量并不能使得那个变量成为const const intp=&i;
*p=26;//ERROR!(*p)是const
i=26;//ok
p=&j;//ok
p=&a[0]; 则:等价于p=a;
注意:数组名a不代表整个数组,上述“p=a;”的作用是把a数组的首元素的地址赋给指针变量p,而不是把数组a各元素的值赋给p;
在定义指针变量时可以对它赋予初值:
int *p=&a[0]; 或int *p=a;
等效于下面两行:
int *p;
p=&a[0]; 或 p=a; /不是p=&a[0]; */
因此,如果
int a[10],*p;
p=a;
则有以下关系:
(1) p+i 等价? a+i 等价? &a[i]。
(2) *(p+i) 等价? *(a+i) 等价? a[i]。
(3) 指向数组元素的指针变量也可带下标:
p[i] 等价? (p+i) 。
即有(p+i) 等价? *(a+i) 等价? a[i] 等价? p[i]
指针变量可以实现使本身的值改变,数组名不可以。
例: p++正确 a++不正确
(p++)与(++p)作用不同,前者先取*p,后使p加1; 后者相反
(*p)++表示p所指向的元素值加1
若p当前指向a数组第i个元素,则:
(p–)相当于a[i–],先取p值作""运算,再使p自减;
(++p)相当于a[++i],先使p自加,再作""运算;
(–p)相当于a[–i],先使p自减,再作""运算。
实参传递给形参是实参数组的首地址
实际上,形参数组名就是一个指针变量
int sum(int arr[],int n)等价于
int sum(int * arr,int n)
p=a; sort(p,10); sort(a,10);也行
int q[ ] 等价int *q
访问二维数组 printf("%3d", (p+i3+j) );//第二个3表示二维数组的列数,也就是输入i,j输出对应的二维数组元素
如果有如下定义:
int a[4][5];
int * p;p=&a[0][0];
问题:
p+11是哪个数据元素的地址。答案:&a[2][1] 总结:p+i是&a[i/5][i%5] 其中5是二维数组的列数
对二维数组而言
a代表的是首行(即第0行)的首地址
a+1代表的是第1行的首地址
a+2代表的是第2行的首地址
例题、将一个二维数组a[4][5]进行按行全排序
#include<stdio.h>
void sort(int *p,int n);
main()
{ int a[4][5]={1,4,2,3,7,6,9,10,8,-1,
-2,-6,-4,4,2,7,6,9,11,14};
int i,j;
for(i=0;i<4;i++)
{ for(j=0;j<5;j++)
printf("%4d",a[i][j]);
printf("\n");
}
sort(&a[0][0],4*5);
for(i=0;i<4;i++)
{ for(j=0;j<5;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
void sort(int *p,int n)
{ int i,j,t,k;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<=n-1;j++)
if(*(p+k)<*(p+j))
k=j;
if (k!=i)
{ t=*(p+i); *(p+i)=*(p+k);
*(p+k)=t; }
}
}
动态空间分配
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int number;
int i;
int* a;
printf("请输入number:");
scanf("%d",&number);
a=(int*)malloc(number*sizeof(int));
for(i=0;i<=number-1;i++)
scanf("%d",&a[i]);
for(i=number-1;i>=0;i--)
printf("%d ",a[i]);
free(a);
return 0;
}
字符串函数头文件#include<string.h>有很多处理字符串的函数
字符串变量
char *str=“hello”;
char word[]=“hello”;
char line[10]=“hello”; “hello"字符串常量,数组长度为6.
安全输入 char string[8] scanf(”%7d",string);在%和s之间表示最多允许读入的字符的数量,这个数字应该比数组的大小小1
#include<stdio.h>
int main()
{
int ch;
while((ch=getchar())!=EOF)
{
putchar(ch);
}
return 0;
}
字符串长度程序
#include<stdio.h>
#include<string.h>
size_t mylen(const char* s)
{
int idx=0;
while(s[idx]!='\0')
{
idx++;
}
return idx;
}
int main()
{
char ch[]="hello";
printf("%d\n",mylen(ch));
printf("%d\n",sizeof(ch));
return 0;
}
比较两个字符串
#include<stdio.h>
#include<string.h>
int mycmp(const char* s1,const char* s2)
{
while(*s1==*s2 && *s1!='\0')
{
s1++;
s2++;
}
return *s1-*s2;
}
int main()
{ char s1[]="abc";
char s2[]="abc";
printf("%d\n",mycmp(s1,s2));
return 0;
}
str=“i love china”//此赋值为非法,str为数组,
str[]=“i love china”//为非法,不能对数组的全部元素赋值。
char str[]="i love china"为合法
char *a,str[10];//定义了字符指针变量,和字符数组str
a=str;//使a指向str数组的首元素
scanf("%s",a);//从键盘输入一个字符串存放到a所指向的一段存储单元中,正确
char a[]=“house”;//字符数组a初始化 char *b=“house”;//字符指针变量b指向字符串常量的第一个字符
a[2]=‘r’;//合法,r取代a数组元素a[2]的原始值u
b[2]=‘r’;//非法,字符串常量不能被改变
结构体类型
#include<stdio.h>
int main(int argc,char const *argv[])
{
struct date
{
int mouth;
int day;
int year;
};
struct date today;
today.mouth=8;
today.day=31;
today.year=2019;
printf("Today is date is %d-%d-%d",today.year,today.mouth,today.day);
return 0;
}
#include<stdio.h>
struct date
{
int mouth;
int day;
int year;
};
int main()
{
struct date today;//定义today
today=(struct date){8,31,2019};
struct date day;//定义day
day=today;
printf("Today is date is %d-%d-%d\n",today.year,today.mouth,today.day);
printf("Today is date is %d-%d-%d",day.year,day.mouth,day.day);
return 0;
}
输入输出格式 %[flags][width][.prec][hiL]type
%3.5d意思为宽度为3,小数点后为5位,0为填充
逻辑运算和按位运算不同 易犯错
左移位<< X<<=1等价于X*=2 X<<=n等价于X*=2的n次方
右移位>> X>>=1等价于X/=2 X>>=n等价于X/=2的n次方
break;退出当前一层循环,只能退出包含break最近的一层循环
continue:结束本次循环进入下次循环
冒泡法排序
#include<stdio.h>
#define N 10
int main()
{
int a[N]={1,2,3,5,9,8,7,6,12,4};
int i,temp;
int j;
int t;
for(i=9;i>0;i--)
for(j=0;j<i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
for(i=0;i<10;i++)
printf("%d\n",a[i]);
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,a[i]);
i=0;//逆序
j=sizeof(a)/sizeof(int)-1;
while(i<j)//逆序
{
t=a[j];
a[j]=a[i];
a[i]=t;
i++;
j--;
}
for(i=0;i<10;i++)
printf("%d\n",a[i]);
return 0;
}
//总结,冒泡排序,n个数字排序需要外层循环n-1次。大到小,内层循环比较次数依次减少n-1,n-2,n-3…次。小到大
9、假设有10个数已经按照从小到大的顺序存放在数组中,要求向从键盘输入一个整数,插入这10个数中,使数组仍是从小到大的顺序排列。
#include <stdio.h>
int main()
{
int a[11]={1,2,3,4,5,6,7,8,9,10},b,i,t;
scanf("%d",&b);
printf("a[11]={1,2,3,4,5,6,7,8,9,10}\n");
for(i=0;i<10;i++)
if(b<a[i])
{
t=a[i];
a[i]=b;
b=t;
}
a[10]=b;
for(i=0;i<11;i++)
printf("%d\n",a[i]);
return 0;
}
10、输入10进制数转换为二进制进行输出
#include <stdio.h>
int main()
{
int a[16]={0},i=0,j,n;
scanf("%d",&n);
while(n>=1)
{
a[i]=n%2;
n=n/2;
i++;
}
for(j=i-1;j>=0;j--)
printf("%d\n",a[j]);
return 0;
}
局部变量如果不初始化,值不确定,全局变量不初始化默认为0
函数声明时,应在int main()之前声明
字符串需要预留\0,作为结束的标志。
a[i]=p[i]等价于*(p+i)=*(a+i)
指针和二维数组:*(a+行)+列
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式
请写出 char *p 与“零值”比较的 if 语句
if (p == NULL) if (p != NULL)
#include "stdio.h"
#define exchange(a,b) { int t; t=a;a=b;b=t;}
void main()
{
int x=10;
int y=20;
printf("x=%d; y=%d\n",x,y);
exchange(x,y);
printf("after exchange:x=%d; y=%d\n",x,y);
}
#include<stdio.h>
int main()
{
void sort(int x[],int n);
int i,*p,a[10];
p=a;
printf("please enter 10 interger numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;
sort(p,10);
for(p=a,i=0;i<10;i++)
{
printf("%d\t",*p++);
}
printf("\n");
return 0;
}
//选择排序法
void sort(int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;//假定第一个数为最大值
for(j=i+1;j<n;j++)//从第二个开始一次和第一个数比较
if(x[j]>x[k])//如果大于第一个数,把该数的下标赋给k
k=j;
if(k!=i)//第二层循环结束,判断下标不相等时,做数值交换操作
{
t=x[i];x[i]=x[k];
x[k]=t;
}
}
}
#include<stdio.h>
int main()
{
int a[10];
int i,j,k,p,u,temp;
for(p=0;p<10;p++)
scanf("%d",&a[p]);
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
printf("由小到大输出:");
for(u=0;u<10;u++)
printf("%d\t",a[u]);
printf("\n");
return 0;
}
#include<stdio.h>
int main()
{
int a[10];
int i,j,k,p,u,temp;
for(p=0;p<10;p++)
scanf("%d",&a[p]);
for(i=0;i<9;i++)
{
k=i;
for(j=i+1;j<10;j++)
if(a[k]>a[j])
k=j;
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
for(u=0;u<10;u++)
printf("%d\t",a[u]);
return 0;
}
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数
组中。
程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况
,插入后此元素之后的数,依次后移一个位置。
程序源代码:
main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100};
int temp1,temp2,number,end,i,j;
printf("original array is:\n");
for(i=0;i<10;i++)
printf("%5d",a);
printf("\n");
printf("insert a new number:");
scanf("%d",&number);
end=a[9];
if(number>end)
a[10]=number;
else
{for(i=0;i<10;i++)
{ if(a>number)
{temp1=a;
a=number;
for(j=i+1;j<11;j++)
{temp2=a[j];
a[j]=temp1;
temp1=temp2;
}
break;
}
}
}
for(i=0;i<11;i++)
printf("%6d",a);
}