文章目录
- 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=1
int 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<<"*";
else
cout<<" ";
}
}
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");
else
printf("不是回文串\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;
} else
dfs(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*3
for(i=0; i<2; i++) { //r的大小是2*3,把2*3变为3*2
for(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;
}