文章目录
- C语言常考类型
- 经典代码
- 1) 兔子问题
- 2) 斐波那契数列
- 3) 百元买百鸡
- 4) 实心菱形
- 5) 空心菱形
- 6) 十进制转换为二进制
- 7) 水仙花
- 8) 大数相加
- 9) 冒泡排序
- 10) 选择排序
- 11) 打印字母V
- 12) 打印空心等腰三角形
- 13) 打印大写字母Y
- 14 ) 判断输入字符是否为回文数
- 15) 利用sort函数进行排序
- 16) 利用函数实现两个数的相加
- 17) 利用函数实现两个数的交换
- 18) 解一元二次方程组
- 19)冒泡排序与交换排序的结合
- 20) 倒序输出
- 21)八皇后问题
- 22)汉诺塔问题
- 23)数组的行列互换
- 24)求1000内的完全数
- 25) 辗转相除法
- 26) 回文串
- 27)采用非strcat和strcat方式实现字符串的连接
- 28)用宏定义计算两个数的和
- 29)逆序输出
C语言常考类型
(1)求及格人数或平均成绩或最大最小成绩,素数,水仙花,完数,选择排序,加密(字母循环移动),自定义函数的定义与调用,求阶乘
(2)最大公约数和最小公倍数,文件读写,递归函数与递归调用,Fibonacci数列
(3)指针变量做函数参数,数组做函数参数, 结构体类型定义以及结构体变量的定义, 联合,指针与结构体变量,二重循环,指针与一维数组,二维数组
(4)自增运算++,自减运算–,基础知识(背诵),求累加和,交换两个变量的值,switch, 一维数组
函数的调用
#include<stdio.h>
int fun(int x, int y); // 函数声明,如果函数写在被调用处之前,可以不用声明
void main()
{int a=1, b=2, c;c = fun(a, b); // 函数的调用,调用自定义函数fun,其中a,b为实际参数,传递给被调用函数的输入值
}
// 自定义函数fun
int fun(int x, int y) // 函数首部
{ // {}中的语言为函数体return x>y ? x : y; // 返回x和y中较大的一个数
}
自加与自减
a++ //是先执行表达式后再自增,执行表达式时使用的是a的原值。
++a //先自增再执行表达示,执行表达式时使用的是自增后的a。
int a=0
printf("%d",a++); //输出0,执行完后a=1int a=0
printf("%d",++a);//输出1,执行完后a=1
经典代码
1) 兔子问题
#include<stdio.h>
int main() {int f1=1,f2=1;int i;for(i=1; i<20; i++) {printf("%12d %12d",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}return 0;
}
2) 斐波那契数列
#include<iostream>
using namespace std;
int main() {int f1=0,f2=1,t,n=1;cout<<"数列第1个:"<<f1<<endl;cout<<"数列第2个:"<<f2<<endl;for(n=3; n<=20; n++) {t=f2;f2=f1+f2;f1=t;cout<<"数列第"<<n<<"个:"<<f2<<endl;}cout<<endl;return 0;
}
斐波那契数列的应用
#include<stdio.h>
int main() {int i,m;int n;printf("输入要求的项数:");scanf("%d",&n);float num1=2,num2=1,sum=0;for(i=1; i<=n; i++) {sum=sum+num1/num2;m=num1;num1=num1+num2;num2=m;}printf("sum=%.2f",sum);
}
3) 百元买百鸡
#include <stdio.h>
#include <math.h>void swap(int x,int y,int z) {for(x=1; x<=20; x++)for(y=1; y<=33; y++) {z=100-x-y;if(x*5+y*3+z/3.0==100)printf("x=%d y=%d z=%d\n",x,y,z);}
}
int main() {int x,y,z;swap(x,y,z);return 0;
}
4) 实心菱形
#include<iostream>
using namespace std;
int main() {int i,j,k;int N;//控制菱形的大小N;cin>>N;//先打上边的N行for(i=1; i<=N; i++) {for(j=1; j<=N-i; j++) {cout<<" ";//打印的空格数}for(k=1; k<=2*i-1; k++)cout<<"*";//星号数cout<<endl;}//下边的N-1行for(i=N-1; i>=0; i--) {for(j=1; j<=N-i; j++) {cout<<" ";//打印的空格数}for(k=1; k<=2*i-1; k++)cout<<"*";//星号数cout<<endl;}return 0;
}
5) 空心菱形
方法一:
#include<stdio.h>
int main() {int a,n,i;scanf("%d",&a);for(n=1; n<=a/2+1; n++) { //n是行for(i=1; i<=a-n; i++)printf(" ");printf("*");for(i=1; i<=2*n-3; i++) {printf(" ");}if(n>1)printf("*");printf("\n");}for(n=a/2; n>0; n--) { //n是个数for(i=1; i<=a-n; i++) //这是个函数!a-n斜率为-1,a-n/2斜率为-2!printf(" ");printf("*");for(i=1; i<=2*n-3; i++) {printf(" ");}if(n>1)printf("*");printf("\n");}return 0;
}
方法二:
#include<stdio.h>
int main() {int i,j,k,line,m;printf("请输入行数:");scanf("%d",&line);m=(line+1)/2;for(i=1; i<=m; i++) {for(k=0; k<m-i; k++) {printf(" ");}printf("*");if(i==1) {printf("\n");continue;}for(j=0; j<2*i-3; j++){printf(" ");}printf("*");printf("\n");}for(i=m-1; i>0; i--) {for(k=0; k<m-i; k++) {printf(" ");}printf("*");if(i==1) {printf("\n");continue;}for(j=0; j<2*i-3; j++) {printf(" ");}printf("*");printf("\n");}return 0;
}
方法三:
#include"stdio.h"
#include"math.h"
int main() {int i,j,n;scanf("%d",&n);for(i=-n; i<=n; i++) {for(j=-n; j<=n; j++)if(abs(i)+abs(j)==n) printf("*");else printf(" ");printf("\n");}
}
6) 十进制转换为二进制
#include<stdio.h>
int main() {int a,i=2,j=0;int b[100];scanf("%d",&a);while(i>=1) {i=a/2;if(i*2==a) {b[j++]=0;} else {b[j++]=1;}a=i;}for(j-=1; j>=0; j--)printf("%d",b[j]);return 0;
}
7) 水仙花
#include<iostream>
using namespace std;void a1() {int count =0;int x,backNum,befNum,t,num;cout<<"请输入一个三位数:"<<endl;cin>>x;t=x;for(int i=1; i<=3; i++) {backNum=x%10;befNum=x/10;x=befNum;num=backNum*backNum*backNum;count+=num;}cout<<"x="<<t<<endl;cout<<"count="<<count<<endl;if(count==t) {cout<<"Yes"<<endl;} else cout<<"No"<<endl;
}int main() {a1();return 0;
}
8) 大数相加
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;string addStringString(string a, string b) {string s = "";reverse(a.begin(), a.end());reverse(b.begin(), b.end());int i = 0, m=0, k = 0;while(a[i] && b[i]) {m = a[i] - '0' + b[i] - '0' + k;k = m/10;s += m%10 + '0';i++;}if(i == a.size()) {while(i != b.size()) {m = b[i] - '0' + k;k = m/10;s += m%10 + '0';i++;}if(k != 0) {s += (k+'0');}} else if(i == b.size()) {while(i != a.size()) {m = a[i] - '0' + k;k = m/10;s += m%10 + '0';i++;}if(k != 0) {s += (k+'0');}}reverse(s.begin(), s.end());return s;
}
int main() {string a;string b;cin >> a >> b;cout << addStringString(a,b) << endl;
}
9) 冒泡排序
1)一维冒泡
#include<stdio.h>
int main()
{ int a[10]={1,2,3,4,5,6,7,8,10,9};int i=0,j=0;int t;for(i=0;i<10;i++){for(j=0;j<10-1;j++){if(a[j]>a[j+1]){int t=a[j];a[j]=a[j+1];a[j+1]=t;}}}printf("排好的数列为:\n");for(i=0;i<10;i++){printf("%2d ",a[i]);}}
2)二维冒泡:
#include<stdio.h>
int main() {int a[3][3]= {{1,2,3},{4,5,6},{7,8,9}};int i,j,k;for(i=0; i<3; i++)for(j=0; j<2; j++) {if(a[i][j]>a[i][j+1]) {k=a[i][j];a[i][j]=a[i][j+1];a[i][j+1]=k;}}for(i=0; i<3; i++)for(j=0; j<3; j++)printf("%4d",a[i][j]);
}
10) 选择排序
#include <stdio.h>
int main() {int i,j,t,a[11]; //定义变量及数组为基本整型printf("请输入10个数:\n");for(i=1; i<11; i++)scanf("%d",&a[i]); //从键盘中输入要排序的10个数字for(i=1; i<10; i++)for (j=i+1; j<11; j++)if(a[i]>a[j]) { //如果前一个数比后一个数大,则利用中间变量t实现两值互换t=a[i];a[i]=a[j];a[j]=t;}printf("排序后的顺序是:\n");for(i=1; i<11; i++)printf("%5d", a[i]); //输出排序后的数组printf("\n");return 0;
}
11) 打印字母V
#include<stdio.h>
int main() {int line;int i;scanf("%d",&line);int n=(line+1)/2;for(int i=n; i>0; i--) {for(int k=0; k<n-i; k++) {printf(" ");}printf("*");if(i==1) {printf("\n");continue;}for(int j=0; j<2*i-3; j++) {printf(" ");}printf("*");printf("\n");}}
12) 打印空心等腰三角形
#include <iostream>
#include <string>
using namespace std;void PriTriangle(int n) {for(int i=1; i<=n; ++i) {for(int j=1; j<=n-i; ++j) {cout<<" ";}for(int k=1; k<=2*i-1; ++k) {if(i==1 || i==n)cout<<"*";else {if(k==1 || k==2*i-1)cout<<"*";elsecout<<" ";}}cout<<"\n";}
}int main() {cout<<"please input a number: ";int n;cin>>n;PriTriangle(n);}
13) 打印大写字母Y
#include<iostream>
using namespace std;
int main() {int n;cin>>n;int m=(n+1)/2;for(int i=m; i>=1; i--) {for(int k=1; k<=m-i; k++)cout<<" ";for(int j=1; j<=2*i-1; j++) {if(j==1||j==2*i-1) {cout<<"*";} else {cout<<" ";}}cout<<endl;}for(int i=0; i<m; i++) {for(int k=1; k<=m-1; k++) {cout<<" ";}cout<<"*"<<endl;}return 0;
}
14 ) 判断输入字符是否为回文数
#include<stdio.h>
#include<string.h>
int main() {char s[100];int i,j,n;printf("输入字符串:\n");gets(s);n=strlen(s);for(i=0,j=n-1; i<j; i++,j--)if(s[i]!=s[j])break;if(i>=j)printf("是回文串\n");elseprintf("不是回文串\n");return 0;
}
15) 利用sort函数进行排序
#include<iostream>
#include<string>
#include<algorithm>using namespace std;
//bool cmp(int a,int b)
//{
// return a>b;
//}
int main()
{int a[10]={5,1,0,3,7,8,4,6,9,2};sort(a,a+10);
// sort(a,a+10,cmp);for(int i=0;i<10;i++){cout<<a[i]<<" ";}return 0;
}
16) 利用函数实现两个数的相加
#include<stdio.h>
float add(float x,float y) {float z;z=x+y;return (z);
}
int main() {float add(float x,float y);float a,b,c;scanf("%f%f",&a,&b);c=add(a,b);printf("sum is %f",c);return 0;
}
17) 利用函数实现两个数的交换
#include<stdio.h>
void swap(int *a,int *b) {int temp;temp = *a;*a = *b;*b = temp;
}
int main() {int a,b;scanf("%d%d",&a,&b);swap(&a,&b);printf("%d %d\n",a,b);return 0;
}
18) 解一元二次方程组
#include<stdio.h>
#include<math.h>
int main() {double a,b,c,disc,x1,x2,p,q;scanf("%lf%lf%lf",&a,&b,&c);disc=b*b-4*a*c;p=-b/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q;printf("x1=%7.2f\nx2=%7.2f\n",x1,x2);return 0;
}
19)冒泡排序与交换排序的结合
#include<stdio.h>
void swap(int *a,int *b) {int temp=*a;*a=*b;*b=temp;
}void b_sort(int a[]) {int t;for(int i=0; i<10; i++) {for(int j=0; j<9; j++) {if(a[j]>a[j+1]) {
// t=a[j];
// a[j]=a[j+1];
// a[j+1]=t;swap(&a[j],&a[j+1]);}}}}
int main() {int a[10]= {1,2,3,4,-5,6,7,8,9,10};b_sort(a);for(int i=0; i<10; i++) {printf("%4d",a[i]);}}
20) 倒序输出
#include<stdio.h>
int main()
{int i,j;int t;int a[8];printf("请输入7个数:"); for(i=1;i<8;i++)scanf("%d",&a[i]);for(i=0;i<8;i++)for(j=1;j<7;j++)if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}printf(" ");for(i=1;i<=7;i++)printf("%5d",a[i]); }
21)八皇后问题
#include <iostream>
#include <cmath>
#define N 8
using namespace std;
int board[N+1],cnt;
bool judge(int l,int n) { //判断在第l行第n个位置放是否合法for(int i=1; i<=l-1; ++i)if(board[i]==n||abs(board[i]-n)==abs(i-l))return false;return true;
}
void print() {for(int i=1; i<=N; ++i) {for(int j=1; j<board[i]; ++j)cout<<'*';cout<<'Q';for(int j=board[i]+1; j<=N; ++j)cout<<'*';cout<<endl;}cout<<endl;
}
void dfs(int l) {for(int i=1; i<=N; ++i) {if(judge(l,i)) {board[l]=i;if(l==N) {print();++cnt;} elsedfs(l+1);}}
}
int main() {dfs(1);cout<<cnt;//输出答案总数return 0;
}
22)汉诺塔问题
#include<stdio.h>
int main()
{void hanoi(int n,char one,char two,char three);int m;printf("input the number of diskes:");scanf("%d",&m);printf("The step to move %d diskes:\n",m);hanoi(m,'A','B','C'); } void hanoi(int n,char one,char two,char three){void move(char x,char y);if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}
void move(char x,char y)
{printf("%c->%c\n",x,y);
}
23)数组的行列互换
#include<iostream>
using namespace std;
main() {int t,i,j,r[3][3]= {{1,2,3},{7,8,9}}; //定义要交换的数组r,大小为3*3,实际只使用了2*3for(i=0; i<2; i++) { //r的大小是2*3,把2*3变为3*2for(j=i; j<3; j++) {t=r[i][j];r[i][j]=r[j][i];r[j][i]=t;//交换过程,相当于交换了下标}}for(i=0; i<3; i++) { //显示,因为2*3已经是3*2了for(j=0; j<2; j++)printf("%d ",r[i][j]);printf("\n");}
}
24)求1000内的完全数
#include<stdio.h>
#define N 1000
int main()
{int i,m,g;for(m=2;m<=N;m++){g=0;for(i=1;i<m;i++){if(m%i==0)g=g+i; } if(g==m){printf("完数%d的因子是:\n",m); for(i=1;i<m;i++){if(m%i==0){printf("%d\t\n",i);}}}}return 0;}
25) 辗转相除法
#include<stdio.h>int main() {int u=32;int v=26;while(v!=0) {int temp=u%v;u=v;v=temp;}printf("%d",u);return 0;
}
如果v等于0,计算结束,u就是最大公约数
如果v不等于0,那么计算u除以v的余数,让u等于v,而v等于那个余数
回到第一步
26) 回文串
#include<iostream>
#include<string.h>
using namespace std;int main() {//char str[20];string str;int i,n;cin>>str;//scanf("%s",str);//n=strlen(str);n = str.length();cout<<n<<endl;for(i=0; i<=n/2; i++) {if(str[i]!=str[n-1-i]) {printf("N\n");break;} else {if(i==n/2)printf("Y\n");}}return 0;}
27)采用非strcat和strcat方式实现字符串的连接
本题要求编写程序,实现两个字符串的连接,并将连接后的字符串输出。
输入格式:
输入一行以回车结束的非空字符串(不超过20个字符),再输入一行以回车结束的非空字符串(不超过20个字符)。
输出格式:
一行输出俩字符串连接后新的字符串。
输入样例:
Hello_
China
输出样例:
Hello_China
解题一:
非空字符串但是字符串中可能含有空格,用scanf不会通过,采用gets函数。
#include<stdio.h>
#include<string.h>
int main(){char a[100],b[100];gets(a);gets(b);int extent=strlen(a);int extent2=strlen(b);int i=0;while(i<=extent2){a[extent++]=b[i++];}puts(a);}
解题二:
采用strcat函数实现字符串的连接
#include<stdio.h>
#include<string.h>
int main(){char a[100],b[100];
// strcpy(a,"Hello_");
// strcpy(b,"China");scanf("%s",&a);scanf("%s",&b);strcat(a,b);printf("%s",a);return 0;
}
28)用宏定义计算两个数的和
#include <cstdio>
#include <iostream>
#define lol long long int
#define A using
#define Long namespace
#define time std
#define ago ;
#define Here int
#define was main
#define a ()
#define monkey {
#define called lol x,y;
#define Jack cin>>x>>y;
#define ak cout<<x+y;
#define ioi return 0;
#define Orz }
A Long time ago Here was a monkey called Jack ak ioi Orz
输出结果图如下:
29)逆序输出
#include<stdio.h>
#include<string.h>
int main()
{char s[10];scanf("%s",s);int len=strlen(s);int flag=0;for(int i=len-1;i>=0;i--){if(s[i]=='0' && !flag)continue;if(s[i]!='0' && !flag) {printf("%c",s[i]);flag=1;continue;}printf("%c",s[i]);} printf("\n");return 0;
}
#include<stdio.h>int main(){int a=1;
// printf("%d %d %d",++a,a++,a);printf("%d %d %d",a++,++a,a);return 0;
}