C语言程序设计
写在前面的话——点 点赞,关注和收藏吧!!!
狂肝一个周终于结束了!
点 点赞和关注吧!!!
博主在尽力的补代码和思路;
里面包含了自己学习C语言,通过网站的挑战来巩固自己对C的理解;
里面的代码仅供参考,若有错误之处,欢迎提出;
大家也可以跟我一样去通过闯关来理解C的不一样;
C语言挑战网站
第1部分 熟悉C语言程序编辑与调试环境
第1关打印输出 Hello World
思路
这个比较简单,直接打印输出即可。
#include<stdio.h>
int main(void)
{
/********* Begin *********/
printf("Hello World");
/********* End *********/
return 0;
}
第2关:打印输出图形
思路
每一步打印就OK
#include<stdio.h>
int main(void)
{
/********* Begin *********/
printf(" *\n");
printf(" ***\n");
printf(" OK\n");
printf(" Hello!\n");
printf("*********\n");
/********* End *********/
return 0;
}
第3关:求3个数的最大值
思路
直接定义a为最大值,然后通过a,b,c比较找到最大值。
#include<stdio.h>
int main(void)
{
/********* Begin *********/
int a,b,c; //输入三个整数 //每次输入以Enter键结束
scanf("%d,%d,%d",&a,&b,&c); //输入变量
int max=a;
if(max<b) //比较大小
max=b; //把数值大的那一个数
if(max<c) //比较大小
max=c; //把数值大的那一个数
printf("max=%d\n",max); //输出结果
/********* End *********/
return 0;
}
第4关:熟悉C语言调试过程
思路
判断值是否为5是的话直接输出需要的值,不需要就输出另外一个。
#include"stdio.h"
int main(void)
{
/********* Begin *********/
int x;
int y=2,z=3;
scanf("%d",&x);
if(x==y+z)
printf("*****");
else
printf("#####" );
return 0;
/********* End *********/
}
第2部分 顺序结构程序设计
第1关:加法运算
思路
直接定义a+b=c,然后直接输出就c OK。
#include<stdio.h>
int main(void)
{
int a,b,c;
//Please input a,b:
/*********Begin*********/
scanf("%d,%d",&a,&b);
c=a+b;
printf("%d+%d=%d\n",a,b,c);
/*********End**********/
return 0;
}
第2关:不使用第3个变量,实现两个数的对调
思路
输出时直接输出就OK
#include<stdio.h>
int main(void)
{
int a,b;
//Enter a and b:
scanf("%d%d",&a,&b);
printf("a=%d b=%d\n",a,b);
/*********Begin*********/
/*********End**********/
printf("a=%d b=%d\n",b,a);
return 0;
}
第3关:用宏定义常量
思路
利用宏定义来定义P的值,然后直接用宏定义就OK
#include<stdio.h>
#define p 30
int main(void)
{
/*********Begin*********/
int x;
scanf("%d",&x);
printf("%d",x*p);
/*********End**********/
return 0;
}
第4关:数字分离
思路
第一次模输出个位,然后除以10 然后模输出十位,然后/100模输出百位。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a,b,x,c;
scanf("%d",&x);
c=x%10;
b=(x/10)%10;
a=(x/100)%10;
printf("%d %d %d",a,b,c);
/*********End**********/
return 0;
}
第5关:计算总成绩和平均成绩
直接将每个成绩加起来,然后除以同学数,计算平均值。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a,b,c,d,e;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
int sum=0;
double ave=0;
sum=(a+b+c+d+e);
ave=(a+b+c+d+e)/5.00;
printf("%d ",sum);
printf("%.2f",ave);
/*********End**********/
return 0;
}
第6关:求三角形的面积
输入三角形的各个边长,然后用三角形的公式计算出面积。
#include<stdio.h>
#include <math.h>
int main(void)
{
/*********Begin*********/
double a,b,c,s,area;
scanf("%lf %lf %lf",&a,&b,&c);
s=(a+b+c)/2.0;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("%.3f",area);
/*********End**********/
return 0;
}
第7关:立体几何计算题
计算立体几何的面积,周长,表面积,利用所学的公式直接计算输出即可。
#include<stdio.h>
#define PI 3.14
int main(void)
{
/*********Begin*********/
double r,C1,Sb,Vb,h;
scanf("%lf,%lf",&r,&h);
C1=PI*r*2;
Sb=4*PI*r*r;
Vb=h*PI*r*r;
printf("C1=%.2f\n",C1);
printf("Sb=%.2f\n",Sb);
printf("Vb=%.2f\n",Vb);
/*********End**********/
return 0;
}
第8关:计算两个正整数的最大公约数
#include<stdio.h>
int MaxCommonFactor( int a, int b)
{
int c;
if(a<=0||b<=0)
return -1;
while(b!=0)
{
c=a%b;
a=b;
b=c;
}
return a;
}
int main(void)
{
/*********Begin*********/
int a=0,b=0;
int tmp=0;
scanf("%d,%d",&a,&b);
if(a<b){
tmp=b;
b=a;
a=tmp;
}
while(b!=0)
{
tmp=a%b;
a=b;
b=tmp;
}
printf("%d",a);
/*********End**********/
return 0;
}
第3部分 选择结构程序设计
3-1选择结构程序设计
第1关:排序
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a,b,c;
int tmp;
printf("请输入三个整数:");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
tmp=a;
a=b;
b=tmp;
}
if(a>c)
{
tmp=a;
a=c;
c=tmp;
}
if(b>c)
{
tmp=b;
b=c;
c=tmp;
}
printf("从小到大排列为:%d,%d,%d",a,b,c);
/*********End**********/
return 0;
}
第2关:选择结构-闰年判断
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int year;
scanf("%d",&year);
if(year % 4 == 0 && year % 100 != 0)
{
printf("%d 是闰年!",year);
}
else if(year % 400 == 0)
{
printf("%d 是闰年!",year);
}
else printf("%d 不是闰年! ",year);
/*********End**********/
return 0;
}
第3关:选择结构-分段函数问题
#include<stdio.h>
int main(void)
{
/*********Begin*********/
double x;
double y;
scanf("%lf",&x);
if(x < 0 && x != -3)
{
y=x*x+x-6;
}
else if(x >= 0 && x < 10 && x != 2 && x != 3)
{
y=x*x - 5 * x +6;
}
else
{
y=x*x - x -1;
}
printf("%.3f",y);
/*********End**********/
return 0;
}
第4关:学生成绩等级换算
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int Score;
scanf("%d",&Score);
if(Score>=90 && Score <= 100)
{
printf("A");
}
else if(Score < 90 && Score >= 80)
{
printf("B");
}
else if(Score < 80 && Score >= 70)
{
printf("C");
}
else if(Score < 70 && Score >= 60)
{
printf("D");
}
else if(Score < 60 && Score >= 0)
{
printf("E");
}
else printf("Score is error!");
/*********End**********/
return 0;
}
3-2选择结构程序设计进阶
第1关:快递费用计算
#include<stdio.h>
#include <math.h>
int main(void)
{
/*********Begin*********/
int area = 0;
float weight,start_weight,extra_weight,price = 0;
int area_start_money[5] = {10,10,15,15,15}; // 每个区域的起重费用
float area_extra_money[5] = {3,4,5,6.5,10}; // 每个区域的续重费用
// printf("please input area number and weight(eg:0,10.5):\n");
scanf("%d,%f",&area,&weight);
//输入合法性检查
if(area<0 || area>4){
printf("Error in Area\n");
price = 0;
}
else if(weight < 0){
printf("Error in Weight!\n");
price = 0;
}
else{
start_weight = 1;
extra_weight = ceil(weight - 1); //ceil表示向上去整,不足1公斤,按1公斤计算
price = area_start_money[area] + extra_weight * area_extra_money[area];
}
printf("Price: %.2f\n",price);
/*********End**********/
return 0;
}
第2关:计算一元二次方程的根
#include<stdio.h>
#include<math.h>
int main(void)
{
/*********Begin*********/
printf("Please enter the coefficients a,b,c:\n");
double a,b,c,tmp,y,x1,x2;
scanf("%lf,%lf,%lf",&a,&b,&c);
tmp=-(b/(2*a));
y=(b*b - 4*a*c);
if(y<0) printf("error!\n");
else
{
x1=tmp+sqrt(y)/(2*a);
x2=tmp-sqrt(y)/(2*a);
printf("x1=%.4f, x2=%.4f\n",x1,x2);
}
/*********End**********/
return 0;
}
第3关:产品信息格式化
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int Item,Purchase,mm,dd,yy;
double Unit;
printf("Enter item number:\n");
scanf("%d",&Item);
printf("Enter unit price:\n");
scanf("%lf",&Unit);
printf("Enter purchase date (mm/dd/yy):\n");
scanf("%d/%d/%d",&mm,&dd,&yy);
printf("Item Unit Purchase\n");
printf("%-9d$ %-9.2f",Item,Unit,Purchase);
printf("%d%02d%d",mm,dd,yy);
/*********End**********/
return 0;
}
第4部分 循环结构程序设计
4-1循环结构程序设计1
第1关小球自由落体运动
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int N;
double M,sum;
scanf("%lf%d",&M,&N);
sum = M;
for(int i=2;i<=N;i++)
{
M /= 2.0;
sum +=M;
if(i>1)
{
sum += M;
}
if(i == N)
{
M /= 2.0;
}
}
printf("%.2f %.2f",M,sum);
/*********End**********/
return 0;
}
求解出n以内(包含n)所有能被5整除的正整数数的乘积s。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int s=1,n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
if(i % 5 == 0)
{
s *= i;
}
}
printf("%d\n", s);
/*********End**********/
return 0;
}
第3关:最大公约数和最小公倍数
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int x,y,t,z;
scanf("%d%d",&x,&y);
if(x>y)
{
t=x;
x=y;
y=t;
}
for(int i=x;x<y;i--)
{
if(y%i==0 && x%i==0){
printf("最大公约数是:%d\n",i);
break;
}
}
for(int z=y;;z++)
{
if(z % y ==0 && z % x == 0) {
printf("最小公倍数是:%d",z);
break;
}
}
/*********End**********/
return 0;
}
第4关:字符串中各类字符数的统计
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int digit=0,letter=0,space=0,other=0;
char c;
while((c=getchar()) != '\n')
{
if((c >='a' && c <= 'z') || (c <= 'Z' && c >= 'A')){
letter++;
}
else if(c >= '0' && c <= '9'){
digit++;
}
else if(' ' == c){
space++;
}
else
other++;
}
printf("%d %d %d %d",letter,digit,space,other);
/*********End**********/
return 0;
}
第5关:求sn=a+aa+aaa+aaaa+…的值
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a,n,sum=0,Sum=0,add=0;
scanf("%d%d",&a,&n);
for(int i=0,t=1;i<n;i++)
{
sum = a*t;
Sum += sum;
add += Sum;
t =t*10;
}
printf("%d",add);
/*********End**********/
return 0;
}
4-2循环结构程序设计2
第1关:C循环-求平均成绩
#include<stdio.h>
int main(void)
{
/*********Begin*********/
double array,sum=0;
int n;
scanf("%d",&n);
if(n <= 0) printf("the number of students:the scores:average=0.00");
else
{
for(int i=0;i<n;i++)
{
scanf(" %lf",&array);
sum += array;
}
printf("the number of students:the scores:average=%.2f",sum/n);
}
/*********End**********/
return 0;
}
第2关:C循环-求各位数字之积
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n,a,b=1,i;
scanf("%d",&n);
if(n % 10 == 0) printf("0\n");
else {
while(n)
{
i=(int) n / 10;
a= n % 10;
n=i;
b *= a;
}
printf("%d",b);
}
/*********End**********/
return 0;
}
第3关:C循环-求阶乘之和
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n,sum=0,mul=1;
scanf("%d",&n);
if(n == 0) printf("1");
else if(n < 0) printf("0");
else
{
for(int i=1;i <= n;i++)
{
mul *= i;
sum += mul;
}
printf("%d",sum);
}
/*********End**********/
return 0;
}
第4关:C循环-水仙花数
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a,b,c,n;
for(int n=101;n<1000;n++)
{
a = n%10;
b = (n/10) % 10;
c= (n/100) % 10;
if((a*a*a + b*b*b + c*c*c) == n) printf("%d ",n);
}
/*********End**********/
return 0;
}
第5关:C循环-寻找完数
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int m,n,sum;
for(int m=2;m<1000;m++)
{
sum = 1;
for(int n=2;n <= m/2;n++)
{
if(m % n==0) sum += n;
}
if(sum == m) printf("%d\n",m);
}
/*********End**********/
return 0;
}
第6关:分数求和
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int flag = -1;
double sum = 0;
for(int i=1;i<= 100;i++)
{
if(i%2 != 0) sum += (1.0/i);
else sum += flag * (1.0/i);
}
printf("%.3f",sum);
/*********End**********/
return 0;
}
第5部分 函数
5-1函数
第1关求和
#include<stdio.h>
//编写函数
/*********Begin*********/
/*********End**********/
int main(void)
{
/*********Begin*********/
int n,sum;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
sum += i;
}
printf("%d",sum);
/*********End**********/
return 0;
}
第2关:回文数计算
#include<stdio.h>
int solve(int n){
/*********Begin*********/
int i,j=0;
i=n;
while(i)
{
j = j*10 + i%10;
i /= 10;
}
if(j==n) return 1;
else return 0;
}
/*********End**********/
int main(void)
{
for(int i=200;i<=3000;i++)
{
if(solve(i)) printf("%d\n",i);
}
return 0;
}
第3关: 编写函数求表达式的值
#include<stdio.h>
//编写题目要求的函数
/*********Begin*********/
int main(void)
{
/*********Begin*********/
int n;
double sum=0,a=1,b=1;
scanf("%d",&n);
for(int i=0;i<=n;i++)
{
if(i==0 || i==1)
a = 1;
else
a *= i;
b *= (2*i+1);
sum += (double)a/b;
}
printf("%.10f",sum);
/*********End**********/
return 0;
}
第4关:阶乘数列
#include<stdio.h>
//编写函数
/*********Begin*********/
/*********End**********/
int main(void)
{
/*********Begin*********/
int n;
long long sum,a=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
a *= i;
sum += a;
}
printf("%lld",sum);
/*********End**********/
return 0;
}
第5关:亲密数
#include<stdio.h>
void solve(int a){
/*********Begin*********/
int b,n,i;
for(b=0,i=1;i<=a/2;i++)
if(!(a%i))
b=b+i;
for(n=0,i=1;i<=b/2;i++ )
if(!(b%i))
n=n+i;
if(n==a&&a<b)
printf("(%d,%d)",a,b);
/*********End**********/
}
int main(void)
{
for(int a=1;a<3000;a++)
solve(a);
return 0;
}
第6关:公约公倍数
#include<stdio.h>
//编写最大公约数GCD函数
/*********Begin*********/
long long sum;
long long GCD(long long x, long long y)
{
long long i, k, m, n;
sum = 1;
k = x > y ? y : x;
i = 2;
while (i <= k){
m = x % i;
n = y % i;
if (m == 0 && n == 0){
sum *= i;
x /= i;
y /= i;
i = 2;
}
else
i++;
}
return sum;
}
/*********End**********/
//编写最小公倍数LCM函数
/*********Begin*********/
long long LCM(long long p, long long q)
{
long long lc;
lc = p * q / sum;
return lc;
}
/*********End**********/
int main(void)
{
/*********Begin*********/
long long a, b,hcf, lcm;
scanf("%lld %lld", &a, &b);
if(a<0 || b<0 ) printf("Input Error");
else
{
hcf = GCD(a, b); //调用最大公约数函数
lcm = LCM(a, b); //调用最小公倍数函数
printf("%lld %lld\n", hcf, lcm); //输出最大公约数和最小公倍数
}
/*********End**********/
return 0;
}
5-2递归函数、嵌套函数
第1关:递归求阶乘数列
#include<stdio.h>
long long solve(long long n){
/*********Begin*********/
long long alt = 1;
for(int i=1;i<=n;i++){
alt *= i;
}
return alt;
/*********End**********/
}
int main(void)
{
long long n,sum;
scanf("%lld",&n);
long long ans=0;
for(long long i=1;i<=n;i++)
{
ans+=solve(i);
}
printf("%lld", ans);
return 0;
}
第2关:递归实现输出一个整数的逆序
#include<stdio.h>
void solve(int n){
printf("%d", n%10);
/*********Begin*********/
n /= 10;
/*********End**********/
if(n>0) solve(n);
}
int main(void)
{
int n;
scanf("%d",&n);
solve(n);
return 0;
}
第3关:将整数递归转换成字符串
#include<stdio.h>
void solve(int n){
int temp=n%10;
/*********Begin*********/
n /= 10;
if(n>0) solve(n);
/*********End**********/
if(n)
printf(" %d", temp);
else
printf("%d", temp);
}
int main(void)
{
int n;
scanf("%d",&n);
solve(n);
return 0;
}
第4关:递归实现Ackman函数
#include<stdio.h>
int Acm(int m,int n){
int a;
if(m==0&&n>0)
/*********Begin*********/
a = n + 1;
/*********End**********/
else if(n==0&&m>0)
/*********Begin*********/
a=Acm(m-1,1);
/*********End**********/
else
/*********Begin*********/
a=Acm(m-1,Acm(m,n-1));
/*********End**********/
return a;
}
int main(void)
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d", Acm(m,n));
return 0;
}
第6部分 数组
6-1一维数组和二维数组
第1关:排序问题
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int array[10];
for(int i=0;i<10;i++)
scanf("%d",&array[i]);
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(array[i] >array[j])
{
int tmp = array[j];
array[j]=array[i];
array[i]=tmp;
}
}
}
for(int i=0;i<10;i++)
{
printf("%d ",array[i]);
}
/*********End**********/
return 0;
}
第2关:查找整数
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int m,n;
scanf("%d\n",&n);
int array[n];
for(int i=0;i<n;i++)
{
scanf("%d ",&array[i]);
}
scanf("%d\n",&m);
for(int i=0;i<n;i++)
{
if(m == array[i])
{
printf("%d",i+1);
break;
}
if(i+1==n) printf("-1");
}
/*********End**********/
return 0;
}
第三关:计算数组中元素的最大值
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int m=0,n=0;
printf("Input m, n:");
scanf("%d,%d",&m,&n);
int array[m][n];
printf("Input %d*%d array:\n",m,n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&array[i][j]);
}
}
int max = array[0][0],row=1,col=1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(max <array[i][j])
{
max = array[i][j];
row = i+1;
col = j+1;
}
}
}
printf("max=%d, row=%d, col=%d",max,row,col);
/*********End**********/
return 0;
}
6-2字符数组
第1关:字符逆序
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n;
char str[100],C;
scanf("%s",&str);
n = strlen(str);
for(int i=0,j=n-1;i<n/2;i++,j--)
{
C = str[i];
str[i] = str[j];
str[j] = C;
}
printf("%s",str);
/*********End**********/
return 0;
}
第2关:字符统计
#include<stdio.h>
int main(void)
{
/*********Begin*********/
char str[50][50];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",&str[i]);
for(int i=0;i<n;i++)
{
int count=0;
for(int j=0;str[i][j]!='\0';j++){
if(str[i][j]>='0'&&str[i][j]<='9'){
count++;
}
}
printf("%d\n",count);
}
/*********End**********/
return 0;
}
第3关:字符插入
#include <stdio.h>
#include <string.h>
int main(void)
{
/*********Begin*********/
int max,min,i,j;
char a[100],b[100];
gets(a);
gets(b);
int m=strlen(a);
int n=strlen(b);
for(i=0;i<m;i++)
if(a[min] > a[i])
min = i;
for(i=0;i<n;i++)
if(b[max] < b[i])
max = i;
for(j=m+1;j>min;j--)
a[j] = a[j-1];
a[j+1] = b[max];
puts(a);
/*********End**********/
return 0;
}
第4关:字符串处理
#include<stdio.h>
int main(void)
{
/*********Begin*********/
char s1[150],s2[150],s3[150];
int f,m,n,i,j=0,k=0;
gets(s1);
gets(s2);
scanf("%d",&f);
m=strlen(s1);
n=strlen(s2);
for(i=f;i<m;i++)
{
s3[k++]=s1[i];
}
for(i=f;i<n+f+1;i++)
{
s1[i]=s2[j++];
}
strcat(s1,s3);
s1[m+n]='\0';
printf("%s",s1);
/*********End**********/
return 0;
}
第5关:字符串统计
#include<stdio.h>
#include <string.h>
#define N 1024
char s[N + 1], t[N + 1];
int main(void)
{
/*********Begin*********/
fgets(s, N, stdin);
for(;;) {
if(strncmp(s, "stop", 4) == 0 && s[4] == '\n')
break;
int sum = 0, maxlen = 0;
char *p;
p = strtok(s, " \t\n");
while(p) {
int len = strlen(p);
if(len > maxlen) {
maxlen = len;
strcpy(t, p);
}
sum += len;
p = strtok(NULL, " \t\n");
}
printf("%d %s\n", sum, t);
fgets(s, N, stdin);
}
/*********End**********/
return 0;
}
第6关:字符串排序
#include<stdio.h>
#include<string.h>
int main()
{
char a[85],b[85],c[85],t[85];
while(gets(a)!=NULL)
{
gets(b);
gets(c);
if(strcmp(a,b)>0)
{
strcpy(t,a);
strcpy(a,b);
strcpy(b,t);
}
if(strcmp(a,c)>0)
{
strcpy(t,a);
strcpy(a,c);
strcpy(c,t);
}
if(strcmp(b,c)>0)
{
strcpy(t,b);
strcpy(b,c);
strcpy(c,t);
}
puts(a);
puts(b);
puts(c);
}
return 0;
}
第7部分 指针
7-1指针
第1关:用指针法输入12个整数,然后按每行4个数输出
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a[12],n,i;
int *p=a;
for(n=0;n<12;n++)
{
scanf("%d",p++);
}
p=a;
i=1;
for(n=0;n<12;n++){
if((n+1)/4==i){
printf("%d",*p);
}
else {
printf("%d ", *p);
}
p++;
if((n+1)/4==i){
if (i==3){
break;
}
printf("\n");
i++;
}
}
/*********End**********/
return 0;
}
第2关:对输入的两个整数a,b,用指针变量作为函数参数,交换a和b的值。
#include<stdio.h>
/*********Begin*********/
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
/*********Begin*********/
int *p1,*p2;
p1 = &b;
p2 = &a;
printf("%d ",*p1);
printf("%d",*p2);
/*********End**********/
return 0;
}
第3关:报数
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n;
int a[1000];
scanf("%d",&n);
int b = n;
int c = 0;
for (int i = 1; i <= n; i++)
{
a[i] = 1;
}
for (int i = 1;;i++)
{
if (i == (n + 1))
i = 1;
if (a[i] == 1)
{
c++;
}
else
continue;
if (c % 3 == 0)
{
a[i] = 0;
b--;
}
if (b == 1)
break;
}
for (int i = 1; i <= n; i++)
{
if (a[i] == 1)
printf("%d\n", i);
}
/*********End**********/
return 0;
}
第4关:strcmp函数(后续跟进;代码不完整)
#include<stdio.h>
int main(void)
{
char a[110],b[110];
scanf("%s%s",a,b);
if(strcmp(a,b)>0)
printf("%s", a);
else
printf("%s", b);
return 0;
}
7-2指针进阶
第一关:读入n(1 <= n <= 1000)个学生的成绩,成绩都为整数,用指针函数求出若干个学生成绩的最高分。用数组名作为函数参数,指针作为函数返回值。
#include<stdio.h>
/*********Begin*********/
int *Max(int array[], int n){
int max=array[0];
int *p;
for(int i=0;i<n;i++){
if(max<array[i])
max = array[i];
}
p = &max;
return p;
}
/*********End**********/
int main(void)
{
int n,s[110];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
int ans;
/*********Begin*********/
int *p;
p = Max(s,n);
ans = *p;
/*********End**********/
printf("%d",ans );
return 0;
}
第2关:采用指针变量表示地址的方法输入输出数组中的个元素
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n,*p;
scanf("%d",&n);
int array[n];
for(int i=0;i<n;i++){
scanf("%d",&array[i]);
}
p = &array[0];
for(int i=0;i<n;i++){
if(i+1 == n) printf("%d",*(p+i));
else printf("%d ",*(p+i));
}
/*********End**********/
return 0;
}
第3关:用指针实现数组循环移动
#include<stdio.h>
int *solve(int *s,int n,int m){
/*********Begin*********/
/*********End**********/
}
int main(void)
{
int n,m,s[110];
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
int *ans;
/*********Begin*********/
/*********End**********/
for(int i=0;i<n;i++){
if(i==0) printf("%d",*ans++ );
else printf(" %d",*ans++ );
}
return 0;
}
第8部分 结构体
8-1结构体
第1关:结构体变量的初始化和引用
#include<stdio.h>
/*********Begin*********/
struct{
long num;
char name[10];
int score;
}student[2];
int main()
{
for(int i=0;i<2;i++)
{
scanf("%ld %s %d",&student[i].num,&student[i].name,&student[i].score);
}
if(student[0].score>student[1].score)
printf("%ld %s %d",student[0].num,student[0].name,student[0].score);
else printf("%ld %s %d",student[1].num,student[1].name,student[1].score);
return 0;
}
/*********End*********/
第2关:结构体排序
#include<stdio.h>
#include<stdlib.h>//头文件
#define N 200
struct student
{
int num;
char name[20];
int score;
};
int main()
{
struct student stu[N];
struct student t;
int i,j,k,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%s%d\n",&stu[i].num,stu[i].name,&stu[i].score);
}
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(stu[j].score>stu[k].score)
{
k=j;
}
}
t=stu[k];
stu[k]=stu[i];
stu[i]=t;
}
for(i=0;i<n;i++)
{
printf("%d %s %d\n",stu[i].num,stu[i].name,stu[i].score);
}
return 0;
}
第3关:结构体存储数据
#include <stdio.h>
#include <string.h>
struct Person //声明结构体
{
char name[20];
int count;
}leader[3]={"Li",0,"Zhang",0,"Sun",0}; //定义结构体数组并初值化
int main()
{
int i,j,n;
scanf("%d",&n);
char leader_name[20];
for(i=0;i<n;i++)
{
scanf("%s",leader_name);
for(j=0;j<3;j++)
{
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
}
for(i=0;i<3;i++)
{
printf("%s:%d\n",leader[i].name,leader[i].count);
}
return 0;
}
第4关:结构体存储学生信息
#include<stdio.h>
#include<string.h>
int Count;
struct student{
char sno[20],name[20];
int math,english,chinese,sum;
};
void print(struct student stu){
printf("%s %s %d %d %d %d\n",stu.sno,stu.name,stu.math,stu.english,stu.chinese,stu.sum);
}
void query_stu(struct student s[],char *name){
/*********Begin*********/
int i;
for(i = 0;i < Count;i++)
if(strcmp(s[i].name, name) == 0)
{
s[i].sum = s[i].math + s[i].english + s[i].chinese;
print(s[i]);
}
/*********End**********/
}
void delete_stu(struct student s[],char *sno){
/*********Begin*********/
for(int i = 0;i < Count - 1;i++)
if(strlen(s[i].sno) >= strlen(sno))
if(strcmp(s[i].sno, sno) >= 0)
s[i] = s[i + 1];
/*********End**********/
}
/*
或 void delete_stu(struct student s[],char *sno)
{
for(int i = 0;i < Count - 1;i++)
if(strcmp(s[i].sno, sno) == 0)
while(i < Count)
{
s[i] = s[i + 1];
i++;
}
}
*/
void update_stu(struct student s[],char *sno,int math,int english,int chinese){
/*********Begin*********/
for(int i = 0;i < Count;i++)
if(strcmp(s[i].sno, sno) == 0)
{
s[i].math = math;
s[i].english = english;
s[i].chinese = chinese;
s[i].sum = s[i].math + s[i].english + s[i].chinese;
}
/*********End**********/
}
int main(void)
{
int n,q;
struct student students[50];
scanf("%d%d",&n,&q);
Count=n;
for(int i=0;i<n;i++){
/*********Begin*********/
scanf("%s%s%d%d%d",students[i].sno,students[i].name,&students[i].math,&students[i].english,&students[i].chinese);
students[i].sum = students[i].math + students[i].english + students[i].chinese;
/*********End**********/
}
while(q--){
int op;
scanf("%d",&op);
char sno[20],name[20];
if(op==1){
scanf("%s",name);
query_stu(students,name);
}
else if(op==2){
int a,b,c;
scanf("%s%d%d%d",sno,&a,&b,&c);
update_stu(students,sno,a,b,c);
for(int i=0;i<Count;i++)
print(students[i]);
}
else{
scanf("%s",sno);
delete_stu(students,sno);
for(int i=0;i<Count-1;i++)
print(students[i]);
}
}
return 0;
}
第9部分 文件
第1关:HelloWorld
#include<stdio.h>
void solve(){
/********** Begin *********/
FILE *fp = fopen("in.txt","w");
fprintf(fp,"HelloWorld");
fclose(fp);
/********** End **********/
}
第2关:文件读取和写入
#include<stdio.h>
void solve(){
/********** Begin *********/
int a,b,c;
FILE * read = fopen("a.txt","r");
FILE * write = fopen("b.txt","w");
while(fscanf(read,"%d%d%d",&a,&b,&c) != EOF){
fprintf(write,"%d %d %d",a,b,c);
}
fclose(read);
fclose(write);
/********** End **********/
}
第3关:统计文本字母数量
#include<stdio.h>
void solve(){
/********** Begin *********/
int count=0;
char ch;
FILE *fp = fopen("a.txt","r");
while(1)
{
ch=fgetc(fp);
if(ch == EOF) break;
if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
count++;
}
fclose(fp);
printf("%d",count);
/********** End **********/
}
第4关:读取文件中指定学生信息
#include<stdio.h>
void solve(char s[]){
/********** Begin *********/
FILE *fp = fopen("a.txt", "r");
int n;
char line[20], a[100];
for (n = 0; n < 9; n++) {
fgets(line, 12, fp);
fgets(a, 100, fp);
if (strcmp(s, line) == 0) {
printf("%s%s", line, a);
fclose(fp);
break;
}
if (n == 8) {
printf("Not Found!");
}
}
/********** End **********/
}
结尾
博主狂肝一个周,今天终于完成了,在这里,感谢各位遇见,大家有什么想法可以在下面评论或者私信博主,希望博主自己写的对大家有所帮助!!!
最后感谢你的观看,我是北聖,大家也可以去看看博主写的剑指offer题,里面是后期面试可能会问到的算法题,里面也有许多解析思路和归纳。相信大多数看博主的这篇文章都是刚接触C语言或者博主一样重新学习C的,博主也是学C的时候没有认真学习,到现在,慢慢的弥补自己C的漏洞。说一下博主对此的理解,博主之前看小甲鱼的视频理解最深的就是认为语言知识一门工具,重要的是理解其中的思想,所以,大家把C学好了其他语言学起来也是相当快的。
博主下一节准备复习的也是大二学习的数据结构,欢迎大家一起来监督学习。
祝各位小伙伴越来越优秀,越来越好!!!