MOOC—翁恺C程序设计入门

MOOC—翁凯C程序设计入门

第一周:程序设计和C语言

1、竖着输出I Love GPLT(每行只能有一个字符或者一个空格):
#include<stdio.h>

int main(){
    
    
    char str[]="I Love GPLT";
    int len=sizeof(str);
    int i;
    char c;
    for(i=0;i<len;i++){
    
    
        printf("%c\n", str[i]);
    }
    return 0;
}
知识点:计算一维数组长度:sizeof(arr)/sizeof(arr[0])
sizeof给出整个数组所占据的内容的大小,单位是字节

第二周:计算

1、输出倒三角图案

在这里插入图片描述

#include<stdio.h>

int main(){
    
    
	int i,j;
	for(i=0;i<4;i++){
    
    
		for(j=0;j<i;j++){
    
    
			printf(" ");
		}
		for(j=4-j;j>0;j--){
    
    
            //注意:最后一个*号不需要加上空格
			if(j!=1){
    
    
                printf("* ");
            }else{
    
    
                printf("*");
            }
		}
        //注意:最后一个*号不需要换行!!!
		if(j!=1){
    
    
            printf("\n");
        }
	}
	return 0;
} 
2、厘米换算英尺英寸

在这里插入图片描述

#include<stdio.h>

int main(){
    
    
    int foot,inch;
	int cm;
	scanf("%d",&cm);//输入以厘米为单位的身高
	foot = cm/30.48;//一厘米为单位的身高/30.48所得的整数部分就是英尺(foot)
	inch = (cm-foot*30.48)/30.48*12;//小数部分乘以12就是英寸(inch)
	printf("%d %d\n",foot,inch);
	return 0;
}
3、是不是太胖了

在这里插入图片描述

#include<stdio.h>

int main(){
    
    
    int cm;
	double gj;
    scanf("%d", &cm);
    gj=((cm-100)*0.9)*2;
    printf("%.1f", gj);//保留小数点后一位
    return 0;
}
4、逆序的三位数

在这里插入图片描述

方法一:
#include<stdio.h>

int main(){
    
    
	int i,a,b,c;
	scanf("%d", &i);
	a=i/100;    // 	712/100=7
	//b=i%100/10;
	b=i/10%10; 	//	712%100/10=12/10=1
	c=i%10;		//	712%10=2
	
	i=c*100+b*10+a;
	printf("%d", i);
	return 0;
} 
方法二:
#include<stdio.h>

int main(){
    
    
	int a;
	scanf("%d", &a);
	int ret=0;
	int digit;
	while(a>0){
    
    
		digit=a%10;
		ret=ret*10+digit;
		printf("a=%d,digit=%d,ret=%d\n", a, digit, ret);
		a/=10;
	}
	printf("%d", ret);
	return 0;
} 

第三周:判断与循环

1、时间换算

在这里插入图片描述

#include<stdio.h>

int main()
{
    
    
	int utc , bjt;
	int hour, minute;
 
	scanf("%d", &bjt);
	//转换获得的bjt变为分开的小时与分钟
	hour = bjt / 100;
	minute = bjt % 100; 
	//通过utc=bjt-8换算,并注意跨日运算 
	int ih = hour - 8;
	if ( ih <0 ) {
    
    
		ih = 24 + ih;
	}
	//将 分开的小时和分钟转换回整数; 
	utc = ih*100+minute; 
	
	printf("%d\n", utc);
	
	return 0;
}
2、分队列

在这里插入图片描述

#include<stdio.h>

//输入一个整数代表个数,
//然后输出所有的奇数,
//空格隔开,最后一个数后面没有空格 
int main(){
    
    
	int n,i;
	scanf("%d", &n);
	for(i=1;i<=n;i++){
    
    
		if(i%2!=0){
    
    
			printf("%d", i);
			if(i!=n){
    
    
				printf(" ");
			}
		}
	}
	return 0;
} 
3、成绩转化
#include<stdio.h>

int main(){
    
    
	int i;
	scanf("%d", &i);
	i/=10;
	switch(i){
    
    
		case 10:
		case 9:
			printf("A\n");
			break;
		case 8:
			printf("B\n");
			break;
		case 7:
			printf("C\n");
			break;
		case 6:
			printf("D\n");
			break;
		default:
			printf("F\n");
			break;
	} 
	return 0;
} 
4、log2X
#include<stdio.h>

int main(){
    
    
	int i;
	int ret=0;
	scanf("%d", &i);
	int t=i;
	while(i>1){
    
    
		i/=2;
		ret++;
	}
	printf("log2 of %d is %d", t, ret);
	return 0;
}
5、算平均数
#include<stdio.h>

int main(){
    
    
	int number,sum=0,count=0;
	scanf("%d", &number);
	while(number!=-1){
    
    
		sum+=number;
		count++;
		scanf("%d", &number);
	}
	printf("%f\n", sum*1.0/count);
	return 0;
} 
6、猜数字
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
    
    
	srand(time(0));
	int number=rand()%100+1;
	int count=0;
	int a=0;
	printf("我已经想好了一个1-100之间的数字\n");
	do{
    
    
		printf("猜猜这个1-100之间的数字\n");
		scanf("%d", &a);
		count++;
		if(a>number){
    
    
			printf("大了\n");
		}else if(a<number){
    
    
			printf("小了\n");
		}
	}while(a!=number);
	printf("你用了%d次猜到了答案\n", count);
	return 0;
}

第四周:进一步的判断与循环

1、奇偶个数

在这里插入图片描述

#include<stdio.h>

int main(){
    
    
	int x;
	int odd=0,event=0;
	scanf("%d", &x);
	while(x!=-1){
    
    
		if(x%2==0){
    
    
			event++;
		}else{
    
    
			odd++;
		}
		scanf("%d", &x);
	}
	printf("%d %d", odd, event);
	return 0;
}
2、数字特征值

在这里插入图片描述

#include <stdio.h>
#include <math.h>
int main(){
    
    
    int num;
    int count=0;
    int a=0;
    int dig=0;
    scanf("%d",&num);
    do{
    
    
        count ++;
        a=num%10;
        if((a+count)%2==0){
    
    
            dig=dig+pow(2,count-1);
        }
        num /=10;
    }while(num>0);
    printf("%d",dig);
    return 0;
}

第五周:循环控制

1、素数判断
#include<stdio.h>

int main(){
    
    
	int a,i;
	int isPrime=1;//是素数 
	scanf("%d", &a);
	for(i=2;i<a;i++){
    
    
		if(a%i==0){
    
    
			isPrime=0;//不是素数
			break; 
		}
	}
	if(isPrime==1){
    
    
		printf("%d是素数", a);
	}else{
    
    
		printf("%d不是素数", a);
	}
	return 0;
} 
2、输出100以内的素数
#include<stdio.h>

int main(){
    
    
	int x; 
	for(x=2;x<100;x++){
    
    
		int i;
		int isPrime=1;//是素数
		for(i=2;i<x;i++){
    
    
			if(x%i==0){
    
    
				isPrime=0;//不是素数
				break; 
			}
		}
		if(isPrime==1){
    
    
			printf("%d\n", x);
		}
	}
	printf("\n");
	return 0;
} 
3、输出前50个素数
#include<stdio.h>

int main(){
    
    
	int x;
	int cnt=0;
	for(x=2;cnt<50;x++){
    
    
		int i;
		int isPrime=1;//是素数
		for(i=2;i<x;i++){
    
    
			if(x%i==0){
    
    
				isPrime=0;//不是素数
				break; 
			}
		}
		if(isPrime==1){
    
    
			printf("第%d个:%d\n", cnt+1, x);
			cnt++;
		}
	}
	printf("\n");
	return 0;
} 
4、

在这里插入图片描述

#include<stdio.h>

int main(){
    
    
	int i,n;
	double sum=0.0;
	double sign=1.0;
	scanf("%d", &n);
	for(i=1;i<=n;i++){
    
    
		sum+=sign/i;
		sign=-sign;
	}
	printf("f(%d)=%f\n", n, sum);
	return 0;
}
5、求最大公约数
方法一:枚举
#include<stdio.h>

int main(){
    
    
	int a,b,i,min,ret;
	scanf("%d %d", &a, &b);
	min=a<b?a:b;
	for(i=1;i<=min;i++){
    
    
		if(a%i==0 && b%i==0){
    
    
			ret=i;
		}
	}
	printf("%d和%d的最大公约数是:%d", a, b, ret);
	return 0;
}
方法二:辗转相除法
/*
辗转相除法: 
1.如果b等于0,计算结束,a就是那个最大公约数;
2.否则,计算a除以b的余数,让a等于b,而b等于那个余数;
3.回到第一不。 
*/
#include<stdio.h>

int main(){
    
    
	int a,b,t;
	scanf("%d %d", &a, &b);
	while(b!=0){
    
    
		t=a%b;
		a=b;
		b=t;
	}
	printf("ret=%d\n", a);
	return 0;
}
6、正序分解整数
末尾没有0
#include<stdio.h>

int main(){
    
    
	int x;
	//scanf("%d", &x);
	x=13425;
	int t=0;
	do{
    
    
		int d=x%10;
		t=t*10+d;
		x/=10;
	}while(x>0);
	printf("x=%d t=%d\n", x, t);
	x=t;
	do{
    
    
		int d=x%10;
		printf("%d", d);
		if(x>9){
    
    
			printf(" ");
		}
		x/=10;
	}while(x>0);
	printf("\n");
	
	return 0;
} 
末尾有0
#include<stdio.h>

int main(){
    
    
	/*
	13425/10000 1
	13425%10000 3425
	10000/10    1000
	
	3425/1000   3
	3425%1000   425
	1000/10     100
	
	425/100     4
	425%100     25
	100/10      10
	
	25/10       2
	25%10       5
	10/10       1
	
	5/1         5
	5%1         0
	1/10        0
	*/
	int x;
	//scanf("%d", &x);
	x=70000;
	int mask=1;
	int t=x;
	while(t>9){
    
    
		t/=10;
		mask*=10;
	}
	printf("x=%d mask=%d\n", x, mask);
	do{
    
    
		int d=x/mask;
		printf("%d", d);
		if(mask>9){
    
    
			printf(" ");
		}
		x%=mask;
		mask/=10;
		//printf("x=%d mask=%d d=%d\n",x, mask, d);
	}while(mask>0);
	printf("\n");
	
	return 0;
} 
7、素数和

在这里插入图片描述

#include<stdio.h> 

int main(){
    
    
	int i,t,count,n,m;
	int isPrime;
	int sum;
	scanf("%d %d", &n, &m);
	i=2;
	count=0;
	sum=0;
	do{
    
    
		isPrime=1;//是素数
		for(t=2;t<=i/2;t++){
    
    
			if(i%t==0){
    
    
				isPrime=0;//不是素数
				break; 
			}
		} 
		if(isPrime==1){
    
    
			count++;
			//printf("i=%d count=%d\n", i, count);
			if(count>=n&&count<=m){
    
    
				sum+=i;
				//printf("sum=%d\n", sum);
			}
		}
		i++;
	}while(count<m);
	//printf("sum=%d", sum);
	printf("%d", sum);
	return 0;
}
8、念整数

在这里插入图片描述

#include<stdio.h>

int main()
{
    
    
    int num;
    int f = 1;
    int t;
    int a;
	scanf("%d",&num);
    if(num < 0)
    {
    
    
        printf("fu ");
        num = -num;
    }
    t = num;
    while(t > 9)
    {
    
    
        t = t / 10;
        f = f * 10;
    }
    do
    {
    
    
        a = num / f;
        switch(a){
    
    
        	case 1:printf("yi ");break;
        	case 2:printf("er ");break;
        	case 3:printf("san ");break;
        	case 4:printf("si ");break;
        	case 5:printf("wu ");break;
        	case 6:printf("liu ");break;
        	case 7:printf("qi ");break;
        	case 8:printf("ba ");break;
        	case 9:printf("jiu ");break;
        	case 0:printf("ling ");break;
        	default:break;
		}
        num = num % f;
        f = f / 10;
    }while(f > 0);
    return 0;
}

第六周:数组与函数

1、如何写一个程序计算用户输入的数字的平均数,并输出所有大于平均数的数
#include<stdio.h>

int main(){
    
    
	int number,sum=0,count=0;
	int arr[100];
	scanf("%d", &number);
	while(number!=-1){
    
    
		arr[count]=number;
		sum+=number;
		count++;
		scanf("%d", &number);
	}
	printf("%f\n", sum*1.0/count);
	if(count>0){
    
    
		int i;
		for(i=0;i<count;i++){
    
    
			if(arr[i]>sum/count){
    
    
				printf("%d\n", arr[i]);
			}
		}
	} 
	return 0;
} 
2、写一个程序,输入数量不确定的 [0,9] 范围内的整数,统计每一种数字出现的次数,输入-1表示结束
#include<stdio.h>

int main(){
    
    
	int x;
	int count[10];
	int i;
	for(i=0;i<10;i++){
    
    
		count[i]=0;
	}
	scanf("%d", &x);
	while(x!=-1){
    
    
		if(x>=0 && x<=9){
    
    
			count[x]++;
		}
		scanf("%d", &x);
	}
	for(i=0;i<10;i++){
    
    
		printf("%d:%d\n", i, count[i]);
	}
	return 0;
}
3、求和:求出1到10、20到30和35到45的三个和
#include<stdio.h>

void sum(int begin,int end){
    
    
	int i;
	int sum=0;
	for(i=begin;i<=end;i++){
    
    
		sum+=i;
	}
	printf("%d到%d的和是%d\n", begin, end, sum);
}

int main(){
    
    
	sum(1,10);
	sum(20,30);
	sum(35,45);
	return 0;
}
4、tic-tac-toe游戏:读入一个3X3的矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示有一个O;程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符X或O,或输出无人获胜
#include <stdio.h>
 
int main()
{
    
    
    const int size = 3;
    int board[size][size];
    int i, j;
    int numOfX1; 
    int numOfO1;
    // 添加两个变量,判断行列的时候,标记列中X和O的个数;
	//判断对角线的时候,标记另一条对角线的X和O的而数量;以便减少循环次数。
    int numOfX2; 
    int numOfO2;
    int result = -1;
 
    // 读入矩阵
    for(i = 0;i < size;i++){
    
    
        for(j=0;j <size;j++){
    
    
            scanf("%d",&board[i][j]);
        }
    }
 
    // 判断行列
    for (i = 0; i < size && result == -1; i++){
    
    
        numOfX1 = numOfO1 = numOfX2 = numOfO2 = 0;
        for (j = 0; j < size; j++){
    
    
            if (board[i][j] == 1){
    
    
                numOfX1++;
            }
            else{
    
    
                numOfO1++;
            }
 
            if (board[j][i] == 1){
    
    
                numOfX2++;
            }
            else{
    
    
                numOfO2++;
            }
        }
 
        if (numOfO1 == size || numOfO2 == size){
    
    
            result = 0;
        }else if (numOfX1 == size || numOfX2 == size)
        {
    
    
            result = 1;
        }
    }
 
    // 判断对角线
    if (result == -1){
    
    
        numOfX1 = numOfO1 = numOfX2 = numOfO2 = 0;
        for (i = 0; i < size && result == -1; i++){
    
    
            if (board[i][i] == 1){
    
    
                numOfX1++;
            }else{
    
    
                numOfO1++;}
            if (board[i][size - i - 1] == 1){
    
    
                numOfX2++;
            }else{
    
    
                numOfO2++;
            }
        }
        if (numOfO1 == size || numOfO2 == size){
    
    
            result = 0;
        }else if (numOfX1 == size || numOfX2 == size){
    
    
            result = 1;
        }
    }
 
    if (result == 0){
    
    
        printf("O方胜\n");
    }
    else if (result == 1){
    
    
        printf("X方胜\n");
    }else{
    
    
        printf("平局\n");
    }
	return 0;
}
5、高精度小数

在这里插入图片描述

#include<stdio.h>

void swap(int, int);
int main() {
    
    
	int a, b;
	scanf("%d/%d", &a, &b);
	printf("0.");
	swap(a, b);
	return 0;
}
void swap(int a, int b)
{
    
    
	int c, i;

	for (i = 0; i < 200; i++) {
    
    
		if (a != 0) {
    
    


			c = a * 10 / b;
			printf("%d", c);
			a = a * 10 % b;
		}

	}
}

第七周:数组运算

1、在一组给定的数据中,如何找出某个数据是否存在?
#include<stdio.h>

int Search(int key,int a[],int length);

int main(){
    
    
	int a[13]={
    
    1,3,4,3,2,43,44,32,3,5,6,54,43};
	{
    
    
		int x;
		int loc;
		scanf("%d", &x);
		loc=Search(x,a,sizeof(a)/sizeof(a[0]));
		if(loc!=-1){
    
    
			printf("%d在第%d个位置上\n", x, loc);
		}else{
    
    
			printf("%d不存在", x);
		}
	}
	return 0;
}

int Search(int key,int a[],int length){
    
    
	int i;
	int ret=-1;
	for(i=0;i<length;i++){
    
    
		if(key==a[i]){
    
    
			ret=i;
			break;
		}
	}
	return ret;
}
2、构造素数表
#include<stdio.h>

int main(){
    
    
	const int maxNumber=25;
	int isPrime[maxNumber];
	int i;
	int x;
	for(i=0;i<maxNumber;i++){
    
    
		isPrime[i]=1;
	}
	for(x=2;x<maxNumber;x++){
    
    
		if(isPrime[x]==1){
    
    
			for(i=2;i*x<maxNumber;i++){
    
    
				isPrime[i*x]=0;
			}
		}
	}
	for(i=2;i<maxNumber;i++){
    
    
		if(isPrime[i]==1){
    
    
			printf("%d\t", i);
		}
	} 
	printf("\n");
	return 0;
}
3、线性搜索:在一个数组中找到某个数的位置(或确认是否存在),基本方法:遍历
#include<stdio.h>

int search(int key,int a[],int len){
    
    
	int ret=-1;
	int i;
	for(i=0;i<len;i++){
    
    
		if(key==a[i]){
    
    
			ret=i;
			break;
		}
	}
	return ret;
}

int main(){
    
    
	int a[]={
    
    1,2,32,4,3,33,43,42,57,8,5};
	int rel=search(7,a,sizeof(a)/sizeof(a[0]));
	printf("%d\n", rel);
	return 0;
}
4、初用结构
#include<stdio.h>

struct{
    
    
	int amount;
	char *name;
}coins[]={
    
    
	{
    
    1,"penny"},
	{
    
    5,"nickel"},
	{
    
    10,"dime"},
	{
    
    25,"quarter"},
	{
    
    50,"half-dollar"},
};

int search(int key,int a[],int len){
    
    
	int ret=-1;
	int i;
	for(i=0;i<len;i++){
    
    
		if(key==a[i]){
    
    
			ret=i;
			break;
		}
	}
	return ret;
}

int main(){
    
    
	//int a[]={1,2,32,4,3,33,43,42,57,8,5};
	//int rel=search(7,a,sizeof(a)/sizeof(a[0]));
	int k=25; 
	for(int i=0;i<sizeof(coins)/sizeof(coins[0]);i++){
    
    
		if(k==coins[i].amount){
    
    
			printf("%s\n", coins[i].name);
			break;
		}
	}
	return 0;
}
5、二分搜索(bug:最后一个找不到)
#include<stdio.h>

int search(int key,int a[],int len){
    
    
	int ret=-1;
	int left=0;
	int right=len-1;
	while(right>left){
    
    
		int mid=(left+right)/2;
		if(a[mid]==key){
    
    
			ret=mid;
			break;
		}else if(a[mid]<key){
    
    
			left=mid+1;
		}else{
    
    
			right=mid-1;
		}
	}
	return ret;
}

int main(){
    
    
	int a[]={
    
    1,3,6,7,9,13,23,43,44,764,1111};
	int k=1111;
	int rel=search(k,a,sizeof(a)/sizeof(a[0]));
	if(rel==-1){
    
    
		printf("未找到");
	}else{
    
    
		printf("%d在第%d个位置", k, rel);
	}
	return 0;
}
6、排序初步(选择排序)
#include<stdio.h>

int max(int a[],int len){
    
    
	int maxid=0;
	for(int i=0;i<len;i++){
    
    
		if(a[maxid]<a[i]){
    
    
			maxid=i;
		}
	}
	return maxid;
}

int main(){
    
    
	int a[]={
    
    5,3,1,23,234,32,2333,34,65,4,32,221};
	int len=sizeof(a)/sizeof(a[0]);
	for(int i=len-1;i>0;i--){
    
    
		int maxid=max(a,i+1);
		int t=a[maxid];
		a[maxid]=a[i];
		a[i]=t;
	}
	for(int i=0;i<len;i++){
    
    
		printf("%d ", a[i]);
	}
	return 0;
}

第八周:指针与字符串

1、单词长度

在这里插入图片描述

#include<stdio.h>
#include<string.h>

int main(){
    
    
	char word[100];
    int  i;
    int n=1;
    do
    {
    
    
        char c='.';
        scanf("%s",word);
        i=(int)strlen(word);
        if(word[i-1]==c)
        {
    
    if(i>1)
            {
    
    
               printf("%d\n",i-1);
            }
             
            n=0;
        }
        else{
    
    
            printf("%d ",i);
        }
    }while(n);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44337241/article/details/111479224