C语言基本语法

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 int
p=&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);
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值