数学符号
1.头文件
使用数学符号前须加上#include <math.h>
使用数组的相关符号需加上#include<string.h>
使用atoi()函数(把字符串转换成整数)需要加上#include "stdlib.h"
2.一些函数
①平方根函数sqrt(x):(即为根号x)如sqrt(9.0)的值为3.0。
②绝对值函数fabs(x):(即为x的绝对值)如fabs(-4.29)的值为4.29。
③幂函数pow(x, y):(即为x的y次方)如pow(1.1, 2)的值为1.21
④指数函数exp(x):(即为e的x次方)如exp(2.3)的值为9.974182。
⑤以e为底的对数函数log(x):如log(123.45)的值为4.815836。
上面的5个函数其返回类型都是double类型。
atoi(x): 把字符串x转换成整数。
#include "stdio.h"
#include "stdlib.h"
int main()
{
int a;
char Angle[30];
Angle[0]='1';
Angle[1]='2';
Angle[2]='3';
Angle[3]='\0';
a=atoi(Angle);
printf("%d",a);
return(0)
}
3.三角函数
①正弦函数sin(x): (即为sinx) 如sin(Π/2)的值为1。
②正切函数tan(x): (即为tanx) 如tan (Π/4)的值为1。
4.电脑打出一些数学符号
①(-1)的n次方:(-1)^n,即为按住Shift同时按顶部的数字六(注意此时的输入法要为英文,不然会是六个点,如此……);
②除号:/;
③乘号:*,即为按住Shift同时按顶部的数字8,或者在小键盘顶部也有;
④叹号:!,即为按住Shift同时按顶部的数字1,或者在小键盘顶部也有;
⑤取余:%,即为按住Shift同时按顶部的数字5;
⑥取地址符:&,即为按住Shift同时按顶部的数字7;
5.数组相关的函数
①strcat(字符数组1,字符数组2):strcat(s1,s2)或者strcat(s1,"ab");
把字符数组2放到字符数组1的后面,连接时把字符串末尾的’/0‘去掉,只在新的字符串末尾加一个’/0‘;
②strlen(字符串):c=strlen(s1)或者c=strlen("abcd");可得c=4(不计算最后的‘/0’)
测试字符串中实际字符的个数(不计算最后的‘/0’);
函数题
1.先输入一个数n,再输入n个数,判断其中有几个偶数。
#include <stdio.h>
int main()
{
int n,a=0,b;
scanf("%d",&n);
for(n;n>0;n--)
{
scanf("%d",&b);
if(b%2==0)
a++;
}
printf("%d",a);
}
2.输入一个字符,判断其是字母、数字、空格、字符,并输出答案。
#include <stdio.h>
int main()
{
char N;
scanf("%c",&N);
if(N>='A'&&N<='Z'||N>='a'&&N<='z')
printf("%cis字母",N);
if(N>=0&&N<=9)
printf("%cis数字",N);
if(N==' ')
printf("%cis空格",N);
}
3.输入两个数构成一个闭区间判断这两个数的区间内有多少素数并输出。
注意:
①0和1都不是素数要分开讨论;
②素数是除了1和本身没有能整除的数,所以判断一个数是否是素数应该从二开始取余;
③程序中运用了p的值来判断一个数是否是素数,所以要在开始判断这个数是否是素数(即for(n=2;n<=a;n++){p=0;)之前把p给置零;
④为了节约运行时间,判断一个数是否是素数时只需要对从m=2到这个m<=n/m的取余即可(m是从2开始的除数,n是所要判断是否是素数的数),即代码1(运行速度最快的);亦可以是算术平方根(即根号n)见代码2;亦可以为一半(即n/2)见代码3;
#include <stdio.h>
int main()
{
int a,n,m,p=0;
scanf("%d",&a);
if(a==0||a==1)
printf("%dis not 素数",a);
for(n=2;n<=a;n++)
{
p=0;
for(m=2;m<=n/m;m++)
{
if(n%m==0)
{
p=1;
break;
}
}
if(p==0)
printf("%dis素数",n);
}
}
#include <stdio.h>
#include <math.h>
int main()
{
int a,n,m,p=0,k;
scanf("%d",&a);
if(a==0||a==1)
printf("%dis not 素数",a);
for(n=2;n<=a;n++)
{
p=0;
k=sqrt(n);
for(m=2;m<=k;m++)
{
if(n%m==0)
{
p=1;
break;
}
}
if(p==0)
printf("%dis素数",n);
}
}
#include <stdio.h>
int main()
{
int a,n,m,p=0;
scanf("%d",&a);
if(a==0||a==1)
printf("%dis not 素数",a);
for(n=2;n<=a;n++)
{
p=0;
for(m=2;m<=n/2;m++)
{
if(n%m==0)
{
p=1;
break;
}
}
if(p==0)
printf("%dis素数",n);
}
}
4. 输入两个数求这两个数的最大公约数。
注意:
①最大公约数:也称最大公因数,这两个数的最大的能够共同整除的数;比如12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数。
②最小公倍数:比如求45和30的最小公倍数。45=3*3*5;30=2*3*5;最小公倍数等于2*3*3*5=90
③数学中除和除以的区别: 3除6,写作6/3=2;3除以6,写作3/6=0.5;
本题运用辗转相除法,先把数的大小比较出来,n是较大的数,m是较小的数,b为余数,用较小的除数除以第一余数,再用第一余数除以第二余数,最后输出最后一个不是零的余数(即最后一个n,m最后会和b一样都为零);
#include <stdio.h>
int main()
{
int A,B,b,n,m;
scanf("%d%d",&A,&B);
if(A>B)
{
n=A;
m=B;
}
else
{
n=B;
m=A;
}
while(1)
{
b=n%m;
n=m;
m=b;
if(b==0)
break;
}
printf("%d",n);
}
5.输入一个数n,再输入n个数,找出这些数中最大的一个数。
#include <stdio.h>
int main()
{
int n,m,a,b,c;
scanf("%d",&n);
scanf("%d",&a);
for(m=2;m<=n;m++)
{
scanf("%d",&b);
if(a<=b)
{
c=a;
a=b;
b=c;
}
}
printf("%d",a);
}
6. 输入一个数n,再输入n个数,给这n个数从小排到大并输出。(需要数组)(运用了冒泡法)
冒泡排序方法: 依次比较相邻的两个数,将小数放前面, 大数放后面。n个数排序需要进行n-1轮比较, 从第1轮到 第n-1轮, 各轮的比较次数依次为:n-1次、n-2次 … 1次
#include <stdio.h>
int main( )
{
int a[6] , i , j , t;
for ( i=0 ; i<6 ; i++)
scanf("%d", &a[i] );//输入6个数
for ( i=0 ; i<6-1 ; i++)//此处两个循环便是冒泡排序法的精髓,第一个循环为全部的数组进行是为了确定所有数的排序
for ( j=0 ; j<6-1-i ; j++) //第二个循环每次要减少一个循环次数,因为每进行一个大循环,就确定了一个最大或者最小项。
if ( a[j]>a[j+1] )
{
t=a[j] ;
a[j]=a[j+1] ;
a[j+1]=t ;
}
for ( i=0 ; i<6 ; i++)
printf("%3d", a[i] );
return 0;
}
#include <stdio.h>
int main()
{
int n,k,i,index,temp;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);//输入
for(k=0;k<n-1;k++)
{
index=0;
for(i=0;i<n-k;i++)//该循环是为了找出该数组中最大的数,把其下标存到index中;
{
if(a[i]>=a[index])
index=i;
}//以下三行是为了把最大的那一项和该数组每次的最后一项交换,即排序
temp=a[n-k-1];//注意是n-k-1,为了排序,因为每次都减小一个往前进一项
a[n-k-1]=a[index];
a[index]=temp;
}
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
return 0;
}
7. 运用指针编写函数计算以下函数
该代码用了比较基础和麻烦的方式计算(-1)^n(即-1的n次方)
#include <stdio.h>
void fun(float *s, int n);
int main()
{
int n;
float s=0;
scanf("%d",&n);
fun(&s,n);
printf("%f",s);
return 0;
}
/* 请在这里填写答案 */
void fun(float *s,int n)
{
int t;
for(t=0;t<=n;t++)
{
if(t%2==0)
*s+=1.0/(2*t+1);
else
*s-=1.0/(2*t+1);
}
}
以下代码运用了一个函数来实现(-1)^n(即-1的n次方),比较简单清楚。
#include <stdio.h>
void fun(float *s, int n);
int main()
{
int n;
float s=0;
scanf("%d",&n);
fun(&s,n);
printf("%f",s);
return 0;
}
/* 请在这里填写答案 */
void fun(float *s, int n)
{
float flag = -1.0;
int i;
for( i=0; i<=n; i++)
{
flag = -flag;
*s += flag/(2*i+1);
}
}
8.本题要求实现一个函数,查找数组中最大元素的下标。例如数组为{1,3,5,7,9},则该函数应该返回4。题目输入保证数组元素各不相同。
采用定义函数的方法:(其中 array
和 size
是用户传入的参数。 array
是数组首地址; size
是数组元素的个数。函数须返回数组中最大元素的下标(从0开始)。)
注意:此处k需要给一个初值0,因为如果if不成立(即第一个最大的话)那么k是没有值的。
注意此处的自定义函数所定义的自变量所采用的指针的方法,
char *p="China";
把num[]这个数组转换成自定义函数中的*array,这样array[i]就相当于num[i];
而在主函数里输入时只需要输入数组名即可(可见代码第10行);
/* 此测试程序仅为示例,实际的测试程序可能不同 */
#include <stdio.h>
#define MAXSIZE 100
int indexOfMax(int *array, int size);
int main(){
int num[MAXSIZE];
int total;
scanf("%d",&total);
for(int i=0; i<total; i++) scanf("%d",&num[i]);
printf("%d\n",num[indexOfMax(num,total)]);
return 0;
}
/* 你所编写的函数代码将被嵌在这里 */
int indexOfMax(int *array, int size)
{
int i,j,k=0;//此处k需要给一个初值0,因为如果if不成立(即第一个最大的话)那么k是没有值的。
j=array[0];
for(i=1;i<size;i++)
{
if(array[i]>=j)
{
j=array[i];
k=i;
}
}
return k;
}
9.本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:输入给出一行字符。
输出格式:在一行中输出单词个数。
输入样例:Let's go to room 209.
输出样例:5
判断单词的方法:
#include<stdio.h>
#include<string.h>
int main()
{
char s[10000];
gets(s);
int len = strlen(s);
int gs = 0;
for (int i = 0; i < len; i++)//len可以控制检测的数量则i=len-1即s[len]时刚好是'\0',
{
if((s[i] != ' ' && s[i + 1] == ' ') || (s[i] != ' ' && s[i + 1] == 0))
/*注意此处判断一个单词的方法,前面是判断除了最后一个单词以外的其他单词的个数,而或者后面判断最后一个单词,注意gets()输入的字符串只有结尾有一个'\0',其他单词后面只有空格*/
gs++;
}
printf("%d\n",gs);
return 0;
}
10.连接两个字符串,不允许使用strcat函数。
输入格式:在两行分别输入两个长度小于20的字符串。
输出格式:在一行中直接输出连接后的字符串。
输入样例:
abc
123
输出样例:abc123
错误的:该代码的错误是因为 如果输入样例,则e等于4,而应该是e等于3,因为数组a的最后一项/0是a[3],我们应该把它用b[0]取代,注意最后输出字符串,应在结尾加上/0。字符串是以/0结尾。
#include<stdio.h>
#include<string.h>
int main()
{
char a[40],b[20];
int c,d,e;
gets(a);
gets(b);
c=strlen(a);
d=strlen(b);
for(e=c+1;e<d+c+1;e++)
a[e]=b[e-c-1];
a[d+c+1]='\0';
puts(a);}
正确的:
第一种:
#include<stdio.h>
#include<string.h>
int main()
{
char a[40],b[20];
int c,d,e,f;
gets(a);
gets(b);
c=strlen(a);
d=strlen(b);
for(e=c;e<d+c;e++)
a[e]=b[e-c];
a[d+c]='\0';
puts(a);
f=strlen(a);
printf("%d,%d",c,f);
}
第二种:
#include<stdio.h>
int main()
{
int i=0,j=0;
char str1[40];
char str2[20];
gets(str1);
gets(str2);
while(str1[i]!=0)//检测str1中字符的个数
{
i++;
}
while(str2[j]!=0)//当str2[j]不是结尾时把str2中的元素放到str1后面,
{
str1[i]=str2[j];
i++;
j++;
}
printf("%s",str1);
return 0;
}
11. 求一个3×4数组中大于等于平均值的所有数组元素的和,并统计满足条件的元素个数。本题中的平均值为小数,用到的其他所有变量均为整型。(二维数组的应用)
输入格式:输入3行4列的矩阵,每行第一个数前没有空格,每行的每个数之间各有一个空格。
输出格式:在一行中按照“s=和,n=个数”的顺序输出,结果均原样输出,没有列宽控制。
输入样例:
1 4 7 8
2 1 4 2
1 2 3 4
输出样例:s=27,n=5
#include <stdio.h>
#include <string.h>
int main()
{
int a,d;
int s[3][4];
for(a=0;a<3;a++)
for(d=0;d<4;d++)
scanf("%d",&s[a][d]);
double sum=0,c;//sum要为double不然运算会出错
int i,j,n=0,b=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
sum+=s[i][j];
c=sum/12.0;//个数要为12.0,不然运算会出错
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
if(s[i][j]>=c)
{
b+=s[i][j];
n++;
}
}
printf("s=%d,n=%d",b,n);
}
不熟悉的代码
一.输入输出
C语言函数库中有一批标准输入输出函数,它是以标准的输入输出设备(一般为终端设备)为输入输出对象的。
其中有putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)、gets(输入字符串)。
①用于字符的输入:ch=getchar(); 字符串的输入:gets(a);
②用于字符的输出:putchar(ch); 字符串的输出:puts(a);
③ 输入时
double类型的数据要用%lf,
float类型的数据要用%f;
字符要用%c;
字符串要用%s;
④输出时
double类型和float类型的数据都可以用%lf输出;
二.数组
1.一维数组
输入:
//方法一:(针对于输入一串数字)
int a[10],i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
//方法二:(针对于输入字符串,注意字符串以'\0'结尾)
char a[10];
gets(a);
//方法三:(针对于输入字符串,注意字符串以'\0'结尾)
char a[10];
scanf("%s",a);//注意此处的a不用加&(%s为输入字符串,%c为输入字符)
2.二维数组
输入:
int a[500][500];//定义一个较大的二维数组进行数值储存;
for(int t=0; t<j; t++) //循环输入列
{
for(int i=0; i<k; i++) //循环输出行
{
scanf("%d",&a[t][i]);
}
}
三.不熟的知识点(编译后会报错)
①在if里判断字母和空格等单个字符是否相等须把空格字符加上单引号,并且判断是否相等要用两个等号
if(N>='A'&&N<='Z'||N>='a'&&N<='z')
printf("%cis字母",N);
if(N>=0&&N<=9)
printf("%cis数字",N);
if(N==' ')
printf("%cis空格",N);
if(n==1)
{
}
②用for循环时括号内为分号;
for(n=1;n<=a;n++)
{
}
四.不熟的知识点(编译后不会报错,但是结果会错)
①ASCII码
A:65 a:97
Z:90 z:122
②用for循环时括号内要是每次执行完之后需要加2,则需要把最后变成n+=2;
for(n=2;n<=a;n+=2)
{
}
③ 用double或者float类型的数时,要注意(double)s=1.0/2*n,为1.0不是1,不然数不对(最后一行代码,该题题目可见函数题第7题)。以下的代码用了指针。
#include <stdio.h>
void fun(float *s, int n);
int main()
{
int n;
float s=0;
scanf("%d",&n);
fun(&s,n);
printf("%f",s);
return 0;
}
/* 请在这里填写答案 */
void fun(float *s,int n)
{
int t;
for(t=0;t<=n;t++)
{
if(t%2==0)
*s+=1.0/(2*t+1);
else
*s-=1.0/(2*t+1);
}
}
④字符串是以'/0'为标志的结尾。
五.编译后出现相关警告的原因
① control reaches end of non-void function (文晓提供的)
(控制到达非void函数的结尾。就是说你的一些本应带有返回值的函数到达结尾后可能并没有返回任何值。即需要有返回值的函数在运行时没有返回值,导致报错。此时需要检查代码的返回值是否编写错误,是否缺少返回值。)
分支函数程序中设有返回值,但是没有考虑到所有情况,只有部分情况才有返回值。
本次错误是因为n为double类型的数据,double中有一些情况没有返回值,比如负数,小于2的小数,编译后便会会出现图片中的警告。
以下代码便是会报警告的
#include<stdio.h>
double sn(double n);
int main()
{
double n;
scanf("%lf",&n);
printf("%.0lf",sn(n));
}
double sn(double n)
{
double a,b=1,c=1;
int i;
if(n==1||n==2)
return 1;
if(n>2)
{
for(i=3;i<=n;i++)
{
a=b+c;
b=c;
c=a;
}
return a;
}
}
以下代码为不报警告的
#include<stdio.h>
double sn(double n);
int main()
{
double n;
scanf("%lf",&n);
printf("%.0lf",sn(n));
}
double sn(double n)
{
double a,b=1,c=1;
int i;
if(n==1||n==2)
return 1;
else
{
for(i=3;i<=n;i++)
{
a=b+c;
b=c;
c=a;
}
return a;
}
}