说明
这些程序是我在专升本期间在CSDN上上传的作业、练习等,仅为学习备考的一小部分程序,整理成一篇文章,方便专升本的学弟学妹参考。
时间:2021年~2022年专升本期间
字符串题
输入字符串提取 数字字符 并 求和 (4处错)
题目:输入一个字符串,将其数字符号选出按顺序组成一个整数并输出到屏幕上。
例如:输入-3#45^67@,得到-34567;输入3#4-5*67,得到34567。
#include<stdio.h>
#include<string.h>
int main()
{
char s[50];
int i,n=0; //错误1:n没赋初值
gets(s); //错误2:gets写成了get()
if(s[0]=='-')
putchar(s[0]);
for(i=0;i<strlen(s);i++)
{
if(s[i]>='0'&&s[i]<='9')
{
//错误3:①②写反了
n*=10; //②
n+=s[i]-'0'; //① 错误4:写成了 n=s[i]-'0';
}
}
printf("%d",n);
return 0;
}
运行结果1:
输入:-3#45^67@
输出:-34567
运行结果2:
3#4-5……67@
34567
strlen的实现
//计算长度
#include<stdio.h>
int main()
{
char *str1 = "abcdefg", *str2;
str2 = str1;
while(*str1++);
{
str1++;
}
printf("%d",str1 - str2); //9
}
strcat()的实现
//链接字符串
#include<stdio.h>
int main()
{
char s1[30] = "abcdefg",s2[30] = "hijklmn";
char *str1 = s1 , *str2 = s2;
while(*str1)
{
str1++;
}
while(*str2)
{
*str1++ = *str2++;
}
printf("%s",s1); //abcdefghijklmn //输出数组名,不要输出指针名。
// printf("%s",str1); //无输出结果,因为此时str2指向了0
}
strcpy()的实现
#include<stdio.h>
int main()
{
char str1[30] = "abcdefghiklmn",str2[30] = "asdljgs";
char *s1 = str1 , *s2 = str2;
while(*s2)
{
*s1 = *s2;
s1++;
s2++;
}
*s1 = '\0';
printf("%s",str1); //asdljgs
}
删除字符串
#include<stdio.h>
int main()
{
char s[30] = "a1b2c3d4ef5";
char *p=s;
int n=0,i=0;
while(s[i])
{
if(s[i] < '0' || s[i] > '9' )
{
s[n++] = s[i];
}
i++;
}
s[n] = '\0';
printf("%s",s); //abcdef
}
比较字符串(本题认为值为左串与右串第一个不相同字符之差(左-右))
#include<stdio.h>
int main()
{
char s1[30],s2[30];
int i,j;
scanf("%s%s",s1,s2);
for(i=0;s1[i]==s2[i];i++);
printf("%d",s1[i]-s2[i]);
}
#include<stdio.h>
int main()
{
char s1[30],s2[30];
char *p = s1,*q =s2;
scanf("%s%s",s1,s2); //scanf("%s%s",p,q);
while(*p == *q)
{
p++,q++;
}
printf("%d",*p-*q);
}
运行结果都如下:
abcdefg
abceefg
-1
字符串转成顺序数字
//把数字字符串转成数字
#include<Stdio.h>
int main()
{
char s[10] = "1234";
int i,n=0;
for(i=0;s[i];i++)
{
n=n*10+s[i]-'0';
}
printf("%d",n);
}
1234
2.字符串转成逆序数字
方法很简单啊,把for循环的3条语句都改了就好了,此外注意添加头文件
//把数字字符串转成逆序数字
#include<Stdio.h>
#include<string.h>
int main()
{
char s[10] = "1234";
int i,n=0;
for(i=strlen(s)-1 ;i>=0 ;i--)
{
n=n*10+s[i]-'0';
}
printf("%d",n);
}
4321
输出字符串中最长的单词
#include<Stdio.h>
int main()
{
char str[80] = "this isndnsjfida is a pencil good ";
char *p,*s = str;
int num=0,max = 0;
while(*s)
{
while(*s&&(*s>='a'&&*s<='z'||*s>='A'&&*s<='Z'))
{
num++;
s++;
}
if(num > max)
{
max = num;
p = s;
}
num = 0;
while(*s&&*s==' ')
{
s++;
}
}
*p = 0;
puts(p-max);
}
pencil
判断回文串
#include<stdio.h>
#include<string.h>
int main()
{
char s[30] = "abcba";
int i,j;
for(i = 0 , j=strlen(s)-1; i<j; i++,j--) //-1 不是strlen(s)
{
if(s[i] != s[j])
{
break;
}
}
if(i>=j)
{
printf("是回文串");
}
else
{
printf("不是回文串");
}
}
是回文串
子串
#include<stdio.h>
#include<string.h>
int main()
{
char s1[30] = "abcdabdabe" ,s2[10] = "ab";
int i,j;
int num = 0;
for(i=0; i<strlen(s1); i++)
{
for(j=0; j<strlen(s2); j++)
{
if(s1[i+j] != s2[j])
{
break;
}
}
if(j == strlen(s2))
{
num++;
}
}
printf("%d",num);
return 0;
}
3
输入三个字符串,分别统计每个串的大写字母个数
方法1:指针数组法
#include<stdio.h>
int main()
{
char str[3][50];
char *name[3] = {str[0],str[1],str[2]}; //指针必须有指向
int num[3]={0};
int i,j;
for(i=0;i<3;i++)
{
gets(*(name+i));
for(j=0;*(*(name+i)+j);j++)
{
if(*(*(name+i)+j)>='A'&&*(*(name+i)+j)<='Z')
{
num[i]++;
}
}
printf("大写字母有%d个",num[i]);
putchar('\n');
}
}
A1B2C3D4
大写字母有4个
zxcasdG
大写字母有1个
大写字母有0个
方法2:二维数组法
#include<stdio.h>
int main()
{
char name[3][80];
int num[3]={0};
int i,j;
for(i=0;i<3;i++)
{
gets(name[i]);
for(j=0;name[i][j];j++)
{
if(name[i][j]>='A'&&name[i][j]<='Z')
{
num[i]++;
}
}
printf("大写字母有%d个",num[i]);
putchar('\n');
}
}
abcABC123A
大写字母有4个
gjfA
大写字母有1个
kgsSHB4
大写字母有3个
数组题
从整形数组中计算奇数元素的平均值
#include<stdio.h>
double ave(int b[],int n)
{
double sum=0.0;
int i,j=0; //j:奇数个数
for(i=0;i<n;i++)
{
if(b[i]%2!=0)
{
sum+=b[i];
j++;
}
}
printf("奇数有:%d个\n",j);
printf("%f 除以 %d = %f\n",sum,j,sum/j);
return sum/j;
}
int main()
{
int a[100];
int i,n;
printf("请输入元素个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入a[%d]:",i);
scanf("%d",&a[i]);
}
printf("The result is : %lf",ave(a,n));
return 0;
}
请输入元素个数:5
请输入a[0]:1
请输入a[1]:2
请输入a[2]:3
请输入a[3]:4
请输入a[4]:5
奇数有:3个
9.000000 除以 3 = 3.000000
The result is : 3.000000
设计程序统计某班全体学生三门课的成绩,要求先输入学生人数,并依次输入每个学生的三门成绩,统计出每门课程的全班平均分及每个考生所有考试的总分。
#include<stdio.h>
int main()
{
int i,j;
int n;
double a[100][5] = {0};
double avg1 = 0 , avg2 = 0 , avg3 = 0;
scanf("%d",&n); //n:学生人数
for(i=0; i<n; i++)8
{
scanf("%lf%lf%lf",&a[i][0],&a[i][1],&a[i][2]);
a[i][3] = a[i][0] + a[i][1] + a[i][2]; //a[i][3]保存 总分
avg1+=a[i][0]/n; //科目1平均分
avg2+=a[i][1]/n;
avg3+=a[i][2]/n;
}
for(i=0;i<n;i++)
{
printf("第%d个考生总分:%lf\n", i+1 , a[i][3]);
}
printf("科目1:%lf\n科目2:%lf\n科目3:%lf\n",avg1,avg2,avg3);
}
3
1 2 3
4 5 6
7 8 9
第1个考生总分:6.000000
第2个考生总分:15.000000
第3个考生总分:24.000000
科目1:4.000000
科目2:5.000000
科目3:6.000000
假设10个整数存储在数组a[10]中,要求把其中能被12整除的数标记为T,其他标记为F,标记存储在字符数组b[10]中下标相同的对应位置。输出这两个数组
#include<stdio.h>
int main()
{
int a[10] = {1,12,144,24,48,25,26,32,2,36};
int b[10] = {0};
int i;
for(i=0; i<10; i++)
{
//写法1.if - else
// if(a[i]%12==0)
// {
// b[i] = 'T';
// }
// else
// {
// b[i] = 'F';
// }
//
//写法2.条件表达式
b[i] = a[i]%12==0 ? 'T' : 'F';
}
for(i=0; i<10; i++)
{
printf("%-3d - %c\n",a[i],b[i]);
}
}
1 - F
12 - T
144 - T
24 - T
48 - T
25 - F
26 - F
32 - F
2 - F
36 - T
输出10行杨辉三角
include<stdio.h>
int main()
{
int a[10][10] = {0};
int i,j;
for(i=0; i<10; i++)
{
a[i][0] = 1;
a[i][i] = 1;
}
for(i=1; i<10; i++)
{
for(j=1; j<=i; j++) // <= 或 < 都可以
{
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
for(i=0; i<10; i++)
{
for(j=0; j<=i; j++)
{
printf("%-5d",a[i][j]);
}
putchar('\n');
}
}
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
递归输出杨辉三角
#include<stdio.h>
int f(int i , int j)
{
if(j==0||j==i)
{
return 1;
}
else
return f(i-1,j-1) + f(i-1,j);
}
int main()
{
for(int i=0;i<=9; i++)
{
for(int j=0;j<=i;j++)
{
printf("%d\t",f(i,j));
}
putchar('\n');
}
}
判断对称数组
#include<stdio.h>
#define M 4
#define N 4
typedef int integer;
integer Fun(int a[][4])
{
int i,j;
for(i=0; i<M; i++)
{
for(j=0; j<N; j++)
{
if(a[i][j] != a[j][i])
{
return 0;
}
}
}
return 1;
}
void main()
{
int a[M][N] = {1,3,4,5,3,2,7,9,4,7,1,6,5,9,6,1};
if(Fun(a))
{
printf("是对称数组");
}
else
{
printf("不是对称数组");
}
}
是对称数组
斐波那切数列数组法
#include<stdio.h>
int main()
{
int s[40] = {0,1};
int i;
for(i=0;i<20;i++)
{
printf("%d\t",s[i]);
s[i+2] = s[i] + s[i+1];
if((i+1) % 5 == 0)
putchar('\n');
}
}
0 1 1 2 3
5 8 13 21 34
55 89 144 233 377
610 987 1597 2584 4181
递归输出斐波那契额数列
#include<stdio.h>
int f2(int x)
{
if(x==0)
{
return 0;
}
else if(x==1)
{
return 1;
}
else{
return f2(x-2)+f2(x-1);
}
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("%d\t",f2(i));
}
return 0;
}
两个两个输出
#include<stdio.h>
int main()
{
int i=0,j=1,k;
for(k=0;k<10;k++)
{
printf("%d\t%d\n",i,j);
i+=j;
j+=i;
}
}
删除指定下标的数组元素
硕成大模考的一道题,答案给错了,太坑了
#include<stdio.h>
#define N 5
void fun(int a[], int k, int *n)
{
int *p,* q,*r=a;
if(k<0||k>=N)
{
printf("error!\n");
exit(0);
}
for(p=a,q=a+k;p<a+N;p++)
{
if(p!=q)
{
*r++=*p;
}
else
(*n)--;
}
}
int main()
{
int a[N] ,k ,n=N,*p;
for(p=a;p<a+N;p++)
scanf("%d",p);
scanf("%d",&k);
fun(a,k,&n);
for(p=a ;p<a+n;p++)
printf("%d\t",*p);
}
1 2 3 4 5
2
1 2 4 5
将一个整数插入到已经排好序的数组中,是该数组仍然有序
#include<stdio.h>
int main()
{
int a[10] = {1,2,3,4,6,7};
int x;
scanf("%d",&x);
int i = 0,j;
while(x > a[i])
{
i++;
}
for(j=5 ; j>=i; j--)
a[j+1] = a[j];
if(x>a[5])
{
a[6] = x;
}
else
{
a[i] = x;
}
for(i=0;i<7;i++)
{
printf("%d\t",a[i]);
}
}
0
0 1 2 3 4 6 7
5
1 2 3 4 5 6 7
8
1 2 3 4 6 7 8
删除数组中的重复数字
#include<stdio.h>
int delete(int a[],int n)
{
int i,j,flag = 1,k=0;
printf("数组原来元素为:");
for(i=0;i<n;i++)
{
printf("%6d",a[i]);
}
putchar('\n');
for(i=0;i<n;i++)
{
flag = 1;
j=i;
for(j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
flag = 0;
break;
}
}
if(flag ==1)
{
a[k++] = a[i];
}
}
printf("\n数组删除后的元素为:");
for(i=0;i<k;i++)
{
printf("%6d",a[i]);
}
putchar('\n');
for(i=k;i<n;i++)
{
a[i]=0;
}
return k;
}
int main()
{
int a[] = {1,1,1,2,2,2,3,3,4,5};
printf("删除后有%d个元素",delete(a,10));
return 0;
}
数组原来元素为: 1 1 1 2 2 2 3 3 4 5
数组删除后的元素为: 1 2 3 4 5
删除后有5个元素
方法2
#include<stdio.h>
int f(int a[],int n)
{
int i,j,k=0,num;
printf("\n数组删除前的元素为:");
for(i=0;i<n;i++)
{
printf("%6d",a[i]);
}
putchar('\n');
for(i=0; i<n; i+=num)
{
num = 0;
for(j=0;j<n;j++)
{
if(a[i] == a[j])
num++;
}
a[k++] = a[i];
}
printf("\n数组删除后的元素为:");
for(i=0;i<k;i++)
{
printf("%6d",a[i]);
}
putchar('\n');
return k;
}
void main()
{
int a[10] = {1,1,2,2,2,3,3,4,4,5};
printf("删除后有%d个元素",f(a,10));
}
数组删除前的元素为: 1 1 2 2 2 3 3 4 4 5
数组删除后的元素为: 1 2 3 4 5
删除后有5个元素
方法3
int delete(int *b,int n)
{
int i,num = 0;
for(i=0; i < num ; i++)
{
if(b[i] != b[i+1])
b[num++] = b[i];
}
return num;
}
1 2 3 4 4 5 6 6 6 7
删除前:
1234456667
删除后:
1234567
删除后有7个字符
## 指针程序题
### 指针s所指向的字母数字串只包含数字和字母,编写程序实现如下功能:只保留第一个字母前的数字字符,其余数字字符全部删除。例如:12ab3cd456e → 12abcde
```c
#include<stdio.h>
void Fun2(char *s)
{//123abc12cd1
char *p = s;
while(*s >= '0' && *s <= '9')
{
s++;
}
p = s;
while(*s)
{
if(*s < '0' || *s > '9')
{
*p = *s;
p++;
}
s++;
}
*p = '\0';
// printf("删除数字字符后的字符串为:%s" , p); //p指针已经指向了最后一个元素,所以输出结果为空白。应在主函数中调用输出。
}
int main()
{
char s[32];
scanf("%s",s);
Fun2(s);
printf("删除数字字符后的字符串为:%s" , s);
}
12ab3cd456e
删除数字字符后的字符串为:12abcde
用数组实现。
#include<stdio.h>
void Fun2(char *s)
{//123AB12CD1
int i=0 , j=0;
while(s[i]>='0' && s[i]<='9')
{
i++;
}
j=i;
for(; s[i]; i++)
{
if(s[i]<'0' || s[i]>'9')
{
s[j++] = s[i];
}
}
s[j] = 0;
printf("删除后的字符串为:%s",s); //是下标实现的,所以可以在此处输出。
}
int main()
{
char s[32];
scanf("%s",s);
Fun2(s);
// Fun2("123as321y4ddgf"); //程序不执行,无反应
}
12ab3cd456e
删除后的字符串为:12abcde
统计字符串 中的 子串 出现的次数。例如 “abcabdabe” 中 “ab” 出现次数为 3 ,“abc”出现次数为 1
#include<stdio.h>
int FUN(char s1[],char s2[])
{
char *p1 = s1,*p2 = s2;
char *p3 = NULL;
int num = 0;
while(*p1)
{
p3 = p1;
while(*p2 == *p3)
{
p2++,p3++;
}
if(*p2 == '\0')
{
num++;
}
p2 = &s2[0];
p1++;
}
return num;
}
int main()
{
printf("个数为:%d\n",FUN("abcabdabe","ab")); //个数为:3
printf("个数为:%d\n",FUN("abcabdabe","abc")); //个数为:1
return 0;
}
个数为:3
个数为:1
鞍点
//鞍点
#include<stdio.h>
#define N 4
int main()
{
int i,j,flag=0,t,maxi,maxj,mini,max,min; //定义
int a[N][N] = {1,2,3,4,
1,2,3,4,
9,10,11,12,
13,14,15,16
};
for(i=0; i<N; i++)
{
maxj = 0;
maxi = i;
max = a[i][0];
for(j=0; j<N; j++)
{
if(a[i][j] > max)
{
max = a[i][j];
maxj = j;
maxi = i;
}
}
//产生了单行最大值
mini = i;
for(t=0; t<N; t++)
{
if(a[t][maxj] < max)
{
mini = t;
}
}
//产生了单列最小值
if(mini == maxi)
{
printf("鞍点:%d行%d列:%d\n",maxi,maxj,max);
flag = 1;
}
}
if(!flag)
{
printf("没有鞍点");
}
}
鞍点:0行3列:4
鞍点:1行3列:4
结构体题
1.统计结构体数组中性别(sex)为’M’的变量的个数。
要求:
①数组元素依次赋初值为:{1 , “Andy” , ‘M’ } 、 {2 , “Mike” , ‘F’ } 、 {3 , “Rose” , ‘M’}。
②结构体定义如下:struct Student{int num;char name[30];char sex;};
#include<stdio.h>
struct Student{
int num;
char name[30];
char sex;
};
int Fun(struct Student *s , int n)
{
int num=0;
int i;
for(i=0; i<n; i++)
{
if(s[i].sex == 'M')
{
num++;
}
}
return 3;
}
int main()
{
struct Student s[3] = {
1,"Andy",'M',2,"Mike",'F',3,"Rose",'M'
};
printf("%d",Fun(s , 3));
return 0;
}
3
2.通过函数调用实现:讲结构体数组中的三个元素按num成员进行升序排列。
要求:
①数组元素依次赋初值为:{12,“sunny”,89.1}、{8,“henry”,73.5}、{21,“lucy”,91.7}。
②结构体定义如下:struct s{int num;char name[30];float score;};
写法1:在函数外部 定义 结构体变量并且赋值,参数值为空。
#include<stdio.h>
struct s{
int num;
char name[30];
float score;
}a[3] = {{12,"sunny",89.1} , {8,"henry",73.5} , {21,"lucy",91.7}};
void fun()
{
int i,j;
struct s t;
for(i=0; i<2; i++)
{
for(j=0; j<2-i; j++)
{
if(a[j].num > a[j+1].num)
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int main()
{
int i;
fun();
for(i=0; i<3; i++)
{
printf("%d,%s,%f\n",a[i].num , a[i].name , a[i].score);
}
return 0;
}
8,henry,73.500000
12,sunny,89.099998
21,lucy,91.699997
写法2:在主函数中定义变量,通过参数传递变量值
#include<stdio.h>
struct s{
int num;
char name[30];
float score;
};
void fun(struct s *a , int n)
{
int i,j;
struct s t;
for(i=0; i<n-1; i++)
{
for(j=0; j<n-1-i; j++)
{
if(a[j].num > a[j+1].num)
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int main()
{
struct s a[3] = {{12,"sunny",89.1} , {8,"henry",73.5} , {21,"lucy",91.7}};
int i;
fun(a,3);
for(i=0; i<3; i++)
{
printf("%d,%s,%f\n",a[i].num , a[i].name , a[i].score);
}
return 0;
}
8,henry,73.500000
12,sunny,89.099998
21,lucy,91.699997
3.计算n名学生成绩的平均分并通过函数返回。
要求:
结构体代码如下:
struct StudentScore{double score;};
#include<stdio.h>
struct StudentScore{
double score;
};
double Fun(struct StudentScore *a , int n)
{
int i;
double sum = 0.0;
for(i=0; i<n; i++)
{
sum += a[i].score;
}
return sum/n;
}
int main()
{
struct StudentScore a[100];
int n; //学生数量
int i;
printf("请输入学生数量:");
scanf("%d",&n);
for(i=0; i<n; i++)
{
printf("请输入第%d个学生的成绩:",i+1);
scanf("%lf",&a[i].score);
}
printf("%lf",Fun(a,n));
return 0;
}
请输入学生数量:3
请输入第1个学生的成绩:90
请输入第2个学生的成绩:100.0
请输入第3个学生的成绩:80
90.000000
4.输入三个学生的学号,姓名,分数,输出分最高同学的所有信息。
#include<stdio.h>
int main()
{
struct stu{
int num;
char name[20];
float score;
};
int i;
struct stu a[3] , max;
for(i=0; i<3; i++)
{
printf("第%d个:",i+1);
scanf("%d%s%f",&a[i].num,&a[i].name,&a[i].score);
}
max = a[0]; //结构体变量整体赋值
for(i=1; i<3; i++)
{
if(max.score < a[i].score)
max = a[i]; //结构体变量整体赋值
}
printf("成绩最高的是%d号,%s,%f分",max.num,max.name,max.score);
}
第1个:1 亚历山大 80
第2个:2 牛顿 100
第3个:3 李白 59
成绩最高的是2号,牛顿,100.000000分
4.2用函数
#include<stdio.h>
struct stu{ //struct stu定义 应该放全局。如果在主函数内,那么定义函数会提示没这个类型。
int num;
char name[20];
float score;
};
struct stu Fun(struct stu *a,int n)
{
struct stu max = a[0];
int i;
for(i=1; i<3; i++)
{
if(max.score < a[i].score)
max = a[i]; //结构体变量整体赋值
}
return max;
}
int main()
{
int i;
struct stu a[3] = {
1,"li",70.1,2,"wang",70.5,3,"zhai",70.3
};
struct stu max = Fun(a,3);
printf("成绩最高的是%d号,%s,%f分",max.num,max.name,max.score);
}
成绩最高的是2号,wang,70.500000分
枚举类型三道题
1.枚举类型数据的输入和输出
#include<stdio.h>
enum fruits{
watermelon,peach,strawberry,banana,pineapple,apple
};
int main()
{
char fts[][20] = {"watermelon","peach","strawberry","banana","pineapple","apple"};
enum fruits x;
int k;
scanf("%d",&k);
x=(enum fruits)k;
printf("%s",fts[x]);
}
2
strawberry
5
apple
2.枚举类型数据的关系运算
#include<stdio.h>
enum fruits{
watermelon,peach,strawberry,banana,pineapple,apple
};
int main()
{
enum fruits x;
int k;
scanf("%d",&k);
x=(enum fruits)k;
if(x==peach)
printf("x=%d,peach=%d,x==peach\n",x,peach);
else if(x>peach)
printf("x=%d,peach=%d,x>peach\n",x,peach);
else if(x<peach)
printf("x=%d,peach=%d,x<peach\n",x,peach);
return 0;
}
1
x=1,peach=1,x==peach
2
x=2,peach=1,x>peach
4
x=4,peach=1,x>peach
3.水果拼盘
#include<stdio.h>
enum fruits{
watermelon,peach,strawberry,banana,pineapple,apple
};
int main()
{
char fts[][20] = {"西瓜","桃子","草莓","香蕉","菠萝","苹果"};
enum fruits a,b,c,d;
int k = 0;
for(a = watermelon; a<=apple; a++)
for(b = a+1; b<=apple; b++)
for(c = b+1; b<=apple; c++)
for(d = c+1; b<=apple; d++)
printf("%d:%s %s %s %s\n",++k,fts[a],fts[b],fts[c],fts[d]);
printf("共有%d种水果",k);
}
1:西瓜 桃子 草莓 香蕉
2:西瓜 桃子 草莓 菠萝
3:西瓜 桃子 草莓 苹果
4:西瓜 桃子 香蕉 菠萝
5:西瓜 桃子 香蕉 苹果
6:西瓜 桃子 菠萝 苹果
7:西瓜 草莓 香蕉 菠萝
8:西瓜 草莓 香蕉 苹果
9:西瓜 草莓 菠萝 苹果
10:西瓜 香蕉 菠萝 苹果
11:桃子 草莓 香蕉 菠萝
12:桃子 草莓 香蕉 苹果
13:桃子 草莓 菠萝 苹果
14:桃子 香蕉 菠萝 苹果
15:草莓 香蕉 菠萝 苹果
共有15种水果拼盘
其他
最大公约数递龟实现
#include<stdio.h>
int Fun(int m , int n)
{
int r;
if((r = m % n) == 0)
{
return n;
}
else
{
m = n;
n = r;
return Fun(m , n);
}
}
int main()
{
int m = 18 , n = 12;
int s = m * n;
printf("最大公约数:%d\n最小公倍数:%d",Fun(m,n) , s / Fun(m , n));
}
最大公约数:6
最小公倍数:36
输出100以内的素数
//素数
#include<stdio.h>
int main()
{
int n=100,i,j;
for(i=1; i<100; i++)
{
for(j=2; j<i; j++)
{
if(i%j == 0)
{
break;
}
}
if(i == j)
{
printf("%d\t",i);
}
}
}
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97
公约数穷举法 和 辗转相除法
#include<stdio.h>
int main()
{
int m=36,n=12,i;
for(i=n; i>=1; i--)
{
if(m%i==0&&n%i==0)
break;
}
printf("最大公约数是%d\n最小公倍数是%d\n",i,m*n/i);
}
最大公约数是12
最小公倍数是36
方法2:辗转相除法
辗转相除法终止条件是 余数=0!!!!!!!!!!!!
除数是最小公约数!!!!!!!!!
#include<stdio.h>
int main()
{
int m=12,n=36,r;
int s=m*n;
while(r=m%n)
{
m=n;
n=r;
}
printf("最大公约数是%d\n最小公倍数是%d\n",n,s/n);
}
最大公约数是12
最小公倍数是36
复习函数指针 + 质因数分解
#include<stdio.h>
void nb(int n)
{
int i;
printf("%d = ",n);
for(i=2; n!=i ;i++)
{
if(n % i == 0)
{
printf("%d * ", i );
n /= i;
i--;
}
}
printf("%d\n",n);
}
int main()
{
//定义方法1: 先定义后赋值
// void (*p)(int p); //等价 void (*p)(int); void (*p)(int abc); //不检查形参变量名是否一致
// p = nb; //等价 p = &nb;
//定义方法2:定义同时赋值
void (*p)(int p) = nb;
for(int n=10; n<=20; n++)
{
(*p)(n);
}
}
10 = 2 * 5
11 = 11
12 = 2 * 2 * 3
13 = 13
14 = 2 * 7
15 = 3 * 5
16 = 2 * 2 * 2 * 2
17 = 17
18 = 2 * 3 * 3
19 = 19
20 = 2 * 2 * 5
一元二次方程求根
/*
1.两根不相等,两根相等,虚根
*/
#include<stdio.h>
#include<math.h>
int main()
{
int s=0;
int a,b,c,x1,x2,t;
scanf("%d%d%d",&a,&b,&c);
t = b*b-4*a*c;
if(t < 0 )
{
t = abs(t);
printf("根为:x = %d ± %di\n",-b/2/a , (int)sqrt(t)/ (2*a));
//由于输出格式%d,sqrt()的返回值是double,所以需要强制类型转换,
//才可输出正确结果
}
else if(t > 0)
{
x1 = (-b + sqrt(t)) / (2*a);
x2 = (-b - sqrt(t)) / (2*a);
printf("根为:x1 = %d\nx2 = %d\n",x1,x2);
}
else
{
x1 = -b / 2 / a;
printf("根为:x1 = x2 = %d\n",x1);
}
}
1987年,国际C语言混乱代码大赛
发表时间:2022年3月27日 B站ROCK直播
看到的各位,别报这家机构了,听我一句劝~~~
#include<stdio.h>
#include<stdbool.h>
int main()
{
printf(&true["\021%sck\012\0"], true["have"] + "fro" - 0x60);
//第一层
//背景:历史背景
//1987年,国际C语言混乱代码大赛,获奖作品
//第一层 (宏定义)
printf("true = %d\n",true);
//第二层
printf("%s\n","fro"+1);
//const char *p = "fro";
//printf("%s\n" , p+1);
//第三层
printf("%c\n","have"[1]);
//const char * p = "hava";
//printf("%c\n",p[1]);
//printf("%c\n ,*(p+1);
//第四层
printf("%d\n",(1)["hava"]); //97
//(1)["hava"] 等价于 "hava"[1]
//第五层
printf("%d\n",(1)["hava"] - 0x60); //1 0x60:96
//第六层
printf("%s\n","fro" + (1)["have"] - 0x60);
//第七层
printf("%s\n","fro" + true["have"] - 0x60); //带不带()编译器都能识别
//第八层
printf("%s\n",&"abcde"[1]); //bcde
//在字符串中,任意一个字符的地址,就是一个"子串"
//第九层
printf("%s\n",&true["abcde"]);
//第十层
printf("%s\n",&"?%sck\n"[1]); //%sck\n
//第十一层
printf("%s\n",&"\021%sck\012\0"[1]); //%sck\n
//第十二层
//冲!
//第十三层
printf(&true["\021%sck\012\0"], true["have"] + "fro" - 0x60);
// "%sck\n", "ro"
//rock!
return 0;
}
rock
true = 1
ro
a
97
1
ro
ro
bcde
bcde
%sck
%sck
rock
可变参数:实现多个整数的和,但是参数的个数不确定
//可变参数函数
//题目:定义一个函数,实现多个整数的和,但是参数的个数不确定
/*应用于:
1.某些场合下,参数的个数不确定
2.【主要场合】命令行工具的解析
在嵌入式/物联网中有着广泛的使用
*/
#include<stdio.h>
#include<stdarg.h>
int add(int n , ...) //...表示可变参数
{
int sum = 0;
//可变参数使用,第一步
va_list arglist; //定义一个变量,表示参数列表
//va list实际是一个指针,指向arglist
//可变参数使用,第2不
va_start(arglist , n);
for(int i=0; i<n; i++)
{
sum += va_arg(arglist , int);
}
va_end(arglist);
return sum;
}
int main()
{
int x = add(9, 1,2,3,4,5,6,7,8,9);
printf("sum = %d\n" , x); //45
}
输入一个正整数,以相反的顺序输出该数。 1234 → 4321
方法1:
//逆序输出数字
#include<stdio.h>
int main()
{
int n = 1234;
int i,s=0;
while(n)
{
s = s * 10 + n % 10;
n /= 10;
}
printf("%d",s);
}
4321
方法二:一位一位数字输出
#include<stdio.h>
int main()
{
int n = 1234;
do
{
printf("%d",n%10);
}while(n/=10);
}
从键盘输入一个正整数,求出各位数字之和,各位数字之积,并输出。
#include<stdio.h>
int main()
{
int n = 1234;
int i , s = 0 , mul = 1;
while(n)
{
s += n % 10;
mul *= n % 10;
n /= 10;
}
printf("sum:%d\nmul:%d",s,mul);
}
sum:10
mul:24
数字累加 规律题
这种题在纸上先写写画画,找到规律后就好办了。
1-22+333-4444+……+999999999
方法1:简单
#include<stdio.h>
int main()
{
int i,j=0,t=0,s=0;
int flag=1; //正负号变量
for(i=1;i<=9;i++)
{
t = (t+j) * 10 + i;
j = j * 10 + 1;
s += t * flag;
printf("%d\n",t*flag);
flag = -flag;
}
printf("\n\nsum=%d",s);
}
1
-22
333
-4444
55555
-666666
7777777
-88888888
999999999
sum=918273645
方法2:两个循环
#include<stdio.h>
int main()
{
int i,j,t,s=0;
int flag=1; //正负号变量
for(i=1; i<=9; i++)
{
t = 0;
for(j=1; j<=i; j++)
{
t = t * 10 + i;
}
printf("%d\n",t*flag);
s += t*flag;
flag = -flag;
}
printf("\n\nsum=%d",s);
}
1
-22
333
-4444
55555
-666666
7777777
-88888888
999999999
sum=918273645
二分查找法
#include<stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int l = 0 , r = 10 - 1 , mid;
int n;
printf("请输入要查找的数:");
scanf("%d",&n);
while(l<=r)
{
mid = l + (r - l) / 2; //据说防溢出,不咋懂
if(a[mid] < n)
{
l = mid+1;
}
else if(a[mid] > n)
{
r = mid-1;
}
else if(a[mid] == n)
{
break;
}
}
printf("数%d的下标是:%d",n,mid);
}
请输入要查找的数:5
数5的下标是:4
牛顿迭代法
#include<stdio.h>
#include<math.h>
#define eps 1e-6
int main()
{
float x1,x0,f,f1;
x1 = 1.0;
do
{
x0 = x1;
f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
f1 = (6 * x0 - 8) * x0 + 3;
x1 = x0 - f / f1;
}while(fabs(x1 - x0) > eps);
printf("%6.2f",x1);
return 0;
}
2.00
递归的初级中级高级应用
初级 - 斐波那切数列
int fib(int n)
{
if(n <= 2)
{
return 1;
}
else
{
return fib(n-1) + fib(n-2);
}
}
int main()
{
for(int i=1; i <= 10; i++)
{
printf("%d\t",fib(i));
}
}
1 1 2 3 5 8 13 21 34 55
中级 - 汉诺塔
void hnt(int n,
const char *start , //起始柱
const char *mid , //中间柱
const char *dest) //目标柱
{
if(n == 1 )
{
printf("从%s移动到%s\n",start , dest);
return ;
}
else
{
hnt(n-1 , start , dest , mid); //中间柱变成了目标柱
printf("从%s移动到%s\n",start,dest);
hnt(n-1 , mid , dest , start);
}
}
int main()
{
hnt(3, "A柱","B柱","C柱");
return 0;
}
从A柱移动到C柱
从A柱移动到B柱
从C柱移动到A柱
从A柱移动到C柱
从B柱移动到C柱
从B柱移动到A柱
从C柱移动到B柱
高级 - 排列组合
//高级应用 -
//对于指定的数字,请列出所有的排列组合
//例如:3的排列组合
// 1 2 3 、 1 3 2 、2 1 3 、 2 3 1 、 3 1 2 、 3 2 1
#include<stdio.h>
#define N 3 //可以改变数值
int used[N] = {0}; //0:未被使用 1:已经使用
int data[N] = {0}; //用来存放我们使用的数字
void work(int i) //i表示已经放入了i个数据
{
for(int j = 0; j < N; j++) //对所有的数字搜索一遍
{
//取出一个可以使用的数字
if(used[j] == 0) // = 0:数字j还未被使用
{
//...马上使用数字j
data[i] = j; //
//修改标记
used[j] = 1;
if(i == N-1) //塞满了就打印
{
for(int k=0; k<N; k++)
{
printf("%d ",data[k]+1);
}
putchar('\n');
}
else //没塞满就继续塞
{
work(i + 1);
}
//清理现场
used[j] = 0;
}
}
}
int main()
{
work(0);
}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
数组名作为形参时,可以数组名++
#include<stdio.h>
int func(int a[5],int n)
{
a++; //正常执行
}
int main()
{
int a[5] = {1,2,3,4,5};
//a++; //报错
func(a,5);
printf("%d",0Xffa);
}
原因是:
数组名作为实参,值传递首元素地址;
因数组名作为形参,会转换为指针,指向实参中数组首元素地址,因此形参必须是一个存储地址值的变量,即指针变量。