int u = 32;
int v = 26;
while ( v != 0 ) {
int temp = u % v;
u = v;
v = temp;
}
printf("%d\n", u);
#include
int main()
{
//代码
return 0;
}
int price = 0;
int amount = 100;
int price = 0, amount = 100;
int price = 0;
,这一行定义了一个变量,变量名是price,类型是int,初始值是0scanf里不能有\n
,否则当输入完需要输入的内容后就算按无数回车也必须要再输入一个值才能成功输入,但该值并不会参与程序的运行
const int AMOUT = 100;
printf("%f", ...);
scanf("%lf", ...);
int hour1, minute1;
int hour2, minute2;
scanf("%d %d", &hour1, &minute1);
scanf("%d %d", &hour2, &minute2);
int t1 = hour1 * 60 + minute1;
int t2 = hour2 * 60 + minute2;
int t = t1 - t2;
printf("时间差是%d小时%d分", t / 60, t % 60);
int a = 3;
int c1, c2, c3, c4;
c1 = a++; // a赋值给c1后自身再加1
printf("c1的值是%d,a的值是%d\n", c1, a);
a = 3;
c2 = ++a; // a自身加1后再赋值给c2
printf("c2的值是%d,a的值是%d\n", c2, a);
a = 3;
c3 = a--; // a赋值给c3后自身再减1
printf("c3的值是%d,a的值是%d\n", c3, a);
a = 3;
c4 = --a; // a自身减1后再赋值给c4
printf("c4的值是%d,a的值是%d\n", c4, a);
C语言提供了六个关系运算符:
注意其中有两个字符的运算符:==、>=和<=的两个字符必须紧紧连在一起,中间不能插入空格。
关系运算的结果是一个逻辑值,逻辑值只有两种可能的值:true(真,表示成立)或 false(假,表示不成立)。当两个值的关系符合关系运算符的预期时,关系运算的结果为 true,否则为 false。
当两个值的关系符合运算符的预期时,关系运算的结果为整数1,否则为整数0
printf("%d\n", 5 == 3);
printf("%d\n", 5 != 3);
printf("%d\n", 5 > 3);
printf("%d\n", 5 >= 3);
printf("%d\n", 5 < 3);
printf("%d\n", 5 <= 3);
int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
int max = 0;
if ( a > b )
max = a;
else
max = b;
printf("大的那个是%d\n", max);
int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
int max = b;
if ( a > b )
max = a;
printf("大的那个是%d\n", max);
if( 1<=n<=10 );
可以通过编译,但不表示 n 属于 [1,10]if( n>=1 && n<=10 )
for(a=10;a>0;a--)
for ( int i=1; i<=n; i++ ) {
fact *= i;
}
//等同于
int i = 1;
while ( i<=n ) {
fact *= i;
i++;
}
//导入 stdbool.h 来使用布尔类型,C99 ONLY
#include
#include
//计算n!,n的值在main中定义
int main(void)
{
int n = 10; //计算叠乘数
int sum = 1; //用来存放叠乘的结果
bool flag = false; //叠乘标记
int num = n; //循环次数
while ( !flag ) {
sum = sum * (num--);
//当num=1时结束循环
if ( num == 1 ) {
flag = true;
}
}
printf ("%d的叠乘值为 %d \n", n, sum);
return 0;
}
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | ! a | 真假颠倒 |
&& | 逻辑与 | a && b | 全真才真,一假即假 |
|| | 逻辑或 | a || b | 一真即真,全假才假 |
x ∈ (4, 6)
4 < x < 6
是错误的表达方式,因为x < 4
表示的是一个逻辑值 0 或 1x < 6 && x > 4
x ∈ [4, 6]
同理逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
a == 6 && b == 1
a == 6 && b += 1
,如果左边为假,右边的赋值就不会进行
切记! 不要把赋值包括复合赋值写进逻辑运算表达式
对于 && ,左边是 false 时就不会进行右边
对于 ||,左边是 ture 时就不会进行右边
count = (count > 20) ? count - 10 : count + 10;
i = (3 + 4, 5 + 6)
,i 的值是11 //单一出口,f的值可灵活使用,并且程序修改相对容易,推荐
int f;
if ( x < 0 ) {
f = -1;
} else if ( x == 0 ) {
f = 0;
} else {
f = 2 * x;
}
printf("%d",f);
/**********************************************/
//写死了,不推荐
if ( x < 0 ) {
printf("%d", -1);
} else if ( x == 0 ) {
printf("%d", 0);
} else {
printf("%d", 2 *x);
}
//if-else语句
if ( type == 1 )
printf("你好");
else if ( type == 2 )
printf("早上好");
else if ( type == 3 )
printf("晚上好");
else if ( type == 4 )
printf("再见好");
else
printf("Ahh?What?");
/**********************************************/
//转为switch-case语句(控制语句)
//type的值只能是int类型
switch(type){
case 1:
printf("你好");
case 2:
printf("早上好");
case 3:
printf("晚上好");
case 4:
printf("再见好");
default:
printf("Ahh?What?");
}
switch语句可以看做是一种基于运算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处,分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺利执行下面的case里去,直到遇到 break 或是 switch结束为止
int number;
int sum = 0;
int count = 0;
scanf("%d", &number);
while ( number != -1 ) {
sum += number;
count++;
scanf("%d", &number);
}
printf("%f\n", 1.0 * sum / count);
#include
#include
#include
int main()
{
srand(time(0)); //!!!使用该语句要引入time.h头文件
int number = rand() % 100 + 1; //rand()是C语言标准可函数,得到一个随机数
//x % n 得到的是一个 [0, n-1] 的数
int count = 0;
int a = 0;
printf("这里有一个在1到100之间的正整数\n");
do{
printf("猜一猜这个数:");
scanf("%d", &a);
count++;
if ( a > number ) {
printf("大了\n");
} else if ( a < number ) {
printf("小了\n");
}
}while( a != number );
printf("真腻害,你用了%d次就猜到了答案\n", count);
return 0;
}
int x = 12345;
int digit;
int ret = 0;
while ( x > 0 ) {
digit = x % 10;
//printf("%d", digit);
ret = ret * 10 + digit;
printf("x=%d,digit=%d,ret=%d\n", x, digit, ret);
x /= 10;
}
printf("%d", ret);
/********************************************************************/
int x = 700;
int digit;
//int ret = 0;
while ( x > 0 ) {
digit = x % 10; //每一次循环摘出原数字的最后一位
printf("%d", digit); //每一次循环打印出原数字的最后一位作为新数字第一位的下一位
//ret = ret * 10 + digit;
//printf("x=%d,digit=%d,ret=%d\n", x, digit, ret);
x /= 10;
}
//printf("%d", ret);
int x;
scanf("%d", &x);
int i;
int isPrime = 1;
for ( i = 2 ; i < x ; i++ ) {
if ( x % i == 0 ) {
isPrime = 0;
break;
}
}
if ( isPrime == 1 ) {
printf("是素数\n");
} else {
printf("不是素数\n");
}
int x;
int one, two five;
int exi = 0;
scanf("%d", &x);
for ( one = 1 ; one < x*10 ; one++ ) {
for ( two = 1 ; two < x*10/2 ; two++ ) {
for ( five = 1 ; five < x*10/5 ; five++ ) {
if ( one + two*2 + five*5 == x*10 ) {
printf("可以用%d个一角+%d个两角+%d五角得到%d元\n",
one, two, five, x);
exit = 1;
break;
}
}
if ( exit == 1 ) break;
}
if ( exit == 1 ) break;
}
int x;
int one, two five;
scanf("%d", &x);
for ( one = 1 ; one < x*10 ; one++ ) {
for ( two = 1 ; two < x*10/2 ; two++ ) {
for ( five = 1 ; five < x*10/5 ; five++ ) {
if ( one + two*2 + five*5 == x*10 ) {
printf("可以用%d个一角+%d个两角+%d五角得到%d元\n",
one, two, five, x);
goto out;
}
}
}
}
out:
return 0;
goto语句名声不好,少用
数据可以存放在变量里,每一个变量有一个名字,有一个类型,还有它的生存空间。如果我们需要保存一些相同类型、相似含义、相同生存空间的数据,我们可以用数组来保存这些数据,而不是用很多个独立的变量。数组是长度固定的数据结构,用来存放指定的类型的数据。一个数组里可以有很多个数据,所有的数据的类型都是相同的。
int main(void)
{
int x;
double sum = 0;
int cnt = 0;
int number[100]; //定义数组 //危险的定义方法,输入可能超过100
//解决方法:令cnt不能超过100 或 用变量(C99 ONLY)
scanf("%d", &x);
while ( x != -1 ) {
number[cnt] = x; //给数组赋值
sum += x;
cnt++;
scanf("%d", &x);
}
if ( cnt > 0 ) {
printf("%.2f\n", sum / cnt);
int i;
for ( i = 0; i < cnt; i++ ) {
if ( number[i] > (sum / cnt )) { //遍历数组中的元素
printf("%d\n", number[i]); //使用数组中的元素
}
}
}
return 0;
}
定义数组
数组的下标必须是整数,因此将字符用单引号表示也可以做数组下标,比如:
int a[255];
a['A'] = 1;
容器是现代程序设计当中的一个重要基本概念,现代的编程语言都应该提供某种形式的容器,语言 提供容器的能力 以及 所提供的容器能力 的大小是其评判其综合能力的一个重要指标
数组中的元素在内存中是连续排列的
数组元素可以出现在赋值运算符的左边或右边,在赋值左边叫左值,在右边就叫右值
有效的下标范围
写一个程序,输入数量不确定的 [0, 9] 范围内的整数,统计每个数字出现的次数,输入 -1 表示结束
//用数组做散列计算
int main(void)
{
const int number = 10; //数组的大小
int x;
int count[number]; //定义数组
int i;
for ( i = 0; i < number; i++ ) { //遍历并初始化数组
count[i] = 0;
}
scanf("%d", &x);
while ( x != -1 ) {
if ( x >= 0 && x <= 9 ) {
count[x]++; //数组参与运算
}
scanf("%d", &x);
}
for ( i = 0; i < number; i++ ) {
printf("%d:%d\n", i , count[i]);
}
return 0;
}
//原程序(无自定义函数)
int main()
{
int m, n;
int sum = 0;
int cnt = 0;
int i;
scanf("%d %d", &m, &n);
if ( m = 1 ) {
m = 2;
}
for ( i = m; i <= n; i++) {
int isPrime = 1;
int k;
for ( k = 2; k < i - 1; k++ ) {
if ( i % k == 0 ) {
isPrime = 0;
break;
}
}
if ( isPrime ) {
sum += i;
cnt++;
}
}
printf("%d %d\n", cnt, sum);
return 0;
}
/********************************************************/
//改进程序(有自定义函数)
int isPrime(int i) //判断 i 是不是素数
{
int ret= 1;
int k;
for ( k = 2; k < i - 1; k++ ) {
if ( i % k == 0 ) {
ret = 0;
break;
}
}
return ret;
}
int main()
{
int m, n;
int sum = 0;
int cnt = 0;
int i;
scanf("%d %d", &m, &n);
if ( m = 1 ) {
m = 2;
}
for ( i = m; i <= n; i++ ) {
if ( isPrime(i) ) {
sum += i;
cnt++;
}
}
printf("%d %d\n", cnt, sum);
return 0;
}
函数名(参数值);
void 函数名(参数表)
//单一出口,推荐
int max(int a, int b)
{
int ret;
if ( a > b ) {
ret = a;
} else {
ret = b;
}
return ret;
}
/********************************************************/
//非单一出口,不推荐
int max(int a, int b)
{
if ( a > b ) {
return = a;
} else {
return = b;
}
}
int a = 5, b = 6, c;
c = max(10, 12); //字面量
c = max(a, b); //变量
c = max(c, 23); //字面量和变量
c = max(max(23, 45), a); //函数的返回值
c = max(23 + 45, b); //计算表达式
int a[3][5];
表示一个三行五列的矩阵a[i, j]
中的逗号是一个运算符,和a[i][j]
不是一回事int a[][5] = {
{0, 1, 2, 3, 4,},
{2, 3, 4, 5, 6,},
}//在大括号里给了元素,则为数组的集成初始化
int a[10] = {
[1] = 2, 5, [4] = 3, 6,
}
//将数组输出:0 2 5 0 3 6 0 0 0 0
sizeof(a) / sizeof(a[0])
这句话表示该数组的元素个数,好处是一旦需要修改数组中初始的数据,不需要修改遍历的代码int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,};
int i;
printf("%lu\n", sizeof(a));
printf("%lu\n", sizeof(a[0]));
for ( i = 0; i < sizeof(a) / sizeof(a[0]); i++ ) {
printf("%d\t", a[i]);
}
printf("\n");
//在一组给定的程序中,判断某个数据是否存在
/**
找出key在数组中的位置
@param key 要寻找的数字
@param a 要寻找的数组
@param length 数组a的长度
@return 如果找到,返回其在a中的位置;反之返回-1
*/
int search(int key, int a[], int length)
{
int ret = -1;
int i;
for ( i = 0; i < length; i++ ) {
if ( a[i] == key ) {
ret = i;
break;
}
}
return ret;
}
int main(void)
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,};
int x;
int loc;
printf("请输入一个数字:");
scanf("%d", &x);
loc = search(x, a, sizeof(a) / sizeof(a[0]));
if ( loc != -1) {
printf("%d在第%d个位置上\n", x, loc);
} else {
printf("%d不存在\n", x);
}
return 0;
}
//求素数
int isPrime(int x, int knowPrimes[], int numberOfKnowPrimes)
{
int ret = 1;
int i;
for ( i = 0; i < numberOfKnowPrimes; i++ ) {
if ( x % knowPrimes[i] == 0 ) {
ret = 0;
break;
}
}
return ret;
}
int main(void)
{
const int number = 10;
int prime[number] = {2};
int count = 1;
int i = 3;
{
int i;
printf("\t\t");
for ( i = 0; i < number; i++ ) {
printf("%d\t", i);
}
printf("\n");
}
while ( count < number ) {
if ( isPrime ( i, prime, count ) ) {
prime[count++] = i;
}
{
printf("i=%d \tcnt=%d\t", i, count);//输出的是外面的i
int i;
for ( i = 0; i < number; i++ ) {
printf("%d\t", prime[i]);
}
printf("\n");
}
i++;
}
for ( i = 0; i < number; i++ ) {
printf("%d", prime[i]);
if ( (i + 5) % 5 ) printf("\t");
else printf("\n");
}
return 0;
}
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++ ) {
for ( i = 2; i * x < maxNumber; i++ ) {
isPrime[i * x] = 0;
}
}
for ( i = 2; i < maxNumber; i++ ) {
if ( isPrime[i] ) {
printf("%d\t", i);
}
}
printf("\n");
return 0;
}
int search(int key, int a[], int len)
{
int ret = -1;
for ( int i = 0; i < len; i++ ) {
if( key == a[i] ) {
ret = a[i];
break;
}
}
return ret; //再次强调:单一出口原则
}
//一个变量 只能 承担一个功能,表达一个含义
//len 的值由 sizeof(a) / sizeof(a[0]) 传入
int search(int key, int a[], int len)
{
int left = 0;
int right = len - 1;
while ( ) {
int mid = (left + right) / 2;
if ( a[min] == k ) {
ret = mid;
} else if ( a[min] > k) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return ret;
}
int max(int a[], int len)
{
int maxid = 0;
for ( int i = 1; i < len; i++ ) {
if ( a[i] > a[maxid] ) {
maxid = i;
}
}
return maxid;
}
int main()
{
int a[] = {2,45,6,51,4,25,99,52,32,65,18};
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;
}
void sort(int *a, int left, int right)
{
if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j)/*控制在当组内寻找一遍*/
{
while(i < j && key <= a[j])
/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序)
2,没有符合条件1的,并且i与j的大小没有反转*/
{
j--;/*向前寻找*/
}
a[i] = a[j];
/*找到一个这样的数后就把它赋给前面的被拿走的i的值
(如果第一次循环且key是a[left],那么就是给key)*/
while(i < j && key >= a[i])
/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
{
i++;
}
a[j] = a[i];
}
a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
/*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}
sizeof(int)
;sizeof(i)
;&(a+b)
×&(a++)
×&(++a)
× int i;
int* p = &i;
//p是一个指针,*表示 p 是一个指向int类型的指针,把 i 的地址交给了p
int* p, q;
int *p, q;
//表达的意思同上一行,都表示p是一个指向int类型变量的指针,q是一个int类型的变量
//*p 是一个int,所以 p 是一个指针
void f(int *p); //在函数里面可以通过这个指针访问外面的 i
int main()
{
int i = 0;
f(&i); //在被调用的时候得到了某个变量的地址
}
*p = k + 1;
int k = *p;
sizeof(a) == sizeof(int *)
以下四种函数原型是等价的:
int sum(int *ar, int n);
int sum(int *, int );
int sum(int ar[], int n);
int sum(int [], int );
int a[10]; int *p = a;
无需用&取地址i == &a[0];
int i = 2;
int *p = &i;
printf("*p=%d\n", *p);
printf("p[0]=%d\n", p[0]); //把i当作一个数组
//两者的表示的数值是一样的,都是2
char *str = "hello";
char word[] = "hello";
char line[10] = "hello"
char* s = "hello world";
char s[] = "hello world";
char *str = "hello";
char word[] = "hello";
1、已知:
int a[] = {5, 15, 34, 54, 14, 2, 52, 72};
int *p = &a[5];
则:p[-2]的值是?
2、已知:
int a[] = {0};
int *p = a;
则:以下哪些表达式的结果为真?
3、已知:
int a[] = {5, 15, 34, 54, 14, 2, 52, 72};
int *p = &a[1];
则:p[2]的值是?
char *t = "title";
char *s;
s = t;
char string[8];
scanf("%s", string);
printf("%s", string);
void f(void)
{
char word[8]; //7个有效字符,最后一个为0
char word2[8]; //7个有效字符,最后一个为0
scanf("%7s", word); //最多输入7个字符
scanf("%7s", word2); //最多输入7个字符
printf("%s##%s##\n", word, word2);
}
size_t strlen(const char *s);
int strcmp(const char *s1, const char *s2);
char *strcpy(char *restrict dest, const char *restrict src)