目录
1基本程序搭建(固定格式)
2常量变量、输入输出、数据类型、运算符
3函数(编写逻辑、种类、调用、写法)
4数组
5指针
旨在记录一个非码自学c语言的大一学生的拙劣见解。
学习资料来源(翁恺c语言、黑马程序员、c语言从入门到精通)
1基本程序搭建(固定格式)
2常量变量、输入输出、数据类型、运算符
整数四则运算
#include <stdio.h>
int main(int argc, char** argv) {
int a,b;
scanf("%d %d",&a,&b);
printf("%d + %d = %d\n",a,b,a+b);
printf("%d - %d = %d\n",a,b,a-b);
printf("%d * %d = %d\n",a,b,a*b);
printf("%d / %d = %d",a,b,a/b);
return 0;
}
找零
#include <stdio.h>
int main()
{
int price=0;
printf("找零:");
scanf("%d",&price);
int change=100-price;
printf("%d",change);
return 0;
}
判断语句(if,while,do-while,for,switch-case,if-else,)
if语句
#include <stdio.h>
int main(int argc, char** argv) {
int a,b;
scanf("%d %d",&a,&b);
if (a>b) {
printf("a win\ngood job");
}
else {
printf("b win");
}
printf("\ncongratulations");
return 0;
}
#include <stdio.h>
int main(int argc, char** argv) {
int a;
int b=0;
scanf("%d",&a);
if (a>0) {
b=1;
} else if (a==0) {
b=2;
} else {
b=3;
}
printf("%d",b);
return 0;
}
while语句
#include <stdio.h>
//考虑0等特殊情况;记得初始化;
int main(int argc, char** argv) {
int n=0;
int x;
scanf("%d",&x);
n++;
x/=10;
while (x>0) {
n++;
x/=10;
}
printf("%d",n);
return 0;
}
do-while语句
#include <stdio.h>
//dowhile可以化简一些情况,记住while有;号
int main(int argc, char** argv) {
int n=0;
int x;
scanf("%d",&x);
do {
n++;
x/=10;
} while(x>0);
printf("%d",n);
return 0;
}
for循环
#include <stdio.h>
//for里面的i才是初始值,int后面的不用管,可以初始为2,for和while可以互相转化
int main(int argc, char** argv) {
int n=0;
int i=0;
int a=1;
for( i = 2; i <= n; i++) {
a=a*i;
}
printf("%d",a);
return 0;
}
swith-case语句
#include <stdio.h>
int main(int argc, char** argv) {
//switch后接变量名,case后跟的是变量最后存在形式,b/=10相当于b=b/10
int b=0;
scanf("%d",&b);
b/=10;
switch(b) {
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("no pass");
break;
}
return 0;
}
嵌套循环
#include <stdio.h>
int main(int argc, char** argv) {
int a;
int b;
for(a = 2; a < 100; a++)
{
int i;
int c=1;
for(i = 2; i < a; i++) {
if(a%i==0)
{
c=0;
break;//break跳出循环,continue继续下一轮
}
}
if(c==1)
{
printf("%d ",a);
}
}
printf("\n");
return 0;
}
补充:break&continue
题目:水仙花数
#include <stdio.h>
#include <math.h>//math函数
int main(int argc, char** argv) {
int a,b,c,d,e,f,g;
scanf("%d",&a);
b=pow(10,a);
c=pow(10,a-1);
for(int i = c; i < b-1; i++) {
e=0;
f=i;
while(f>0)
{
d=f%10;
g=pow(d,a);
e=e+g;
f=f/10;//结束一次f就少一位,直到f=0"
}
if (e==i)
{
printf("%d\n",i);
}
}
return 0;
}
/*不用pow的话只能用for循环代替,体会一下n次和n-1次的区别
min=1
for(int i = 1;i < a;i++)
{
min=min*i;
}
max=min*10-1;
sum=1
for(int i = 1;i <=a;i++)
{
sum=sum*d;
}
题目:整数求逆
#include <stdio.h>
int main(int argc, char** argv) {
int a=123;
int b;
int c=0;
while(a>0) {
b=a%10;
c=c*10+b;
a/=10;
}
printf("%d",c);
return 0;
}
函数(编写逻辑、种类、调用、写法)
基本模板
#include<stdio.h>
int sum(int a,int b)
{//函数的引入 ,函数类型要对应好 (需要返回继续使用写类型,不需要 用void)
int sum=a+b;
return sum;
//返回并非输出
}
int main(){
int a=sum(10,20);//接受函数
int b=sum(15,20);
printf("a=%d b=%d\n",a,b);
if(a>b){
printf("a win");
}
else if(a<b){
printf("b win");
}
else{
printf("neither win");
}
return 0;
}
函数的简单应用实例
#include <stdio.h>
int main(int argc, char** argv) {
void swap();
int main()
{
int a=5;
int b=6;
swap(a,b);
{
int a=0;
printf("%d",a)
}
printf("%d%d",a,b);
return 0;
}
}
数组
查找与排序(二分查找、插值查找、分块查找、哈希查找、冒泡排序、选择排序)
#include <stdio.h>
int main() {
int a[] = {7, 5, 4, 8, 2};
int len = sizeof(a) / sizeof(int);
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int c = a[j];
a[j] = a[j + 1];
a[j + 1] = c;
}
}
}
for (int i = 0; i < len; i++) {
printf("%d ", a[i]);
}
return 0;
}
#include <stdio.h>
int main() {
int a[] = {7, 5, 4, 8, 2};
int len = sizeof(a) / sizeof(int);
for (int i = 0; i < len - 1; i++) {
for (int j = i+1; j < len ; j++) {
if (a[i] > a[j]) {
int c = a[i];
a[i] = a[j];
a[j] = c;
}
}
}
for (int i = 0; i < len; i++) {
printf("%d ", a[i]);
}
return 0;
}
数组大小比较
#include <stdio.h>
int main(int argc, char** argv) {
int a;
double b=0;
int c=0;
int number[100];
scanf("%d",&a);
while (a!=-1) {
number[c]=a;
b+=a;
c++;
scanf("%d",&a);
}
printf("%f\n",b/c);
for(int i = 0; i < c; i++) {
if(number[i]>b/c)
{
printf("%d\n",number[i]);
}
}
return 0;
}
//相当于编号,然后按输入顺序排列,
判断出现次数
#include <stdio.h>
int main(void) {
int a,count[10];
for(int i = 0; i < 10; i++) {//初始化数组
count[i]=0;
}
scanf("%d",&a);
while (a!=-1) {
if(a>=0&&a<=10) {
count[a]++;//数组参与运算
}
scanf("%d",&a);
}
for(int i = 0; i < 10; i++) {
printf("%d:%d\n",i,count[i]);//遍历输出(全部)
}
return 0;
}
#include<stdio.h>
int main(void)
{
const int n=10;
int a,i;
int count[n];
for(i=0;i<n;i++){
count[i]=0;
}
scanf("%d",&a);
while (a!=-1){
if (a>=0&&a<=9){
count[a]++;
}
scanf("%d",&a);
}
for (i=0;i<n;i++){
printf("%d:%d\n",i,count[i]);
}
return 0;
}
二维数组
【数组+函数】素数整除
#include <stdio.h>
int main()
{
int number=25;
int isPrime[number];
int i;
int x;
for(i=0;i<number;i++)
{
isPrime[i]=1;
}
for(x=2;x<number;x++){
if (isPrime[x]) {
for (i=2;i*x<number;i++){
isPrime[i*x]=0;
}
}
}
for (i=2;i<number;i++) {
if (isPrime[i]){
printf("%d\t",i);
}
}
printf("\n");
return 0;
}
#include <stdio.h>
int isprime(int x, int a[], int tt);
int main(void) {
const int tt = 50;
int a[50];
int d = 0;
for (d = 0; d < 10; d++) {
a[d] = 2;
}//很重要的初始化,0不能作为被除数,也不会有很精确的报错,反正小垃圾我只能这么总结
int x;
int i = 1;//A[0]已经有了
for (x = 3; i < tt; x++) {
if (isprime(x, a, tt)) {
a[i++] = x;//第一次的时候,A++=1,A=2
}
}
for (i = 0; i < tt; i++) {
printf("%d\t", a[i]);
if ((i + 1) % 5 == 0) {
printf("\n");
}
}
return 0;
}
int isprime(int x, int a[], int tt) {
int ret = 1;
int d = 0;
for (d = 0; d < 10; d++) {
if (x % a[d] == 0) {
ret = 0;//不是素数
break;
}
}
return ret;
}
指针(三个作用、运算、二级多级指针、数组结合、函数结合)
基本模板
#include <stdio.h>
void ;
int main() {
int a=10;
int*p=&a;
*p=100;
printf("%d\n",*p);
return 0;
}
void (){//void处理放return下面
}
二级指针
#include <stdio.h>
int main() {
int a=10;
int b=20;
int*p =&a;
int**pp =&p;
*pp=&b;
printf("%d",**pp);
return 0;
}
【指针+函数】
#include <stdio.h>
void swap(int*p1,int*p2);
int main() {
/*int a=10;
int*p=&a;
*p=100;
printf("%d\n",*p);
*/
int a=1;
int b=2;
printf("%d %d\n",a,b);
swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
void swap(int*p1,int*p2){//void处理放return下面
int c=*p1;
*p1=*p2;
*p2=c;
}
#include<stdio.h> /*包含头文件*/
void swap(void*p1,void*p2,int len);
int main() /*主函数main*/
{
int a=10;
short b=3;
int*p1=&a;
short*p2=&b;
printf("%d\n",*p1);
printf("%d\n",*p2);
int c=100;
int d=200;
swap(&c,&d,4);
printf("%d %d\n",c,d);
/*输出变量c的地址*/
return 0; /*程序结束*/
}
void swap(void*p1,void*p2,int len)
{
char*pc1=p1;
char*pc2=p2;
char temp=0;
for(int i=0;i<len;i++){
temp=*pc1;
*pc1=*pc2;
*pc2=temp;
pc1++;
pc2++;
}
}
【指针+数组】
#include<stdio.h>
int main(){
int arr[]={3,5,7,9};
int len=sizeof(arr)/sizeof(int);
int*p1=arr;
for(int i=0; i<len;i++){
printf("%d",*p1);
}
return 0;
}
#include <stdio.h>
int main() {
int arr1[3]={1,2,3};//3表示二维数组的长度,5表示一维数组的长度
int arr2[5]={1,2,3,4,5};
int arr3[7]={6,7,8,9,0,4,5};
int len1=sizeof(arr1)/sizeof(int);
int len2=sizeof(arr2)/sizeof(int);
int len3=sizeof(arr3)/sizeof(int);
int lenarr[]={len1,len2,len3};//装所有数组的长度
int*arr[3]={arr1,arr2,arr3};//记录内存地址
for(int i=0;i<3;i++){
for(int j=0;j<lenarr[i];j++){
printf("%d",arr[i][j]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main() {
int arr[3][2]={
{1,2},
{3,4},
{5,6}
};
int(*p)[2]=arr;
for(int i=0;i<3;i++){
for(int j=0;j<2;j++){
printf("%d",*(*p+j));
//TODO
}
printf("\n");//TODO
p++;//移动指针,使得遍历到每个数组
}
return 0;
}
#include <stdio.h>
void haha(int arr[],int len,int *max,int*min);
int main() {
int arr[]={1,2,3,4};
int len=sizeof(arr)/sizeof(int);
int max=arr[0];
int min=arr[0];
haha(arr,len,&max,&min);
printf("%d\n",max);
printf("%d\n",min);
return 0;
}
void haha(int arr[],int len,int *max,int*min){//void处理放return下面
*max=arr[0];
for(int i=1;i<len;i++){
if(arr[i]>*max){
*max=arr[i];//TODO
}//TODO
}
*min=arr[0];
for(int i=1;i<len;i++){
if(arr[i]<*min){
*min=arr[i];
}
}
}